2026年电赛FPGA控制题,队伍用国产安路EG4做多路舵机+编码器闭环,为什么PID一上就抖,是采样周期还是定点位宽的问题?

开放6 回答 121 浏览

我们队今年电赛选了FPGA控制方向,主控用安路EG4,四路舵机加编码器反馈。单独跑PWM和读编码器都正常,但PID一闭环就抖动,调参数也没用。有人说是采样周期和PWM周期没对齐,也有人说是定点运算小数位截断太狠。想问问做过电赛FPGA闭环的学长,这种抖动一般先从哪查?

分享:

6 个回答

  • 编程小匠

    先看采样到执行的整条时序:编码器锁存、PID 计算、PWM 更新是不是同一个节拍,中间有没有跨时钟域或晚一拍。很多「抖」根本不是参数问题,是反馈和输出差了一两个 PWM 周期,相当于相位滞后,越调越振。定点位宽一般不是主因,除非你把积分项截到只剩几位。你们现在 PID 和 PWM 是同一个时钟域吗?

  • 循环初学

    个人感觉先别急着怀疑定点位宽。舵机本身带宽低,20ms周期下小数位截断那点误差基本被机械惯量吃掉了,真因为位宽抖起来,通常得截到很离谱才看得到。更常见的是采样和输出不同步:比如你先读编码器,隔几个时钟才更新PWM,这中间就引入了一个采样周期的纯延迟,闭环里延迟一进,相位裕度直接掉,参数怎么调都压不下去。

    建议做个对照实验:把PID旁路掉,直接给一个固定占空比,看舵机稳不稳、编码器读数抖不抖。稳的话,问题就在闭环时序;还抖,那就先查编码器边沿消抖和电源。然后强制让采样、计算、更新在同一拍完成,或者至少保证固定延迟,再调一次参数,你会明显感觉到不一样。

  • 电子系小白

    先说结论方向:FPGA上做舵机闭环,抖动的第一嫌疑人几乎永远是时序对齐,而不是定点精度,但这两件事值得分开验证,别混着调。

    一个具体做法是先把系统拆成三段独立的环路来测。第一段,PWM单独跑,用示波器或逻辑分析仪看输出脉宽是否稳定,周期是否严格20ms。第二段,编码器单独读,让舵机手动慢慢转,看计数值是否单调、有没有跳变或者丢边沿。这两段都干净了,再去接PID。很多队伍跳过这一步,直接闭环,结果把编码器消抖没做好的毛刺当成了真实反馈,PID当然会疯狂修正。

    第三段才是闭环。这里有个容易被忽略的点:舵机是有机械死区和回程差的,编码器分辨率再高,反馈本身也带量化噪声。如果你的误差项在死区附近来回穿越零点,微分项会被噪声放大,表现出来就是高频抖动。这时可以给误差加一个小死区,或者对反馈做滑动平均,比死抠参数有效。

    定点位宽的风险在于积分饱和和截断偏置。如果你用Q格式,整数位留得太少,积分项容易溢出后反向;小数位留得太少,稳态误差会一直在零附近跳。判断方法很简单:把PID中间量引出来,通过UART或者逻辑分析仪打到PC上看波形,如果误差和输出都在小幅高频震荡,多半是时序或噪声;如果是缓慢爬升然后突然跳一下,那才是位宽或者饱和的问题。

    最后提醒一句,电赛现场电源质量往往很糟,舵机堵转时的电流冲击会通过地线串到编码器和FPGA上,这种抖看起来像控制问题,其实是硬件问题。先拿独立电源给舵机供电试试,能省很多时间。你们的编码器是增量式还是绝对式,这个对消抖策略影响挺大的。

  • 硅农实习生

    先别急着怀疑定点位宽。舵机带宽很低,20ms 周期下几位小数截断那点误差,基本被机械惯量吃掉了,真因为位宽抖起来,得截到很离谱才看得见。你们这种一上 PID 就抖、调参也压不住的,八成是反馈和输出差了节拍。

    可以做个对照实验:把 PID 旁路,直接给固定占空比,看舵机稳不稳、编码器读数抖不抖。稳的话,问题就在闭环时序;还抖,先查编码器消抖和电源。然后强制让采样、计算、更新在同一拍完成,或者至少保证固定延迟,再调一次参数,你会明显感觉到不一样。

    你们现在编码器锁存和 PWM 更新是同一个时钟域吗?

  • Verilog小白学逻辑

    先说结论:电赛现场遇到「PID一上就抖、调参无效」,我第一反应不是定点位宽,而是采样和输出没对齐。你们单独跑PWM和读编码器都正常,这其实已经排除了大半硬件问题——剩下最可疑的就是闭环节拍。FPGA里最容易犯的错是:编码器锁存用一个时钟、PID算完又等一拍、PWM更新再等一拍,中间凑出两三个周期的纯延迟。舵机本身带宽低,20ms周期下延迟一两个周期就足以把相位裕度吃掉,表现出来就是越调越振。定点位宽除非你把积分项截到只剩三四位,否则一般不是主因。建议先做个对照:PID旁路,固定占空比输出,看舵机和编码器读数稳不稳;稳的话问题就在时序。然后强制让采样、计算、更新落在同一拍,再重新调一次参数,手感会明显不一样。你们现在这三段是同一个时钟域吗?

  • 电路板小白

    先给个可能和前面几位不太一样的角度:你们这个抖,我怀疑根子不在PID本身,而在闭环的『时间基准』没定义清楚。

    舵机闭环和电机闭环有个本质区别——舵机内部自带位置环,你外面套的这一圈其实是串级控制的外环,而它接受的PWM是20ms周期的慢信号,内部却是几十微秒级的快环。这意味着你外环的采样周期天然被PWM周期锁死。如果你们的编码器采样不是严格跟PWM更新同相,而是自由跑在比如1ms或者干脆每个时钟都算一次PID,那每一次PWM更新时,控制量对应的反馈其实来自一个『随机相位』的时刻,等效于给系统注入相位噪声。表现出来就是:参数在某个位置能压住,换个位置又抖。

    所以我会建议先把外环频率压下来,别贪快。做法是:用一个20ms的使能脉冲同时触发三件事——锁存编码器、算一次PID、更新PWM占空比寄存器。三者同拍,中间不允许有额外的等待状态。这样你的外环就是一个严格定频的离散系统,相位关系固定,延迟固定,PID参数才有意义。很多队伍一上板就让PID跟着系统时钟跑几百kHz,看着响应快,其实反馈全是旧值重复使用,微分项直接变成噪声放大器。

    至于定点位宽,我的判断是:只要你的误差和积分项没被截到只剩符号位,它一般不是抖动主因。舵机的机械时间常数在几十到上百毫秒量级,几个bit的量化误差进到这么慢的机械环节,会被惯性滤掉。真正因为位宽抖起来,通常是积分项累加溢出了,或者Q格式在小数点位置选错导致正负不对称。这个可以单独验证:把PID输出直接打印到逻辑分析仪或者串口,看数值是不是在目标附近做有规律的极限环振荡,还是完全无规律的跳。前者是位宽/量化,后者是时序/噪声。

    还有一个容易被忽略的点:安路EG4的PWM输出最好走硬件定时器或者专门的计数器通道,别用通用逻辑自己拼比较器。有些队伍图省事用组合逻辑比较计数值和占空比,容易产生毛刺,舵机对脉宽毛刺极其敏感,一个几十纳秒的窄脉冲就能让它抖一下。

    总结一下排查顺序:先确认采样-计算-更新同拍且定频,再确认PWM输出无毛刺,最后才回头抠定点格式。前两步做完,多半参数一调就顺了。你们现在PID的使能是跟系统时钟走,还是有一个固定的周期触发?

登录后可在本页底部提交回答

提问者

Data新手查看主页
浏览「其他」

描述场景与已尝试方案,更容易获得有效解答

相关问题

同分类

提问建议

  • 标题写清核心疑问,避免「求助」「请问」等空泛用语
  • 正文补充环境、版本、报错信息或截图
  • 先搜索本站是否已有相近问题,减少重复提问
  • 若与课程相关,请标明课时或章节便于讲师定位