一、舵机控制原理:
Ⅰ. 定时器TIM3分频: TIM_TimeBaseStructure.TIM_Prescaler = 71;
Ⅱ. PWM周期:20ms(频率50Hz),定时器计数周期值为20000
Ⅲ. PWM占空比范围:2.5%~12.5%,0.5ms~2.5ms
Ⅳ. 在Ⅰ、Ⅱ、Ⅲ条件下舵机转一度对应的值为11,即11 (值/度),换算关系为:Angle0=(0°~45°)*11
Ⅴ. 90°对应值为:20000*7.5%=1500,舵机在区间(90°-45°,90°+45°)转动,90°为相对0°
下图为正负45°,以90°为相对0°
对应关系
0.5ms,0度
1.0ms,45度
1.5ms,90度
2.0ms,135度
2.5ms,180度
二、单舵机控制
将该段代码放在while(1)循环中。
for(i0=1500-Angle0;i0<=1500+Angle0;i0++)
{
if(i0<=1500+Angle0) TIM_SetCompare1(TIM3,i0);
delay_us(500);
}
for(i0=1500+Angle0;i0>=1500-Angle0;i0--)
{
if(i0>=1500-Angle0) TIM_SetCompare1(TIM3,i0);
delay_us(500);
}
三、多路舵机控制程序
将该段代码放在while(1)循环中。
该代码段保证了四舵机相互独立以各自的角度转动而互不干扰。
for(i0=1500-Angle0,i1=1500-Angle1,i2=1500-Angle2,i3=1500-Angle3;(i0<=1500+Angle0) || (i1<=1500+Angle1)||(i2<=1500+Angle2) ||(i3<=1500+Angle3);i0++,i1++,i2++,i3++)
{
//因为四个舵机角度可能不相同,故用四个条件判断
if(i0<=1500+Angle0) TIM_SetCompare1(TIM3,i0);
if(i1<=1500+Angle1) TIM_SetCompare2(TIM3,i1);
if(i2<=1500+Angle2) TIM_SetCompare3(TIM3,i2);
if(i3<=1500+Angle3) TIM_SetCompare4(TIM3,i3);
delay_us(500);
}
for(i0=1500+Angle0,i1=1500+Angle1,i2=1500+Angle2,i3=1500+Angle3;(i0>=1500-Angle0) || (i1>=1500-Angle1) || (i2>=1500-Angle2) || (i3>=1500-Angle3);i0--,i1--,i2--,i3--)
{
//因为四个舵机角度可能不相同,故用四个条件判断
if(i0>=1500-Angle0) TIM_SetCompare1(TIM3,i0);
if(i1>=1500-Angle1) TIM_SetCompare2(TIM3,i1);
if(i2>=1500-Angle2) TIM_SetCompare3(TIM3,i2);
if(i3>=1500-Angle3) TIM_SetCompare4(TIM3,i3);
delay_us(500);
}