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

其本质是一种伺服电机,根据我们输入的占空比来改变到一定的角度。

  控制信号由接收机的通道进入信号调制芯片,获得直流偏置电压。它内部有一个基准电路,产生周期为 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来实现递增递减。

  这样子我们就可以实现舵机的正转反转啦。

嘉立创PCB

还没有评论,抢个沙发!