2026年电赛控制类题目用FPGA替代STM32做多路PWM和编码器采集,新手该从哪个模块先啃?

开放3 回答 52 浏览

大二电子信息,队里决定今年电赛控制题用FPGA做主控,替代原来STM32的方案。现在只会写流水灯和串口,面对多路PWM输出、正交编码器计数、PID闭环完全不知道先做哪块。想问问有电赛经验的学长,FPGA做控制类作品的模块拆解顺序是什么?先啃PWM还是先啃编码器?有没有能直接套用的工程框架?

分享:

3 个回答

  • 前端初号机

    先啃编码器吧。PWM 本质就是计数器加比较寄存器,写起来比流水灯难不了多少;编码器涉及正交解码、四倍频、防抖动,坑更多,先把它做稳,后面 PID 才有真实反馈可用。

  • FPGA学员2

    先啃PWM吧,它本质就是计数器+比较寄存器,写通了你的信心会好很多。编码器涉及正交解码和四倍频,坑更碎,等PWM稳了再碰,别一上来就双线作战。你们板子是哪块?

  • 嵌入式学习ing

    先说结论:别把PWM和编码器当成两个孤立的模块来排序,它们背后其实是同一套东西——计数器加比较逻辑。你要做的第一件事不是选先啃哪个,而是先把『定时器思维』从STM32里搬出来,换成FPGA的『时钟分频加计数』思维。

    为什么这么说?STM32里你调个库函数配好ARR和PSC,PWM就出来了,编码器模式也是外设帮你解码,你根本不关心中间发生了什么。到了FPGA,这些『外设』全没了,你得自己拿一个50MHz或100MHz的时钟,分频出你想要的计数节拍,再用一个计数器去数它。PWM本质就是:计数器从0数到周期值,同时拿另一个比较值和计数值比大小,小于就输出高,大于就输出低。编码器本质就是:A、B两相电平变化时,根据相位差判断方向,然后让一个计数器加一或减一。你看,两者都绕不开『计数器』这个核心。

    所以我建议的路径是:先花两三天把『时钟分频加自由计数加数码管显示计数值』这条链路打通。这一步看起来跟PWM、编码器都没关系,但它逼你搞明白FPGA里最基础的时间概念——你写的每个always块是在哪个时钟沿触发的,计数到了多少代表多少微秒。这一步通了,PWM你半天就能写出来,无非是把比较结果引到引脚。

    然后先做PWM,原因是它反馈是即时的:你改一下比较值,示波器或LED亮度立刻变化,调试闭环短,容易建立信心。而且多路PWM对你后面做电机驱动是刚需,先把四路、六路PWM的占空比独立可调做出来,顺便练一下模块化写法,别全堆在一个always里。

    再说编码器,它比PWM难的地方不在于计数,而在于信号质量。真实编码器输出有抖动、有毛刺,正交解码还要处理四倍频和方向判断。我见过太多人编码器计数跳变,最后发现是没做同步打拍、没滤波。这些坑在你没有PWM基础、连时钟域都没概念的时候碰,会非常痛苦。所以顺序上是PWM先行、编码器跟进,但中间必须补上『输入信号同步与消抖』这一课。

    至于能直接套用的工程框架,我的看法是:别急着找现成的。电赛控制类题目每年都在变,你套一个别人的框架,遇到引脚冲突或时序不满足时改不动,反而更慌。比较务实的做法是自建一个小工程模板:顶层只做例化和引脚分配,下面挂clk_div、pwm_gen、encoder_decode、uart_tx这几个独立模块,用Signaltap或ILA抓波形验证。这个模板搭一次,后面PID、ADC、屏幕显示都能往里塞。

    最后提醒一句,PID闭环的前提是你PWM和编码器都稳了,别倒过来先调PID。你现在板子是哪块、开发环境是Vivado还是Quartus?这会影响我建议你先用IP核还是纯手写。

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

提问者

逻辑设计初学者查看主页
浏览「其他」

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

相关问题

同分类

提问建议

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