吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 4128|回复: 8
收起左侧

[Python 转载] 树莓派+S90舵机的旋转角度换算成电平宽度PWM的计算方法

  [复制链接]
var 发表于 2021-4-12 01:33
本帖最后由 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)

pIYBAFr06jCAJhT5AAA6SGLyZl4185[1].jpg

所谓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的结果

免费评分

参与人数 9吾爱币 +6 热心值 +6 收起 理由
fhz3955 + 1 用心讨论,共获提升!
sdaza + 1 热心回复!
windtrace + 1 谢谢@Thanks!
gq060 + 1 + 1 用心讨论,共获提升!
塞北的雪 + 1 + 1 谢谢@Thanks!
gentlespider + 1 用心讨论,共获提升!
lxhyjr + 1 + 1 谢谢@Thanks!
dutyzqly + 1 用心讨论,共获提升!
ccspace + 1 用心讨论,共获提升!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

gentlespider 发表于 2021-4-12 08:36
不明觉厉
塞北的雪 发表于 2021-4-12 08:43
写的很详细,有的时候看别人优化后的代码一头雾水,这个参数哪里来的……
看了LZ的帖子,一下就明白了,感谢
张海洋 发表于 2021-4-12 08:47
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
哇,看到自己帖子被引用了,好开心,加油加油,欢迎一起探讨学习
 楼主| 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°

完整的 ...

,受教了
编程新星 发表于 2021-4-14 20:23
这是用什么语言写的
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-25 16:41

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表