
舵机,由于常用于航模中的舵角控制而得名。

其本质是一种伺服电机,根据我们输入的占空比来改变到一定的角度。
控制信号由接收机的通道进入信号调制芯片,获得直流偏置电压。它内部有一个基准电路,产生周期为 20ms,宽度为 1.5ms 的基准信号,将获得的直流偏置电压与电位器的电压比较,获得电压差输出。最后,电压差的正负输出到电机驱动芯片决定电机的正反转。当电机转速一定时,通过级联减速齿轮带动电位器旋转,使得电压差为0,电机停止转动。(自动控制原理狂喜)

因此我们的驱动信号也应该是一个50HZ的信号,脉宽(占空比)为0.5~2.5ms对应着0~180°角度。(不同的舵机需要查看它们的参考手册)
其实是-90~90,因为基准是1.5ms的脉宽。不过为了方便外面统一叫做0~180.

下面我们就利用STM32单片机实现180°舵机控制。
前面几期我们花了很大的时间去介绍了CubeMX中定时器的各个参数配置,这里我们不一一去介绍了。我们设置一个50HZ的PWM模式定时器。

这里选择PB9对应着TIM4的通道四,开启TIM4的通道四,设置为PWM模式。

选这个脚也是由于舵机的三根线分别是控制线,5V电源线以及接地线。正好可以插到最小系统板的上面。
我们设置的50ms的PWM,0.5~2.5ms对应着角度0~180°,也就是1ms对应着90°。
我们设置的计数周期是50000.因此PWM比较值的有效值在500~2500之间。角度每度对应着比较值增加11.1。
因此我们写一个设置角度的函数。
void SetAngle(float Angle)
{
float preAngle = 11.111;//每度对应11.111个脉冲
float Pianyi = 500//500个脉冲为偏移 对应着0.5ms
__HAL_TIM_SET_COMPARE(&htim4,TIM_CHANNEL_4,preAngle*Angle+Pianyi );
//设置比较值
}
这个函数可以根据我们输入的角度值来调节PWM输出的占空比。
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
static int flag = 1;
t = (flag)?++t:--t;
if(t==180|t==0)
{
flag=!flag;
}
SetAngle(t);
HAL_Delay(50);
}
我们利用一个变量t来实现递增递减。
这样子我们就可以实现舵机的正转反转啦。


登录 或 注册 后才可以进行评论哦!
还没有评论,抢个沙发!