伺服电机抖动且无法完全转动问题技术求助
伺服电机抖动 + 角度偏移问题解决方案
问题1:静止时持续抖动
抖动核心原因是伺服电机控制脉冲范围与GPIOZERO默认值不匹配,导致电机持续“寻找”正确位置,供电不足会进一步加剧抖动。
解决步骤:
- 调整脉冲宽度参数:不同品牌伺服电机(如SG90、MG996R)的最小/最大脉冲宽度存在差异,GPIOZERO默认的
min_pulse_width=0.0005(500μs)和max_pulse_width=0.0025(2500μs)未必适配你的电机。可尝试修改为更贴合的范围,比如SG90常用400μs到2400μs,MG996R可选450μs到2550μs。 - 单独供电:伺服电机运行时电流需求大,切勿与树莓派共用电源,给电机单独接入5V/2A以上的电源,且电源地需与树莓派地共接。
- 增加到位延迟:设置角度后添加
sleep(0.2),让电机有足够时间到位后再进入下一轮循环。
问题2:角度无法达到指定位置
本质是脉冲范围与电机实际转动角度的映射不匹配,默认的角度范围(-90到90)对应的脉冲宽度偏差,导致实际角度偏移。
解决步骤:
- 单独校准单个电机:先单独测试一个电机(如joint_base),输入不同角度观察实际位置,逐步调整
min_pulse_width和max_pulse_width,直到输入90度时电机准确转到对应位置。
校准测试代码:from gpiozero import AngularServo from time import sleep # 修改脉冲宽度参数测试 joint_base = AngularServo(14, min_angle=-90, max_angle=90, min_pulse_width=0.0004, max_pulse_width=0.0024) while True: angle = int(input("输入测试角度:")) joint_base.angle = angle sleep(0.5) print(f"已设置角度:{angle}") - 同步电机参数:校准好一个电机后,将相同的脉冲参数应用到另一个电机,确保角度映射一致。
修改后的完整代码示例
from gpiozero import AngularServo from time import sleep # 根据校准结果调整脉冲宽度参数 joint_base = AngularServo(14, min_angle=-90, max_angle=90, min_pulse_width=0.0004, max_pulse_width=0.0024) joint_top = AngularServo(15, min_angle=-90, max_angle=90, min_pulse_width=0.0004, max_pulse_width=0.0024) angle_base = 0 angle_top = 0 while True: angle = int(input()) angle_base = angle joint_base.angle = angle_base sleep(0.2) # 给电机到位时间 angle_top = 90 - angle_base joint_top.angle = angle_top sleep(0.2) print(angle, angle_base, angle_top)
额外注意事项
- 手动转动电机必须断电,通电时强行转动可能损坏内部齿轮结构。
- 若调整脉冲宽度后仍有偏差,可微调
min_angle和max_angle,让软件角度范围与电机实际转动范围完全匹配。
内容的提问来源于stack exchange,提问作者Anton Chernyshov
相关产品推荐
相关产品推荐

