var 发表于 2021-4-12 01:33

树莓派+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的结果

gentlespider 发表于 2021-4-12 08:36

不明觉厉

塞北的雪 发表于 2021-4-12 08:43

写的很详细,有的时候看别人优化后的代码一头雾水,这个参数哪里来的……
看了LZ的帖子,一下就明白了,感谢

张海洋 发表于 2021-4-12 08:47

lz厉害了

Zhao_rc 发表于 2021-4-12 08:47

degree * 10 / 180 + 2.5   为啥是加2.5 ,前半部分意思不是占90°里面的百分之几吗,按道理最后不应该是乘以一个值吗

无敌VS小嘟嘟 发表于 2021-4-12 09:34

感谢大佬分享

天域至尊 发表于 2021-4-12 09:39

哇,看到自己帖子被引用了,好开心,加油加油,欢迎一起探讨学习{:301_986:}

var 发表于 2021-4-12 19:44

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)

Zhao_rc 发表于 2021-4-14 11:53

var 发表于 2021-4-12 19:44
如果按照-90°~90°这么计算太麻烦,其实在舵机中的-90° 我们就可以理解为0°,90°则是180°

完整的 ...

{:1_893:},受教了

编程新星 发表于 2021-4-14 20:23

这是用什么语言写的
页: [1]
查看完整版本: 树莓派+S90舵机的旋转角度换算成电平宽度PWM的计算方法