You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

伺服电机抖动且无法完全转动问题技术求助

伺服电机抖动 + 角度偏移问题解决方案

问题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)对应的脉冲宽度偏差,导致实际角度偏移。

解决步骤:

  1. 单独校准单个电机:先单独测试一个电机(如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}")
    
  2. 同步电机参数:校准好一个电机后,将相同的脉冲参数应用到另一个电机,确保角度映射一致。

修改后的完整代码示例

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 19:56:13