本帖最后由 var 于 2021-4-12 01:41 编辑
看了前辈发的帖子 树莓派第三课之SG90舵机-万能的舵机 中描述的舵机在PWM的占空比
舵机的频率为50HZ,占空比为2.5%-12.5%,线性对应舵机转动角度的0-180度。
作者说是查阅的了大量的资料和测试做出来,所以针对树莓派,旋转舵机角度和PWM算法则如下:
[Python] 纯文本查看 复制代码 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的结果
|