码电路的阿明
我们去年电赛做的也是FPGA电机控制,当时被定点运算坑了好久。直接说重点:别一上来就搞三环全开,先搞定电流环。电流环频率最高(比如20kHz),对延迟最敏感,用FPGA的并行性优势最大。
架构上,我们用的是“并行计算单元+状态机调度”。具体来说,把Clarke变换、Park变换、两个电流的PI控制器、反Park变换这些模块都做成独立的硬件模块,每个模块都是纯组合逻辑或者很短的流水线。然后用一个状态机按顺序启动它们,但关键是因为它们硬件上是独立的,所以每个时钟周期都在算不同的数据——相当于流水线。比如第一个周期采样电流做Clarke,第二个周期对上一个周期的结果做Park,同时新的采样电流进入Clarke模块,这样吞吐量就上来了。
定点运算的坑:先仿真确定动态范围。用MATLAB/Simulink的Fixed-Point Designer工具,把浮点模型转定点,看数据在各个环节的最大最小值。我们当时电流环的误差和积分项用Q4.12(总共16位,4位整数12位小数)就够了,输出PWM占空比用Q1.15。注意PI控制器的积分饱和要自己硬件实现,用个限幅器。
资源权衡:如果FPGA里有DSP Slice(像Xilinx的DSP48E1),尽量用它们来做乘法,比用逻辑资源(LUT)拼出来的乘法器又快又省。位置环和速度环频率低,可以用同一个计算单元分时复用,用状态机控制多路选择器切换参数和数据。
开源参考:OpenCores上有一些简单的PWM发生器和PID控制器IP,但完整的很少。建议去Xilinx和Intel(Altera)官网找电机控制的应用笔记,比如Xilinx的XAPP1233,里面有很多设计思路和参考代码片段,比完全自己造轮子强。
最后提醒,电赛时间紧,一定要先做减法。把三环的框架搭通,精度指标别追求极限,稳定跑起来才是王道。
