** 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°舵机可以全角度旋转,控制它的速度和方向。可以看作一个特殊的电机,但是不适合精确角度的控制及。