** 1 **
** 前言 **
舵机,由于常用于航模中的舵角控制而得名。
其本质是一种伺服电机,根据我们输入的占空比来改变到一定的角度。
控制信号由接收机的通道进入信号调制芯片,获得直流偏置电压。它内部有一个基准电路,产生周期为 20ms,宽度为 1.5ms 的基准信号, **
将获得的直流偏置电压与电位器的电压比较 **
,获得电压差输出。最后,电压差的正负输出到电机驱动芯片决定电机的正反转。当电机转速一定时,通过级联减速齿轮带动电位器旋转, ** 使得电压差为0 **
,电机停止转动。(自动控制原理狂喜)
因此我们的驱动信号也应该是一个50HZ的信号,脉宽(占空比)为0.5~2.5ms对应着0~180°角度。(不同的舵机需要查看它们的参考手册)
其实是-90~90,因为基准是1.5ms的脉宽。不过为了方便外面统一叫做0~180.
下面我们就利用STM32单片机实现180°舵机控制。
** 2 **
** CubeMX设置 **
前面几期我们花了很大的时间去介绍了CubeMX中定时器的各个参数配置,这里我们不一一去介绍了。我们设置一个50HZ的PWM模式定时器。
这里选择PB9对应着TIM4的通道四,开启TIM4的通道四,设置为PWM模式。
选这个脚也是由于舵机的三根线分别是控制线,5V电源线以及接地线。正好可以插到最小系统板的上面。
** 3 **
** 程序实现 **
我们设置的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来实现递增递减。
这样子我们就可以实现舵机的正转反转啦。