1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
| #include <stm32f10x.h>
#include<stdio.h>
GPIOSpeed_TypeDef gpio_speed;
GPIOMode_TypeDef gpio_mode;
GPIO_InitTypeDef gpio_init;
TIM_TimeBaseInitTypeDef time_init;
TIM_OCInitTypeDef timer_output_compare;
uint16_t Capture = 0;
volatile uint16_t TIM5Freq = 0;
uint16_t CCR1_Val= 232;
void gpio()
{
//Configure GPIOD Pin 12 as Input
gpio_init.GPIO_Pin = GPIO_Pin_12;
gpio_init.GPIO_Mode = GPIO_Mode_IN_FLOATING;
gpio_init.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOD, &gpio_init);
//Configure GPIOA Pin 6 as pwm o/p
gpio_init.GPIO_Pin = GPIO_Pin_6;
gpio_init.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_Init(GPIOA, &gpio_init);
}
void rcc()
{
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4|RCC_APB1Periph_TIM3, ENABLE);
/* GPIOA and GPIOD clock enable */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD|RCC_APB2Periph_GPIOA |RCC_APB2Periph_AFIO , ENABLE);
}
void timer3 () //PORT A //PIN6
{
time_init.TIM_Period = 400;
time_init.TIM_Prescaler = (uint16_t) (36000000 /4000000) - 1;
time_init.TIM_ClockDivision = 0;
time_init.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM3, &time_init);
/* PWM1 Mode configuration: Channel1 */
timer_output_compare.TIM_OCMode = TIM_OCMode_PWM1;
timer_output_compare.TIM_OutputState = TIM_OutputState_Enable;
timer_output_compare.TIM_Pulse = CCR1_Val;
timer_output_compare.TIM_OCPolarity = TIM_OCPolarity_High;
TIM_OC1Init(TIM3, &timer_output_compare);
TIM_OC1PreloadConfig(TIM3, TIM_OCPreload_Enable);
TIM_ARRPreloadConfig(TIM3, ENABLE);
/* TIM3 enable counter */
TIM_Cmd(TIM3, ENABLE);
}
void timer4 () // for running a free timer to count how many no. of pulse passed in high & low of motor o/p signal to calculate its frequency
{
TIM_TimeBaseStructInit(&time_init);
time_init.TIM_Prescaler =((uint16_t) (36000000 /1000000) - 1);
time_init.TIM_Period =65535;
time_init.TIM_ClockDivision = 0;
time_init.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM4, &time_init);
TIM_Cmd(TIM4, ENABLE);
}
int main()
{
uint16_t tim1,tim2;
uint8_t count1=0;
uint16_t gpiocheck;
rcc();
gpio();
timer3();
timer4();
TIM_OC1Init(TIM3, &timer_output_compare);
while(1)
gpiocheck=GPIOD->IDR & 0X1000;
if((gpiocheck==0X1000)&& count1==0)
{
tim1=TIM4->CNT;
count1=1;
}
else if ((gpiocheck==0X0000)&&count1==1 )
{
tim2 = TIM4->CNT;
if (tim2 > tim1)
{
Capture = (tim2 - tim1);
}
else
Capture = ((0xFFFF - tim1) + tim2);
TIM5Freq = (uint32_t) 1000000 / Capture;
count1=0;
}
if(TIM5Freq<420)
{
volatile uint16_t difference=0;
if(TIM5Freq<440)
difference=(440-TIM5Freq);
else
difference=(TIM5Freq-440);
if(difference>=50)
{ timer_output_compare.TIM_Pulse = 400;
TIM_OC1Init(TIM3, &timer_output_compare);
}
}
}
} |