我们队今年电赛控制题选了安路EG4S20,做三轴步进电机S曲线插补,ModelSim里波形完美,上板一加速就丢步,低速又正常。查了脉冲宽度够、定时器分辨率也够,怀疑是S曲线表的加速度段太陡导致驱动器跟不上,也可能是细分和电流没调对。有没有做过类似题目的同学说说,怎么用示波器定位是FPGA侧脉冲问题还是驱动侧丢步?
2026年电赛FPGA控制题用安路EG4S20做「多路步进电机S曲线插补」,仿真完美上板却丢步,问题到底出在加减速表还是驱动电流?
6 个回答

先别急着改S曲线表,我建议按『先看脉冲、再看驱动器、最后才怀疑插补算法』的顺序来。你们低速正常、一加速就丢步,这个现象本身信息量很大:低速正常说明脉冲产生逻辑、引脚约束、共地这些基础大概率没问题;加速才丢,问题往往在脉冲边沿质量、驱动器响应速度、或者加速度表在高速段的离散化误差这三者之一。
第一步用示波器抓一路STEP脉冲,最好用逻辑分析或示波器的脉冲宽度/边沿触发,看两件事:一是高速时最小脉宽有没有被压到驱动器要求以下(很多驱动器要求不小于2.5us或5us),二是脉冲边沿有没有明显毛刺或振铃。如果脉宽不够或边沿很脏,那问题在FPGA侧或走线,跟电流无关。
第二步固定单轴、低速、固定细分,手动改驱动器电流档位,看同一段S曲线在哪个电流档下开始丢步,这是区分『驱动器跟不上』和『脉冲本身错』最快的手段。
第三步才回到S曲线表。常见坑是加速度段用整数除法算延时,低速段分辨率够、高速段误差被放大,或者S曲线表在拐点处不单调,导致某几个周期脉冲间隔突然变短。可以把表导出成CSV,用脚本检查相邻延时差是否连续。
另外提醒一个容易被忽略的风险:三轴同时跑时如果共用一个定时器或共享总线,插补周期抖动也会造成丢步,单轴测试正常不代表三轴正常。你们现在是用单轴还是三轴同时测的?这个条件不同,排查路径会差很多。

示波器先抓STEP和DIR,看高速时最小脉宽和边沿干不干净;再单轴低速固定细分,手动调电流档,看哪档开始丢。这两步做完基本就能分清是FPGA侧还是驱动侧,别一上来就改S曲线表。

这个问题我倾向于先讲一个判断逻辑:仿真完美、上板低速正常、一加速就丢,这三点组合起来,其实已经把嫌疑范围缩小到『时序相关』而非『逻辑相关』的问题上了。仿真里的波形是理想的,没有走线延迟、没有驱动器输入滤波、没有电源纹波,所以凡是只在速度上去之后才暴露的问题,八成跟真实世界的时序和模拟特性有关,而不是你S曲线表的数学推导错了。
沿这条主线往下走,我建议把『加速度表』和『驱动电流』当成两个假设分别去证伪,而不是混在一起调。证伪加速度表的办法是:把S曲线表的加速度段人为放缓一倍,其它全不动,如果丢步消失,那说明确实是加减速太陡、驱动器响应跟不上;如果放缓了还丢,那加速度表基本可以排除,问题在脉冲质量或驱动侧。这个对照实验成本很低,但能省掉大量瞎调的时间。
证伪驱动侧的办法是固定单轴、固定细分、固定一段匀速脉冲,只改电流档位,从低到高扫一遍,记录哪个档位开始稳定。这里有个常见误区:很多人以为电流越大越好,其实电流过大会让驱动器发热、细分波形畸变,反而在高速时更容易丢;电流偏小则力矩不足,加速段直接失步。所以电流要配合细分和实际负载去找平衡点,不是拍脑袋拉满。
再往深一层说,S曲线的本质是让加速度连续,但离散实现时加速度表是查表加插值,如果表的点数不够、或者高速段延时计算用了会溢出的位宽,就会出现『表看起来平滑、实际脉冲间隔抖动』的情况。这类问题仿真里因为时间精度理想,往往看不出来。常见的做法是把实际输出的脉冲间隔用逻辑分析仪抓一段回来,和表里理论值逐点比对,看误差是否在高速段突然放大。
最后提一句工程取舍:电赛时间紧,如果对照实验发现是加速度太陡,直接给加速度段加个限幅、再加软启动,比重新设计整张S曲线表性价比高得多。先把能跑通、不丢步的版本做出来,再去优化曲线平滑度。你们现在三轴是各自独立定时器还是共享一个插补周期?这个结构决定了抖动会不会跨轴传播,值得先确认一下。

先说个容易被忽略的点:你们现在纠结的是「表太陡」还是「电流不对」,但这两个假设其实可以用一个动作分开验证,就是先把加速度表整体缩放,而不是改电流。做法很土:把S曲线里加速段的步数乘个系数,比如整体拉长到原来的1.5倍或2倍,其它参数一个字不动,烧进去跑同一段轨迹。如果丢步明显减少甚至消失,那问题基本锁定在加减速曲线上——不是你的算法错,而是加速段在高速区的离散化太粗,相邻两个定时周期的频率跳变超过了驱动器的跟随能力。这时候正确的修法不是简单把表放缓,而是在表的高频段加密采样点,或者给频率变化率加一个上限(本质是限制加加速度jerk),让每个定时周期之间的频率增量不超过某个阈值。安路这块片子做插补时,如果定时器是固定基准分频,频率越高的段每个脉冲分到的计数值越少,量化误差反而越大,这一点在ModelSim里是看不出来的,因为仿真波形不体现真实的定时器截断。
如果放缓加速段之后还是丢,那才轮到驱动侧。固定单轴、固定细分、跑一段匀速高频脉冲,手动把驱动器电流从低档往高档调,看哪个档位开始稳定。这里有个取舍:电流调大扭矩够但发热和噪音上来,细分调高运转平滑但同样转速下脉冲频率翻倍,对FPGA的定时器分辨率要求也翻倍。电赛现场时间紧,一般建议先保证电流档够用、细分不要盲目拉满,把余量留给脉冲质量。
另外共地和时序约束别跳过,EG4S20的IO约束里STEP/DIR这类输出最好显式设输出延迟和驱动强度,走线长的话加个缓冲。你们现在用的细分档位和驱动器型号是什么?这个直接决定频率上限能推到多少。

我按我们队当时踩的坑给你捋一条主线:先证伪FPGA侧,再证伪驱动侧,别混着调。
第一步抓脉冲。用示波器在驱动器输入端(不是FPGA引脚)看STEP,加速到丢步那个速度,量最小高电平宽度和边沿。很多驱动器对脉宽有下限要求,频率一高定时器分频后的实际脉宽可能被压到临界值,仿真里看不出来。同时看有没有毛刺和过冲,有的话先加串联电阻或缓冲,把信号弄干净。
第二步固定单轴、固定细分,只改电流档,跑一段匀速高频,找出开始丢步的电流阈值。这一步能干净地区分是驱动器扭矩不够还是脉冲错。
第三步才回到S曲线表。把加速段人为放缓一倍做对照,丢步消失就说明是加速度太陡,修法是高频段加密采样或限制频率变化率,而不是无脑降速。最后检查约束文件里STEP/DIR的输出延迟设置和板子共地。你们三轴是共用一个定时基准还是各自独立?这会影响高频段的量化误差怎么摊。

先说个不太中听但很省时间的判断:仿真完美、低速正常、一加速就丢,这三件事凑在一起,基本可以把「S曲线表的数学推导写错了」这个假设排到最后。因为表算错了低速也会错,仿真也不会完美。真正会随速度变化而暴露的,是离散化和物理层的耦合,我建议你按一条主线往深里挖,而不是在表和电流之间来回猜。
这条主线是:频率越高,你的定时器每个脉冲分到的计数值越少,量化误差和相邻周期之间的频率跳变就越大。安路这块片子做三轴插补时,如果三轴共用一个定时基准分频,高频段每步的计数余量被压得很薄,表上相邻两个点的频率差在仿真里是理想值,上板后叠加走线延迟和驱动器输入滤波,实际脉宽和相位就可能踩到驱动器的下限。所以第一个动作不是改表,是把加速段整体拉长1.5到2倍,其它参数一个字不动,烧进去跑同一段轨迹。丢步明显减少,就锁定在加减速的离散化上,修法是高频段加密采样点或给频率变化率加个上限,本质是限jerk,而不是无脑降速。
如果拉长后照丢,再转去查脉冲质量和驱动侧。示波器探头打在驱动器输入端而不是FPGA引脚,看高速时最小高电平宽度、边沿有没有毛刺振铃,有就先串电阻或加缓冲把信号弄干净。然后固定单轴、固定细分,只改电流档跑匀速高频,找出开始丢步的电流阈值,这一步能干净地区分扭矩不够还是脉冲本身错。
还有个容易被忽略的点:三轴是共用一个定时基准还是各自独立?共用的话,插补时某一轴的频率变化会通过分频器影响到其它轴的相位,加速段更容易抖。你们现在的定时器是单基准分频还是每轴独立计数?这个决定了后面加密采样点该改哪一层。
发表回答
登录后可在本页底部提交回答