2026年电赛FPGA控制题,用国产紫光同创盘古板做多路步进电机联动,为什么加减速一快就丢步,是定时器分辨率还是脉冲输出方式的问题?

开放5 回答 148 浏览

我们队今年电赛准备用紫光同创盘古板做三轴步进电机联动,单轴跑没问题,三轴一起发脉冲、加减速一快就有轴丢步。怀疑是定时器分辨率不够导致脉冲频率抖动,也可能是用了普通IO打脉冲而不是专用高速IO。想请教做过类似控制题的前辈,丢步到底该从时钟树、脉冲输出方式还是驱动器细分设置上排查?

分享:

5 个回答

  • 嵌入式玩家

    先说结论:按你的描述,三轴联动一快就丢步,大概率不是单一原因,而是「脉冲生成机制 + 调度实时性 + 驱动器匹配」三件事叠加。排查顺序建议从最可能致命的往下走。

    第一优先是脉冲到底从哪出来。如果你是用普通 IO 在软件里翻转电平,那三轴一起发的时候,CPU 或状态机一旦被别的事情打断(比如串口收数、OLED 刷新、按键扫描),脉冲间隔立刻抖动,驱动器在高速段对间隔很敏感,丢步几乎是必然。正确做法是把脉冲交给硬件定时器或专用高速 IO,让计数和翻转在硬件里闭环,CPU 只负责改频率和发启动命令。紫光同创的片子一般有高速 IO 和硬核定时资源,具体哪个 bank 能跑到你要的频率,得查手册和约束文件,别想当然。

    第二是看频率抖动,而不是只看平均频率。拿示波器直接量脉冲脚,在加减速的斜坡段观察周期是否均匀。如果软件定时器一快就出现忽长忽短的间隔,那问题就定位了。很多人只算「我设了 10kHz」,却忽略了抖动,而步进电机恰恰吃这个。

    第三才是定时器分辨率。分辨率不够会让加减速曲线台阶化,但通常表现为速度不平滑,而不是直接丢步。真正让你丢步的往往是加速斜率超过了电机在当前细分下的能力,或者三轴调度互相阻塞导致某轴脉冲被推迟。

    所以我的建议是:先把脉冲输出改成硬件方式,再量波形,最后调细分和加减速曲线。细分设高一点能缓解低速振动,但会拉高脉冲频率上限,要和你 IO 的实际带宽一起算。三轴联动时还要确认你的调度不是「一轴发完再发下一轴」,而是各轴独立计时、并行推进。

    你们现在脉冲是用定时器硬件发的,还是软件翻转的?这个信息决定了后面怎么调。

  • 电路板萌新

    我建议你先把问题拆成两层:脉冲「发得准不准」和电机「跟不跟得上」。

    发得准不准,看硬件。脉冲脚最好走专用高速 IO,由硬件定时器产生,别用软件循环翻转。三轴联动时,如果三路的定时或状态机共用资源、互相抢,就会出现某一路脉冲被推迟。示波器抓加减速斜坡段,看周期是不是均匀,这一步能直接证伪或坐实「定时器分辨率」的猜测。

    跟不跟得上,看驱动侧。细分设太高,脉冲频率需求就上去了,高速段更容易丢;加减速曲线太陡,电机扭矩跟不上也会丢。这两件事要和你的脉冲上限一起算,不能分开调。

    所以顺序是:先确认脉冲输出方式和波形,再回头调细分与加速曲线。你们三轴是各自独立定时,还是共用一个调度器?这个先确认下。

  • Shell新手

    先说个容易被忽略的判断顺序:你怀疑的「定时器分辨率」和「普通IO打脉冲」,其实不是并列关系,后者往往是前者的放大器。

    如果脉冲是用软件循环翻转IO产生的,那定时器分辨率再高也没用,因为翻转动作要经过取指、执行、写寄存器这一串流程,任何中断、串口接收、状态机调度都会插进来,脉冲间隔就抖了。驱动器在低速段对间隔不敏感,一到高速加减速斜坡,它靠边沿间隔判断速度,间隔一乱就相当于给了它一个错误的加速度指令,扭矩跟不上自然丢步。所以先确认脉冲脚是不是挂在专用高速IO上、由硬件定时器或PWM外设直接输出,CPU只负责改频率和发启动,不参与每一次翻转。

    确认完输出方式,再回头看时钟树。紫光同创这类国产FPGA的全局时钟资源、PLL输出频率、IO bank能跑的最高翻转率都是有约束的,得查手册和约束文件,不能想当然认为某个bank能跑到你算出来的频率。三轴联动时如果三路脉冲共用一个计数器或一个状态机分时复用,那高速段必然互相抢时间,这也是「单轴没事、三轴就丢」的典型原因。建议改成三路独立定时器或独立状态机,各自闭环。

    排查工具上,示波器抓脉冲脚是最直接的。重点不是看平均频率,而是看加减速斜坡段的周期是否均匀,有没有规律性的长间隔。有抖动就说明是生成机制问题;波形很干净还丢,那才轮到驱动器细分和加速曲线。细分设太高,同样的转速需要的脉冲频率翻倍,高速段更容易撞上限;加速曲线太陡,电机扭矩跟不上也会丢。这两项要和你的脉冲频率上限一起算。

    顺序建议:先证伪脉冲生成,再确认三轴调度是否独立,最后调细分和曲线。你们三轴是各自独立定时,还是共用一套调度逻辑?这个先确认,能省掉一半排查时间。

  • Verilog代码小白

    个人感觉你们现在最该做的不是纠结定时器分辨率够不够,而是先搞清楚脉冲到底是谁在发。

    如果是CPU在循环里翻转IO,那分辨率这个问题根本轮不到讨论,因为瓶颈不在计数精度,而在调度实时性。三轴一起发的时候,只要有任何一个中断、串口、显示刷新插进来,某一轴的脉冲就被推迟一拍,驱动器在高速段对这个特别敏感。

    改成硬件定时器或PWM外设直接输出之后,再来看时钟树。紫光同创的片子不同bank能跑的最高频率不一样,PLL配置和约束也要对得上,这些查手册能确认。

    三轴联动还要注意一点:三路脉冲是不是共用了一个计数器或者一个状态机分时跑。如果是,高速段必然互相抢,单轴正常、三轴丢步就是这么来的,拆成三路独立资源试试。

    波形干净了还丢,再去动细分和加速曲线,别一上来就调驱动器。

  • FPGA菜鸟

    我先说个容易被忽略的排查方向:别急着怀疑定时器分辨率,先拿示波器看脉冲脚的波形。电赛现场经常是这样,单轴跑得挺顺,三轴一上高速就有一路丢,结果一探发现那一路脉冲周期在加减速斜坡段忽长忽短。这种抖动基本不是分辨率不够,而是脉冲的产生方式有问题。

    如果脉冲是软件循环里翻转普通IO,那CPU一被串口收发、OLED刷新、按键扫描或者另一个轴的调度打断,某一拍就被推迟,驱动器在加速段对边沿间隔特别敏感,它拿这个间隔去推速度,间隔一乱就相当于给了个错误的加速度,扭矩跟不上自然丢步。所以第一件事是确认脉冲脚挂在专用高速IO上,由硬件定时器或PWM外设直接翻转,CPU只负责改频率和发启动,不参与每一次翻转。

    确认完输出方式,再回头看时钟树和bank约束。紫光同创这类国产片子的全局时钟资源和不同bank能跑的最高翻转率是有讲究的,PLL配置和约束文件要对得上,别想当然认为某个脚能跑到你要的频率。

    还有一个容易被漏掉的点:三轴是不是共用了一个计数器或状态机分时跑。如果是,高速段必然互相抢资源,表现就是单轴正常、三轴丢步,拆成三路独立定时资源往往立刻改善。波形干净了还丢,再去动细分和加速曲线,别一上来就调驱动器。

    顺便说个替代做法,如果硬件定时器资源紧张,可以考虑用PWM外设加DMA更新占空比的方式产生脉冲,把频率变化交给硬件。你们现在三轴是各自独立定时,还是共用一个调度器?这个先确认下,方向会清楚很多。

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

提问者

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

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

相关问题

同分类

提问建议

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