2015-02-12 9:49 AM
I have some brushless simonk ESC`s driving my brushless motors.
I noticed that these esc`s are woring on a 1 to 2 ms pulse from a 50hz signal. Wich in duty cycle terms means that i must work with dutycycle range from 1% to maximum 2%. Can these 1,2% terms to be translated in a numerical value of 1000-2000 units ? How to set for example 1.5%, some functions do not alow floating numbers inputs I have my pwm initializationGPIO_InitTypeDef GPIO_InitStruct;
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC, ENABLE);
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_6 |GPIO_Pin_7|GPIO_Pin_8|GPIO_Pin_9;
GPIO_InitStruct.GPIO_Mode= GPIO_Mode_AF;
GPIO_InitStruct.GPIO_OType = GPIO_OType_PP;
GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_2MHz;
GPIO_Init(GPIOC, &GPIO_InitStruct);
GPIO_PinAFConfig(GPIOC, GPIO_PinSource6, GPIO_AF_TIM3);
GPIO_PinAFConfig(GPIOC, GPIO_PinSource7, GPIO_AF_TIM3);
GPIO_PinAFConfig(GPIOC, GPIO_PinSource8, GPIO_AF_TIM3);
GPIO_PinAFConfig(GPIOC, GPIO_PinSource9, GPIO_AF_TIM3);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
TIM_BaseStruct.TIM_Prescaler =16000;
TIM_BaseStruct.TIM_CounterMode = TIM_CounterMode_Up;
TIM_BaseStruct.TIM_Period = 100; /* 51Hz PWM */
TIM_BaseStruct.TIM_ClockDivision = TIM_CKD_DIV1;
TIM_BaseStruct.TIM_RepetitionCounter = 0;
TIM_TimeBaseInit(TIM3, &TIM_BaseStruct);
TIM_Cmd(TIM3, ENABLE);
TIM_OCStruct.TIM_OCMode = TIM_OCMode_PWM2;
TIM_OCStruct.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCStruct.TIM_OCPolarity = TIM_OCPolarity_Low;
TIM_OCStruct.TIM_Pulse = 0;
TIM_OC1Init(TIM3, &TIM_OCStruct);
TIM_OC1PreloadConfig(TIM3, TIM_OCPreload_Enable);
TIM_OCStruct.TIM_Pulse = 0;
TIM_OC2Init(TIM3, &TIM_OCStruct);
TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable);
TIM_OCStruct.TIM_Pulse = 0;
TIM_OC3Init(TIM3, &TIM_OCStruct);
TIM_OC3PreloadConfig(TIM3, TIM_OCPreload_Enable);
TIM_OCStruct.TIM_Pulse = 0;
TIM_OC4Init(TIM3, &TIM_OCStruct);
TIM_OC4PreloadConfig(TIM3, TIM_OCPreload_Enable);
And my set dutycycle routine
void set_pwm(uint8_t channel, uint8_t duty){
if(channel==1){
TIM3->CCR1 = duty;
} else if(channel==2){
TIM3->CCR2 = duty;
} else if(channel==3){
TIM3->CCR3 = duty;
}else if(channel==4){
TIM3->CCR4 = duty;
}
}
2015-02-12 12:02 PM
Use bigger numbers? Use scaling? Divide them down after you've done the math?
Note Period and Prescaler numbers are N-1 So instead of having 16000-1 and 100-1, consider 1600-1 and 1000-1, or 160-1 and 10000-1 ? For maximum granularity perhaps 32-1 and 50000-1 for 16-bit timers With a period of 50000 ticks, 2.5% becomes 1250 ticks thereof.2015-02-12 12:05 PM
1.5% -> 750
3.05% -> 1525 Percent * 500, or do all your math with *1000 numbers and divide by two as you put it in CCR registers2015-02-12 12:36 PM
May I express doubt of your report listing a 1 or 2% PWM Duty Cycle? That would be a very narrow pulse - and the range (1%) is (imho) far too narrow to be (recognizable) by most BLDC motors. How ever would you achieve speed control with so limited a PWM range?
Is it possible your measure of 1-2mS pulse widths has over-flowed into your expression of 1-2% PWM Duty Cycle. Far more expected (normal) would be PWM Duty Cycle over the range 3 - 97% Duty Cycle. Pulse Width and Duty Cycle are not the same - although higher duty cycles do result from wider pulse widths. Might you detail ''how'' you arrived @ such low ''duty cycle'' numbers. Clive's methods are fine - but your report of Duty Cycle requirements would be surprising if they are ''real!'' (I strongly suspect they will prove incorrect...)2015-02-12 8:56 PM
Sorry, i mistaken something.... 1 ms is 5% duty, and 2ms is 10% duty out of a total period of 20ms (50hz)
2015-02-13 10:46 AM
Thank you all for the useful tips, ive used 160-1 and 10000-1 for timer3, now i have a much wider range of controling the pwm duty cycle.
Here is a sneak picture of the project itsel, need pwm to continue my work on the PID routines for the motor2015-02-18 8:43 AM
I continue in the belief that (even) your increased duty cycle range of 5-10% proves too narrow for most brushless motor control.
Our small tech firm designs such controllers for ''ISM'' applications - our (normal) duty cycles range from 3 - 98% which yields motor speeds between 300 and 50,000 RPM. I'd expect a much larger duty cycle range than you report. And - our PWM usually - but not always - is set to 20KHz - so as not to be disturbing to (most) humans. 50Hz PWM frequency seems most unusual - as does such small (and limited) duty cycle...2015-02-18 9:16 AM
1-2ms @ 50Hz sounds like a servo...
2015-02-19 9:21 AM
Right, the ESCs here are Electronic Speed Controls designed for connection to a radio control receiver, like RC servos. He's commanding the ESCs, the ESCs are controlling the motors (each with their own dedicated micro driving the windings).
We’re moving the ST Community to a new platform to give you a better and more reliable community experience.