我们队用高云GW1NSR做舵机控制,编码器四倍频后位置反馈进FPGA,PID参数在MATLAB里仿真很稳,上板后舵机一直高频抖动。怀疑是采样周期和PWM更新没对齐,也有人说FPGA里直接用浮点会综合出问题。到底是该改成定点,还是把控制环路放到软核里跑?求做过电赛控制题的过来人指点排查顺序。
2026年电赛控制类赛题,用FPGA做多路舵机+编码器闭环,为什么PID调好了还是抖,是采样周期没对齐还是逻辑用了浮点?
6 个回答

先别急着把锅扣在浮点身上。我在实验室带过几届电赛控制题,FPGA 上舵机抖这件事,八成不是「浮点综合出问题」——高云 GW1NSR 里你写浮点运算,综合器通常是拿 IP 或软逻辑拼出来的,资源吃紧、时序变差是真的,但它表现为延迟大、抖动或者干脆不过时序,而不是「PID 调好还高频抖」这种典型现象。高频抖更像是控制环路和机械/反馈之间出现了相位或谐波问题。
主线的因果链是这样的:舵机是个带减速箱和电位器的机电系统,本身惯性大、带宽低。你的位置环如果采样太快、增益又高,就会把编码器四倍频后的量化噪声和齿槽脉动放大成抖。MATLAB 仿真里你的被控对象是个理想积分或一阶模型,没有量化、没有 PWM 死区、没有减速箱回差,所以仿真稳不代表上板稳。
排查顺序我建议这样走。第一步,先确认抖是控制引起的还是机械/电源引起的:把 PID 输出固定成常量(开环给个中位占空比),看舵机还抖不抖。还抖就是电源纹波、地线、PWM 频率太低或者舵机本身的问题,跟 PID 无关。第二步,如果开环不抖、闭环才抖,就降增益、降采样率试,把位置环采样从每个 PWM 周期一次改成每几个周期一次,看抖动是否消失——这一步基本能验证「采样周期没对齐」的猜想。第三步,检查 PWM 更新和编码器采样的时刻是否在同一拍:常见坑是你在 PWM 计数器归零时更新占空比,但编码器位置是在另一个时刻锁存的,两者差半个周期就相当于引入固定延迟,高增益下必振。把采样、计算、更新都对齐到同一个 PWM 周期边界,用一级寄存器打拍,通常能压下去。
至于要不要搬进软核:除非你的控制算法复杂到需要浮点三角函数或者多轴解耦,否则纯逻辑定点实现完全够,而且延迟确定。电赛控制题对实时性和确定性要求高,软核跑中断会有不可预测的抖动,我不推荐。定点化不是必须的救命稻草,但如果你的浮点确实综合出了长组合路径导致时序违例,那就该改成 Q 格式定点,比如 Q12 或 Q15,乘完右移,一个 DSP 或 LUT 乘法器就搞定。
你们现在编码器四倍频之后的位宽和 PWM 分辨率各是多少?这俩决定了位置环的最小可分辨误差,也直接决定抖动下限。

先说结论:你们这个现象大概率不是浮点的问题,也不是采样周期没对齐这么简单,而是控制环路带宽和舵机机械特性不匹配。我按主线讲一遍因果,你自己对号入座。
舵机这东西本质是个带减速箱的机电系统,惯性大、带宽低,一般位置环带宽也就几十赫兹量级。你在 MATLAB 里仿真「很稳」,是因为被控对象是个干净的一阶或积分模型,没有量化误差、没有齿槽脉动、没有 PWM 死区、没有减速箱回差。上板之后这些东西全进来了。编码器四倍频之后,位置反馈本身带着量化台阶和齿槽引起的周期性扰动,如果采样太快、增益又给得高,这些噪声就被放大成高频抖。这才是「PID 调好还抖」的典型机理。
浮点在 GW1NSR 上确实要小心,但它表现是资源吃紧、延迟变大、时序不过,不是这种规律的高频抖。所以别急着把锅扣在浮点上,先把「抖是控制引起的还是机械/电源引起的」分开。
排查顺序我建议这样:第一步,把 PID 增益一路降到很小,看抖还在不在。如果小增益下不抖了,那就是环路增益和相位问题;如果还在抖,往电源、地线、PWM 频率、舵机供电方向查。第二步,用示波器或者逻辑分析仪抓 PWM 占空比,看它是在稳定值附近小幅波动,还是在几个固定值之间跳。固定值之间跳,多半是定点截断或量化,得看控制量的位宽和舍入方式。第三步,确认采样周期和 PWM 更新是不是同一拍。很多人是编码器采一次、PID 算一次、PWM 下一拍才更新,中间差一拍,相位就变了,等效于给环路加了延迟,增益一高就振。
至于改成定点还是搬软核,我的判断是:定点值得做,因为它可控、延迟确定,但前提是你先把上面的机械和相位问题排掉,否则改完还是抖。软核跑控制环路不是不行,但软核的执行时间抖动比纯逻辑大,对电赛这种要稳的场景,个人不太推荐把位置环放软核,除非你只是想省逻辑资源。
你先做个实验:把控制周期从现在的值放大五倍再跑一遍,看抖是变好还是变差,再回来告诉我这个结果,我能帮你缩范围。

别一上来就怀疑浮点。舵机高频抖,最常见就一个原因:环路增益太高,把编码器量化噪声和齿槽脉动放大了。MATLAB 里对象是理想的,没有量化、没有回差、没有死区,所以仿真稳不代表上板稳。
先做两步验证:把增益降到原来的三分之一,看抖减不减小;再用示波器抓 PWM 占空比,看它在固定几个值之间跳还是小范围波动。前者是环路问题,后者是量化问题。
定点该改就改,但那是第二步。你们现在采样周期和 PWM 更新是同拍的吗?

先说个容易被忽略的角度:你们现在最该确认的不是浮点还是定点,而是「抖」到底发生在哪个环节。舵机抖分两种,一种是控制环路自激,表现为频率较高、幅度稳定、和增益强相关;另一种是机械/供电问题,比如舵机供电纹波大、地线没处理好、编码器和电机共地噪声串进来,表现为幅度忽大忽小、手一碰线就变。这两类的排查路径完全不同。
如果是环路自激,改定点并不能救你,因为量化误差只是噪声源之一,降增益或者加低通滤波才是正解。如果是电源噪声,你把 PID 改成定点、把环路搬进软核,一样抖。所以动手改架构之前,先做一次对照实验:把舵机单独用外部稳压电源供电,控制信号照旧从 FPGA 出,看抖还在不在。这一步能砍掉一半可能性。
至于浮点,我的看法是:GW1NSR 这类小容量 FPGA 上跑浮点 PID,综合出来通常是软核或者拼出来的运算单元,资源占用大、时序余量小,风险确实是延迟不确定,而不是「算法算错」。它更可能让你时序不过或者响应变慢,不太会制造出这种规律的高频抖。所以别把浮点当第一嫌疑人。
真要改,我建议的替代做法是:PID 用定点 Q 格式实现,比如 Q12 或者 Q15,位置误差和积分项分别定标,先保证不溢出再调系数。这个改动量不大,而且对后续上板稳定性有好处。但请把它排在「确认抖的来源」之后。你们现在示波器抓过 PWM 占空比的波形吗,它是在几个固定值之间跳,还是连续小幅波动?这个现象能直接区分环路问题和量化问题。

我按一条主线给你捋,就是「抖动频率」这个信息你还没用起来。
舵机抖,先看它抖的频率大概是多少。如果是几百赫兹到几 k 这种,基本是控制环路带宽太高,把反馈噪声放大了;如果是几十赫兹、跟机械共振或者减速箱齿槽周期对得上,那是机械侧的周期扰动被环路追着跑;如果是随机的、没有固定频率,那更可能是电源纹波或者编码器信号质量问题。这三种对应的处理手段完全不同,盲目改定点或者搬软核都是碰运气。
为什么 MATLAB 仿真稳、上板就抖?因为仿真里的被控对象是个理想模型,没有量化台阶、没有 PWM 死区、没有减速箱回差、没有齿槽脉动,也没有供电波动。这些在真实系统里全都是扰动源。你的位置环如果带宽给得高,就会把这些原本不起眼的东西放大成可见的抖动。所以第一步不是换实现方式,是降增益看抖减不减小——这是最便宜也最有信息量的一次实验。
再说浮点和定点这件事。在 GW1NSR 这种规模上写浮点 PID,综合器一般是用 IP 或者软逻辑凑出来的,代价是资源吃紧、时序余量小、延迟不确定。它的典型症状是时序不过、响应变慢、数据路径打架,而不是「参数调好了还高频抖」。所以把浮点当第一嫌疑人,方向就偏了。真正该担心浮点的地方是:你的采样周期和计算延迟是否稳定,如果浮点运算让每个控制周期的耗时忽长忽短,那确实会引入抖动,但这属于「实时性没保证」,跟数值精度是两码事。
排查顺序我建议这样走:先确认抖是控制引起还是机械/电源引起,用独立电源和手按住舵机臂两种方式快速区分;再确认采样周期和 PWM 更新是不是同拍,如果采样和更新错开半个周期,会引入额外相位滞后,容易自激;然后降增益、加反馈低通,看抖的变化趋势;最后才是考虑定点化或者把环路搬进软核。搬软核这条路,我个人觉得对电赛控制题来说性价比不高,软核跑控制环会引入中断延迟和总线访问抖动,反而更难保证确定性,除非你本来就想用软核做上位机通信和管理。
一个小的工程取舍:定点化值得做,但它的收益主要在资源占用和时序余量上,不在「消除抖动」上。你要是指望改完定点抖就没了,大概率会失望。先把环路带宽和机械特性匹配好,再谈实现方式。你们现在位置环的采样率大概是多少,跟 PWM 载波频率是什么关系?这个数决定了相位滞后有多大。

先别急着把「浮点」当嫌疑人,也别急着搬软核。你们这个现象里,浮点如果真出问题,通常表现为资源爆掉、时序不过、延迟变大,而不是「参数调好了还高频抖」这种规律性抖动。换句话说,浮点会坑你,但坑的方式一般不长这样。
我更想提醒一个你们可能没注意的维度:四倍频之后的编码器反馈,本身在低速段是非常「脏」的。舵机转速低、减速比大,位置增量小,四倍频把每个正交脉冲切成四份,量化台阶被放大,再加上齿槽脉动,反馈信号里就带着周期性小扰动。你位置环带宽一旦给高,环路会把这些扰动当成真实误差去追,追出来就是高频抖。MATLAB 里你的反馈是连续的、干净的,当然稳。
所以排查顺序我会这么建议:先只降位置环增益,别动任何架构,看抖的幅度是否明显变小、频率是否变化。如果降增益立刻缓解,那基本是环路带宽问题,跟浮点定点无关,定点化救不了你。如果降增益没用,再去看供电和地线,舵机瞬间电流大,和 FPGA 共地很容易串噪声,用独立稳压源单独喂舵机试一次。
至于改定点还是搬软核,我的观点是:定点是迟早要做的优化,但它不是这次抖动的解药;软核更不是,反而引入调度延迟。真要动,先把采样周期和 PWM 更新对齐,用同一拍触发,减少一拍以上的控制延迟。
你们现在位置环的带宽大概给到多少赫兹,采样率又是多少?这个数不报出来,后面全是猜。
发表回答
登录后可在本页底部提交回答