2026年了,电赛控制题用国产FPGA跑PID,电机响应总慢半拍,是控制周期太长还是编码器反馈没做滤波?

开放3 回答 54 浏览

本科二线城市双非,今年电赛选了控制题,用的安路FPGA,PID控制直流电机。现在问题是电机响应总是慢半拍,给定速度后要三四百毫秒才能跟上,网上看别人用STM32都能做到几十毫秒。我怀疑是控制周期设太长了,现在主循环里跑PID是10ms一次,但编码器读数好像也有毛刺。想请教做过电赛控制题的大佬,用国产FPGA做电机控制,控制周期一般设多少比较合适?编码器反馈需要先做滤波吗?是加个简单的滑动平均还是直接上卡尔曼?另外PID参数整定有没有什么快速方法,现在手动调参调了两个通宵了。

分享:

3 个回答

  • Linux小白

    先别急着怀疑FPGA,你这个问题八成是控制周期和编码器噪声叠加出来的。10ms的主循环对直流电机PID来说确实偏慢了,尤其是空载或轻载的小电机,机械时间常数可能就二三十毫秒,你10ms才算一次,相当于每个控制周期电机状态都变了一截,响应自然拖沓。电赛控制题一般建议把PID放到1ms以内跑,如果FPGA资源紧张,可以把编码器读取和PID计算拆开,用定时器中断或独立时钟域触发,别跟主循环绑在一起。编码器滤波这个事,滑动平均就够用了,窗口取4到8个点,别贪大,否则会引入滞后,反而更慢。卡尔曼在电赛这个场景属于杀鸡用牛刀,除非你的编码器是那种很差的AB相带大量毛刺,否则没必要。PID整定别手动瞎试了,临界比例度法最实用:先只留P,把I和D设成0,慢慢加大P让系统开始等幅振荡,记下此时的增益Ku和振荡周期Tu,然后按Ziegler-Nichols公式算一组初始参数,再微调。这个方法一个晚上能搞定,比你通宵试参数强。另外提醒一句,检查一下你的编码器计数是不是在FPGA里用了边沿检测但没做同步处理,跨时钟域毛刺会导致读数跳变,那才是慢半拍的元凶。你现在的板子主频多少?编码器是AB相还是单脉冲?这个会影响滤波窗口的选择。

  • 码上起飞

    这个问题其实核心矛盾不是FPGA还是STM32,而是你把控制回路的时间尺度搞错了。直流电机的电流环一般要跑在10kHz到20kHz,速度环1kHz左右就够,位置环可以再低。你现在的10ms对应100Hz,连速度环都算不上,顶多是位置环的节奏,拿它去跑速度PID,当然会觉得电机慢半拍。电赛里很多人犯的错是把PID当成主循环里的一个函数,跟显示、通信、按键扫描混在一起,结果周期被其他任务拖累,实际执行间隔可能还不稳定。你既然用安路FPGA,建议把PID做成一个独立模块,用固定的1ms或500us时基触发,编码器读数在模块入口做一次同步采样,这样控制周期和反馈延迟就分开了。编码器滤波这事,滑动平均确实简单,但你要注意窗口长度带来的相位滞后,比如你窗口取8个点,在1ms周期下就是8ms延迟,这比PID本身的时间常数还大,响应一样慢。更好的做法是先用硬件滤波或施密特触发器处理毛刺,软件只做轻度的中值滤波,比如取3个点排序去中间值,抗脉冲干扰效果好,延迟又小。卡尔曼在这个场景真没必要,除非你后面要做无感FOC那种状态估计,否则只是增加调试复杂度。PID参数整定,除了临界比例度法,还可以用Ziegler-Nichols的另一种形式,就是阶跃响应法,先让系统开环跑,给一个固定占空比,记录速度阶跃曲线,从曲线上读出滞后时间L和时间常数T,再套公式。这个方法比临界比例度法快,因为你不用反复试P值找到振荡点。另外你提到STM32几十毫秒就能跟上,其实STM32的定时器中断精度和你的FPGA定时器没本质区别,关键是你有没有把控制任务独立出来。建议你先做一个最小验证:只保留编码器读取和PID输出,其他全注释掉,跑1ms周期,看看响应时间能压到多少。如果这样还慢,那就是机械或驱动的问题,比如H桥死区、PWM频率太低(低于16kHz会听到啸叫,也会影响电流响应)。你目前PWM频率设的多少?编码器线数是多少?这些参数不确认,光调软件可能治标不治本。

  • 逻辑萌新实验室

    说实话,10ms周期跑速度环确实太慢了,但你通宵调参没调出来,问题可能不止周期这一个。我当年做电赛也踩过类似的坑:一开始以为是PID参数不对,后来发现编码器毛刺导致微分项乱跳,电机在目标速度附近来回抖,看起来就是“慢半拍”加“跟不住”。建议先把编码器滤波做掉,滑动平均窗口取4到8个点就够了,别一上来就上卡尔曼——卡尔曼要调Q和R矩阵,你调参时间本来就不够,别给自己加戏。滤波之后你再看波形,如果毛刺还在,那可能是AB相没做正交解码的边沿对齐,或者共地没处理好。至于PID整定,别再用通宵试凑法了,用临界比例度法:先把I和D设成0,只留P,从很小开始加,直到速度出现等幅振荡,记下此时的Ku和振荡周期Tu。然后按Ziegler-Nichols的经验公式,P型控制器取0.5Ku,PI型P取0.45Ku、Ti取0.83Tu,PID型P取0.6Ku、Ti取0.5Tu、Td取0.125Tu。这个公式给的是起点,不是终点,但至少能让你在半小时内从一个能跑的参数开始微调,而不是从零开始瞎试。还有个小提醒:你在FPGA里做PID,建议把控制周期固定成1ms,用独立的定时器中断触发,不要跟显示、通信、按键扫描混在主循环里。主循环里其他任务一多,实际执行周期会抖动,你的整定参数就全废了。你现在的场景是速度环还是位置环?如果是位置环,那10ms还勉强能用,但速度环必须压到1ms以内,你先把周期改短再重新整定,大概率会有惊喜。

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

提问者

数字IC萌新查看主页
浏览「其他」

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

相关问题

同分类

提问建议

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