Continue to Site

Welcome to EDAboard.com

Welcome to our site! EDAboard.com is an international Electronics Discussion Forum focused on EDA software, circuits, schematics, books, theory, papers, asic, pld, 8051, DSP, Network, RF, Analog Design, PCB, Service Manuals... and a whole lot more! To participate you need to register. Registration is free. Click here to register now.

Need Help for BLDC CLOSED LOOP CONTROL

Status
Not open for further replies.

nitin110051

Newbie level 3
Newbie level 3
Joined
Jul 24, 2013
Messages
3
Helped
0
Reputation
0
Reaction score
0
Trophy points
1
Visit site
Activity points
64
Hi i am using stm32f103 microcroller provide by st microelectronics i want to run a bldc motor of NIDEC in which there is a o/p which tells at how much speed it is running in terms of frequency & having an i/p pwm & duty cylcle of pwm varies speed of motor . i tired but i am not getting a good o/p . code which i am writing is below here can anyone help me to sort out this problem


Code C - [expand]
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_APB 1Periph_TIM3, ENABLE);
 
/* GPIOA and GPIOD clock enable */
 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD|RCC_AP B2Periph_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);
 }
 }
 }
 }

 
Last edited by a moderator:

Hello there,

Please excuse me, Let me clarify .. good output means?? input capture is not giving any output??


Best regards
 

sorry for not claryfying good o/p means result i.e to run bldc in closed loop with this code
 

Status
Not open for further replies.

Similar threads

Part and Inventory Search

Welcome to EDABoard.com

Sponsor

Back
Top