如果你正在学 FOC,很多资料会从 Clark 变换、Park 变换、PI 控制和 SVPWM 开始讲。问题是,公式看懂之后,离"让电机稳定转起来"还有一段距离。
我推荐的这个项目叫 FPGA-FOC,作者是 WangXuan95,项目地址是 https://github.com/WangXuan95/FPGA-FOC
它的定位很清楚:用 FPGA 实现磁场定向控制,用来驱动 PMSM 或 BLDC 电机。

价值点
FPGA-FOC 最值得看的地方,不是它又讲了一遍 FOC 原理,而是它把 FOC 放进了一个工程系统里。项目实现的是基于角度传感器的有感 FOC,也就是一个完整的电流环,可以进一步做扭矩控制。
这意味着你看到的不只是算法模块,还有角度传感器、相电流采样、三相 PWM、使能信号和 UART 监测。FOC 对传感器采样速率和处理器计算能力有要求,而 FPGA 的优势正好在实时性、多通道扩展和多路反馈协同上。
对学习者来说,这个视角很重要。电机控制不是把公式翻译成代码就结束了,采样是否及时、角度方向是否正确、PWM 输出是否符合驱动板要求,都会直接影响最终效果。

可读性强
项目核心代码在 RTL 目录,模块命名非常直接,比如 foc_top.v、clark_tr.v、park_tr.v、pi_controller.v、cartesian2polar.v、svpwm.v。这些文件基本对应了 FOC 的关键链路,读起来不会迷路。
更关键的是,项目说明里提到,除了 fpga_top.v 中的 altpll 原语外,其它代码是纯 RTL。也就是说,只要你处理好时钟和外设差异,它并不天然绑定某一个 FPGA 厂商。
项目还把逻辑分层说得很清楚:传感器控制器是硬件相关部分,FOC 算法是相对固定的核心部分,用户逻辑可以根据应用去改。这个分层方式,对做工程移植和二次开发都很友好。
硬件和调参
很多 FOC 资料容易停在算法层,但这个项目把硬件条件摆了出来。示例需要 FPGA 开发板、PMSM 或 BLDC 电机、三相电机驱动板、AS5600 磁编码器,以及用于相电流采样的 AD7928。
README 里还列出了 IO 连接方式,包括 I2C 接 AS5600,SPI 接 AD7928,三路 PWM 接电机驱动板,PWM_EN 做桥臂使能,UART 用来观察电流环。这个细节对新手很有帮助,因为它把"FOC 系统到底要接什么"讲得比较具体。
调参部分也值得看。项目提到 INIT_CYCLES、ANGLE_INV、POLE_PAIR、MAX_AMP、SAMPLE_DELAY,以及 PI 控制器的 Kp 和 Ki,这些参数分别对应初始化、角度方向、极对数、SVPWM 幅值、采样延迟和电流环质量。
串口监测
FPGA-FOC 还提供了 UART 电流环监测。串口会打印 d 轴、q 轴电流的目标值和实际值,作者也展示了用 Arduino IDE 串口绘图器观察电流跟随曲线的方法。
这件事很实用。控制环有没有跟上,不应该只靠感觉判断,而是要看目标值和实际值之间的关系。
项目的 SIM 目录也提供了部分子模块仿真,比如 Clark/Park 变换,以及 cartesian2polar/SVPWM。虽然作者说明没有完整电机模型,不能仿真整个 FOC 系统,但这些子模块仿真已经足够帮助你验证关键算法环节。
我的建议
如果你熟悉 Verilog,但对 FOC 还不够熟,建议先不要急着上板。第一步先看 README 的系统框图和设计代码表,把数据流从角度读取、电流采样、坐标变换、PI 控制到 SVPWM 输出串起来。
第二步读 foc_top.v,再顺着核心模块看 clark_tr.v、park_tr.v、pi_controller.v 和 svpwm.v。这一轮的目标不是记住所有细节,而是理解每个模块为什么存在。
第三步再看 SIM 目录里的 testbench,先用波形理解坐标变换和 SVPWM 输出。等代码和波形都比较熟,再考虑硬件搭建、引脚约束和参数调整,会少走很多弯路。
总结
FPGA-FOC 不是一个拿来就能无脑套用的项目。它需要你理解电机、驱动、传感器、采样、时钟和 RTL 设计。
但也正因为这样,它很适合作为一个学习型工程。它让 FOC 不再只是控制框图和数学公式,而是一套可以阅读、可以仿真、可以接硬件、可以观察电流环效果的完整实现。
如果你想从 MCU 之外的角度理解电机控制,或者想看看 FOC 如何拆成可以综合的 Verilog 模块,这个项目值得收藏。