2026年了,FPGA工程师做伺服电机控制,多轴同步的插补算法用Verilog实现,脉冲方向信号抖动怎么消除?

开放5 回答 39 浏览

最近在做一个四轴伺服运动控制项目,FPGA负责发脉冲和方向信号,但电机低速时抖动特别明显,用示波器看脉冲波形有毛刺。查了资料说可能是插补算法生成的脉冲间隔不均匀导致的。想问下各位大佬,多轴同步的插补算法在FPGA里具体怎么实现?用DDA还是Bresenham?脉冲方向信号抖动除了硬件滤波还有哪些软件层面的消除方法?

分享:

5 个回答

  • Linux菜鸟

    先别急着上 Bresenham,四轴同步插补在 FPGA 里更常用 DDA,因为它天然适合做多轴联动——每轴一个累加器,同一个时钟节拍下同步更新,轴间误差就是累加器位宽决定的那点量化误差,不会越走越偏。Bresenham 偏整数直线绘制,单轴效率高,但多轴同步时要额外处理各轴步进时刻的交叉关系,反而容易引入时序抖动。你看到的毛刺,大概率不是 DDA 本身的问题,而是累加器溢出时脉冲输出瞬间和方向信号切换没有对齐,或者溢出脉冲直接连到了 IO 上没做寄存器打拍。软件层面先做两件事:一是把脉冲输出打一拍,让所有轴的脉冲在同一个时钟沿输出,保证跨轴同步;二是方向信号要提前于脉冲至少一个时钟周期建立,也就是先改方向寄存器,下一拍再允许脉冲输出,这样示波器上就不会出现方向边沿和脉冲边沿打架的毛刺。另外,如果电机低速抖动,还得看脉冲间隔是否均匀——DDA 在低速时溢出间隔天然会跳变,建议在累加器里加一个余数平滑,或者把目标速度换算成周期计数而非直接频率字,这样相邻脉冲间隔只会差一个时钟周期,而不是突然翻倍。S 曲线加减速更多是解决启停冲击,对匀速段抖动帮助不大,先把脉冲间隔均匀性搞定再说。你现在的插补时钟是多少兆?如果方便,把累加器位宽和电机每转脉冲数贴出来,我可以帮你算下理论抖动范围。

  • 卑微电子人

    这个问题我去年调过三轴,踩坑踩得挺多,给你捋一条主线。先说结论:DDA 适合 FPGA 多轴同步,但抖动根源往往不在插补算法本身,而在你输出链路的时序设计。DDA 每个轴就是一个累加器加一个比较器,溢出一拍就发一个脉冲,理论上各轴脉冲间隔只差一个插补时钟周期,不会产生肉眼可见的毛刺。你示波器看到毛刺,常见原因有三个:第一,脉冲信号和方向信号是组合逻辑直接输出的,没有经过同步寄存器,任何一点组合逻辑延迟差异都会变成毛刺,解决办法很简单,所有输出打一拍,让它们在同一时钟沿翻转;第二,方向信号和脉冲信号的建立保持时间不够,FPGA 里你改方向是异步的,但伺服驱动器要求方向先稳定一段时间再等脉冲,你可以在状态机里让方向先变化、保持至少一个插补周期,然后再发脉冲;第三,插补时钟本身可能有抖动,比如你用 PLL 分频出来的时钟没加全局缓冲,或者时钟频率太低导致 DDA 累加步长太小,低速时溢出间隔差异被放大。软件层面除了打拍,还可以用脉冲间隔平滑——DDA 溢出后,不要立刻把脉冲拉高,而是把溢出事件放进一个小 FIFO,以固定速率吐出,但这对高速运动没用,反而是负担。更实用的做法是:把速度环的周期值直接映射成脉冲间隔计数器,而不是用累加器溢出方式,每来一个插补时钟就减一,减到零就翻转脉冲电平,这样相邻脉冲间隔最多差一个时钟周期,低速也均匀。另外,你提到 S 曲线,它主要解决加减速阶段的加速度突变,对匀速段毛刺没帮助。最后建议你排查顺序:先确认所有输出是否都过了寄存器,再查方向与脉冲的时序关系,最后才怀疑算法本身。你用的是哪款 FPGA?如果 IO 标准和驱动电压跟伺服接收端不匹配,毛刺也可能是电平问题。

  • 单片机入门

    先确认一个事:你示波器看到的毛刺,是脉冲沿上的毛刺,还是脉冲间隔忽长忽短?这两个问题完全不是一回事。如果是前者,多半是组合逻辑输出没打拍,方向信号和脉冲信号建立保持时间不够;如果是后者,那才是插补算法本身的事。我的建议是先把输出链路打一拍这件事做了,所有脉冲和方向都在同一个时钟沿翻转,毛刺基本能消掉七八成。然后再看低速抖动,这时候大概率是脉冲间隔不均匀,DDA 累加器位宽不够或者插补时钟太低。说句实话,四轴联动用 DDA 比 Bresenham 省心,Bresenham 在单轴画线效率高,但多轴同步要处理各轴步进时刻的交叉关系,时序上容易顾此失彼。另外你可以考虑在脉冲输出后面加一个简单的 RC 滤波或者施密特触发器,硬件上兜底,但别指望它解决算法问题。最后提醒一句:低速抖动还有一种可能是你加减速没做,梯形加减速在低速段脉冲间隔本来就大,稍微有点误差就肉眼可见,换成 S 曲线会平滑很多。你现在的插补时钟是多少兆?累加器位宽多少?这两个参数直接决定低速性能上限。

  • 数字电路入门生

    我把这个问题的因果链捋一遍,你照着查。低速抖动最核心的物理原因是:电机在低速时,每个脉冲对应的时间间隔很长,假设你插补时钟是 10MHz,脉冲频率 100Hz,那每两个脉冲之间隔着 100000 个时钟周期。如果插补算法让这 100000 拍里脉冲出现的时机有细微偏差,反映到电机上就是转速波动,看起来就是抖动。DDA 算法每轴一个累加器,每个时钟周期累加一次,溢出就发脉冲。它的理论误差是累加器位宽决定的,比如 32 位累加器,溢出时刻的误差不会超过 1/2^32 个插补周期,这个精度完全够。但问题来了:你发脉冲那一刻,方向信号是否已经稳定?如果方向信号在脉冲沿附近跳变,伺服驱动器内部的硬件滤波逻辑可能把脉冲吃掉,或者产生毛刺。所以软件层面第一件事:方向信号必须先于脉冲至少一个插补周期建立,你可以在状态机里写清楚,方向改变后的下一拍才允许脉冲输出。第二件事:所有输出打一拍,消除组合逻辑延迟差异。这两步做完,示波器上的毛刺应该就没了。如果还有低速抖动,那大概率是脉冲间隔不均匀,但 DDA 理论上是均匀的,除非你的累加器位宽太小,比如只有 8 位,那误差会达到 1/256 个插补周期,低速时这个误差被放大,就会抖动。我建议至少 24 位。另外,加减速曲线也影响低速手感,梯形加减速在速度切换点会有一个加速度突变,低速段特别明显,S 曲线好很多。你要么把一个轴的完整代码贴出来,包括累加器位宽、插补时钟频率、加减速逻辑,我帮你看一眼。

  • 单片机菜鸟

    低速抖动你示波器上看到的毛刺,得先分清是电平毛刺还是脉冲间隔不均匀。如果是电平毛刺,大概率是IO翻转瞬间方向信号还没稳定,伺服驱动器在脉冲沿附近采样到方向跳变,直接把脉冲当毛刺滤掉了。这个跟插补算法没关系,纯粹是时序问题。你可以把方向信号提前一个插补周期更新,确保脉冲来之前方向已经建立,这是软件层面最优先做的事。

    如果确认是脉冲间隔不均匀,那才是插补算法的事。四轴联动我建议用DDA,每个轴一个累加器,同一个时钟节拍下同步累加,溢出就发脉冲。DDA的轴间误差只取决于累加器位宽,32位位宽下各轴脉冲间隔的偏差不会超过一个插补周期,这个精度对伺服电机来说足够平滑。Bresenham虽然单轴效率高,但多轴同步要处理各轴步进时刻的交叉关系,时序上容易顾此失彼,除非你有非常特殊的单轴直线需求,否则不建议。

    软件层面还有一个容易被忽略的点:加减速。如果你没做加减速,电机从静止直接跳到一个固定的脉冲频率,起步瞬间脉冲间隔会有明显突变,低速时看起来就是抖动。可以加一个S曲线加减速,把脉冲间隔的变化率限制住,输出自然就平滑了。这个跟你示波器看到的毛刺不一定直接相关,但低速抖动很多时候是加减速没做或者加速度太大导致的。

    另外,如果你用的是PLL分频出来的插补时钟,注意一下PLL的抖动指标,有些低端FPGA的PLL在分频比较大时输出抖动会明显增加,也会体现在脉冲沿上。可以先试试用外部高精度晶振直接驱动,排除这个因素。

    最后想确认一下,你现在的插补时钟大概是多少?脉冲频率最低会到多少?这两个数决定了累加器位宽和加减速参数的下限,如果方便的话可以说说。

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

提问者

FPGA萌新查看主页
浏览「其他」

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

相关问题

同分类

提问建议

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