STM32 多路舵机控制

一、舵机控制原理:

Ⅰ. 定时器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);              
}
  • 11
    点赞
  • 127
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值