极客秀
搜索

STM32如何驱动SG90舵机(180°伺服舵机)?

** 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来实现递增递减。

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

1.转载请保留原文链接谢谢!
2.本站所有资源文章出自互联网收集整理,本站不参与制作,如果侵犯了您的合法权益,请联系本站我们会及时删除。
3.本站发布资源来源于互联网,可能存在水印或者引流等信息,请用户擦亮眼睛自行鉴别,做一个有主见和判断力的用户。
4.本站资源仅供研究、学习交流之用,若使用商业用途,请购买正版授权,否则产生的一切后果将由下载用户自行承担。
5.联系方式(#替换成@):pm#vimge.com

  相关内容