树莓派+S90舵机的旋转角度换算成电平宽度PWM的计算方法
本帖最后由 var 于 2021-4-12 01:41 编辑看了前辈发的帖子 树莓派第三课之SG90舵机-万能的舵机 中描述的舵机在PWM的占空比
舵机的频率为50HZ,占空比为2.5%-12.5%,线性对应舵机转动角度的0-180度。
作者说是查阅的了大量的资料和测试做出来,所以针对树莓派,旋转舵机角度和PWM算法则如下:
def degree_to_duty_cycle(degree: int) -> float:
if degree >= 0 and degree <= 180:
return degree * 10 / 180 + 2.5
raise Error("out of range")
pwm = GPIO.PWM(13, 50) # 控制第GPIO-13的电平宽度,50Hz
pwm.start(degree_to_duty_cycle(0)) # 归零, 舵机角度0
pwm.ChangeDutyCycle(degree_to_duty_cycle(30)) # 旋转舵机为30度
以上是直接借用的作者的思路得出的代码,下面来聊一下这个2.5% ~ 12.5%到底是怎么得出的
经过查看资料 或者某宝的产品介绍,可以得出下面的结论
1. 电平宽度在0.5ms~2.5ms控制舵机转过不同的角度0-180°,某宝上面写的是500us~2500us,这是时间单位,意思一样
2. 舵机支持的频率是 50Hz
3. 舵机原理是: 由pwm波进入内部电路产生一个偏置电压,触发电机通过减速齿轮带动电位器移动,使电压差为零时,电机停转,从而达到伺服的效果。
看下图:(以下单位都是时长ms)
所谓50Hz, 也就是1s内,舵机会读取信号50次,即1000ms / 50Hz = 20ms取信号端一次(如上图20ms),然后计算这20ms中,实际有电压(即高电平)的时长
根据上图,20ms内仅仅只有0.5ms有电平,即电平宽度为0.5ms / 20ms = 0.025 = 2.5% 对应-90°
20ms内有2.5ms时长电平,即电平宽度为2.5ms / 20ms = 0.125 = 12.5% 对应90°
为了方便计算,我们将-90°人为定义为0°,90°自然就是180°
PWM.ChangeDutyCycle() 可以输入0 - 100,即电平脉冲宽度百分比
所以得到代码,degree * 10 / 180 + 2.5 即可计算出0-180°的电平脉冲宽度
注意: 10 其实是 12.5 - 2.5的结果
不明觉厉 写的很详细,有的时候看别人优化后的代码一头雾水,这个参数哪里来的……
看了LZ的帖子,一下就明白了,感谢 lz厉害了 degree * 10 / 180 + 2.5 为啥是加2.5 ,前半部分意思不是占90°里面的百分之几吗,按道理最后不应该是乘以一个值吗 感谢大佬分享 哇,看到自己帖子被引用了,好开心,加油加油,欢迎一起探讨学习{:301_986:} Zhao_rc 发表于 2021-4-12 08:47
degree * 10 / 180 + 2.5 为啥是加2.5 ,前半部分意思不是占90°里面的百分之几吗,按道理最后不应该是乘 ...
如果按照-90°~90°这么计算太麻烦,其实在舵机中的-90° 我们就可以理解为0°,90°则是180°
完整的算式是:
先计算每1°的电平脉冲宽度 = 12.5% - 2.5% / 180° - 0° = 10% / 180°
如果按照-90°~90°的话 也就是12.5% - 2.5% / 90° - (-90°) = 10% / 180° 一样
现在需要旋转40°,则在起步电平脉冲宽度的基础上,还需要增加的电平脉冲宽度 = 40° * 10% / 180° = 2.22%
已知舵机的起步是2.5% 所以 最终结果 = 2.22% + 2.5%
最终PWM.ChangeDutyCycle(4.72)
var 发表于 2021-4-12 19:44
如果按照-90°~90°这么计算太麻烦,其实在舵机中的-90° 我们就可以理解为0°,90°则是180°
完整的 ...
{:1_893:},受教了 这是用什么语言写的
页:
[1]