我们队今年电赛选了控制类题目,用安路EG4S开发板做三轴步进电机直线插补。单轴跑没问题,但两轴联动走斜线时电机抖动明显,低速还好,一加速就丢步。我们用的是Bresenham算法做脉冲分配,主时钟50MHz分频后给步进脉冲,怀疑是分频系数和插补周期没对齐。想请教有电赛经验的学长,这种问题一般从哪查起?是插补算法本身的问题,还是脉冲输出方式(定时器 vs 计数器比较)选错了?
2026年电赛FPGA控制题,队伍用国产安路EG4S做「三轴步进电机插补」,为什么直线插补走斜线时抖动明显,是脉冲分配算法还是时钟分频的问题?
3 个回答

先别急着怪Bresenham,两轴联动才抖、单轴正常,八成是脉冲输出的时基问题。检查你的分频是不是用计数器分频后直接翻转IO,而不是硬件定时器产生精确的脉冲沿;插补周期和脉冲频率没对齐时,两轴相位会周期性错位。用ILA抓脉冲和方向信号,看有没有毛刺或丢沿,基本就定位了。你们现在分频系数是怎么算的?

个人感觉你们更可能是脉冲输出的时基没做干净。EG4S 上如果 STEP 是用计数器分频后直接翻转 IO,两轴各翻各的,插补周期一快,两轴的脉冲沿就会周期性错位,表现出来就是斜线抖、加速丢步,单轴反而看不出来。
建议先把一路脉冲改成硬件定时器或计数器比较输出,让脉冲沿由硬件在固定计数值上产生,插补层只负责算下一个脉冲该哪天发,加减速也尽量放在插补层统一算,别让每个轴各自软延时。然后用 ILA 抓 STEP、DIR 和插补触发信号,看有没有毛刺、有没有丢沿、两轴相位差是不是稳的。至于 Bresenham,只要它输出的脉冲数没错,一般不是抖的主因,它更多影响终点精度而不是实时抖动。你们现在分频系数和插补周期是分开算的还是绑在一起的?

先说结论方向:单轴正常、两轴联动才抖,问题大概率不在 Bresenham 本身,而在「脉冲产生方式 + 插补周期对齐」这条链路上。Bresenham 只决定每个插补周期里哪几个轴该发脉冲、发几个,它输出的是数字量;真正决定电机抖不抖的,是这些数字量被翻译成 STEP 脉冲沿的时序质量。
顺着这条主线往下捋。你们主时钟 50MHz 分频给步进脉冲,如果是「计数器分频后直接翻转 IO」,那每个轴的脉冲沿都挂在自己的计数器上。单轴跑的时候只有一路在翻,看不出问题;一旦两轴联动,两路计数器的相位关系就取决于各自的初值和插补周期怎么喂进去。插补周期和分频系数如果不是从同一个时基推出来的,两轴脉冲沿就会周期性错位,表现出来就是斜线抖、加速丢步。这跟 Bresenham 算得对不对关系不大——算错了是终点偏,不是实时抖。
所以排查顺序建议这样:第一,确认脉冲是不是硬件定时器/计数器比较输出产生的,而不是软件延时或分频翻转。硬件比较输出能保证脉冲沿落在固定计数值上,抖动是确定的、可预期的;软件方式一旦被插补计算打断,沿就飘。第二,看插补周期和脉冲频率是不是绑在同一个时基上。常见做法是用一个统一的插补 tick,每个 tick 里根据 Bresenham 结果决定各轴发几个脉冲,而不是让每个轴自己算分频。第三,加减速曲线尽量放到插补层统一算,别让每个轴各自做软加减速——三轴各减各的,联动时速度矢量就乱了。
工具上,EG4S 用安路的在线逻辑分析仪抓 STEP、DIR 和插补触发信号,重点看三件事:脉冲有没有毛刺、有没有丢沿、两轴相位差是不是稳定。如果相位差在一个插补周期内来回跳,基本就锁定是时基问题。
最后提一句取舍:电赛时间紧,别一上来就重构整个运动控制架构。先把脉冲输出改成硬件比较输出、把插补 tick 统一,往往就能压住大部分抖动。你们现在分频系数和插补周期是各算各的,还是从同一个计数器推出来的?这个决定了要改的地方多不多。
发表回答
登录后可在本页底部提交回答