极客秀
搜索

STM32如何驱动MG90s舵机(360°伺服舵机)?

** 1 **

** 前言 **

上一期我们介绍了单片机如何驱动180°的舵机。以SG90为例,它利用外部PWM信号与内部信号做比较,利用比较电压的差异来让舵机转动。当舵机转动到一定的角度使得电压差为0,这时候舵机就会停止运动。

利用这种方式,我们就可以实现舵机的特定角度旋转。

但是360°舵机的运动方式和180°舵机驱动方式不同。

大部分360°舵机都是无限位的。而180°电机是有限位的。即180°电机转动到特定位置时会有机械结构限制其运动。

360°电机则可以在一个方向无限制的旋转。

360°电机根据基准脉宽(1.5ms)当脉宽朝2.5ms增加的时候会正向旋转越来越快。

超过2.5ms(超过一点大概0.1ms)的时候则会停止。反之越接近0.5ms则会反转的越来越快。

而1.5ms周围也有死区,大概0.05ms左右,大于这个值电机才会微微转动。

因此其实360度舵机可以看作一个稍微复杂的电机。

** 2 **

** CubeMX配置 **

CubeMX配置不多说,自然是开启一个定时器的PWM通道,我们按照上期配置PB9即TIM4的CHANNEL4

不过在这基础上,本期我们再开启一个定时器。不用做任何基础设置。

仅将分频系数修改为主频数719,每次定时器计数增加的时间都是10us,最大计时655350us即655.35ms。

** 3 **

** 代码实现 **

查阅资料得MG90S的转速为0.11s/60度,1.8ms/°因此我们可以根据这个数据利用开环调节来设置角度:

** 角度 = 转速 * 时间 **

不过由于我们没有限位装置和反馈装置,这是一种误差较大且无法修正的调节。

根据上述定时器的最大定时时间655.35ms,可以计算出角度最大旋转为363°

为其我们编写设置旋转一定角度的代码(仅测试使用,实际情况请选择合适舵机)。


void SetAngle360(float Angle,int Direct){  //已知2500是0.11s/60°即1.8ms/°  int t = 1.8*Angle*100;//转化为微秒  __HAL_TIM_SET_COUNTER(&htim1,0);//清空计数  HAL_TIM_Base_Start(&htim1);//启动定时器  __HAL_TIM_SET_COMPARE(&htim4,TIM_CHANNEL_4,500 + (Direct)*1000);//开启最大速度  // Direct = 1 设置比较值为2500  Direct = 0 设置比较值为0    while(__HAL_TIM_GET_COUNTER(&htim1)<t);//等待时间到  HAL_TIM_Base_Stop(&htim1);  __HAL_TIM_SET_COMPARE(&htim4,TIM_CHANNEL_4,1500);//关闭  //设置比较值}

  while (1)  {    /* USER CODE END WHILE */    /* USER CODE BEGIN 3 */        SetAngle360(180);        HAL_Delay(2000);    }

之后我们设置转动角度为180°来看看测试效果。仅作测试嗷, 大家千万别学 着用,开环控制效果很差。

** 4 **

** 结语 **

和上一期一起,两篇文章分别测试了180°和360°舵机的区别,相信大家也明白了二者的区别也了解了二者各自的应用场合。

180°舵机用于精准的角度输出,但是由于机械结构设置,并不适合用于全角度旋转。

360°舵机可以全角度旋转,控制它的速度和方向。可以看作一个特殊的电机,但是不适合精确角度的控制及。

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

  相关内容