FOC学习与问题
从复刻一块 FOC 板开始:一个模拟小白的笔记
学 FOC 之前,我以为「做出三相正弦」就是把三路电压画成正弦波送进电机。后来对着开源板(AxDrive-L 一类)一页页问下去,才发现:功率级输出的是 PWM 方波,正弦在 电流 和 平均电压 上;算法要的也不是三路模拟正弦,而是电流环里的 Id、Iq。
这篇不写公式推导,只把反复卡住的地方记下来,方便以后自己翻,也给同样从零画板的人当对照。
1. FOC 在干什么
把转子磁场当成一把尺子(d 轴),转矩相关的电流放到和它垂直的 q 轴上。流程可以记成:
三相电流 → Clarke(αβ 坐标系)→ Park(要电角度 θe)→ 对 Id、Iq 做 PI → 再反变换 → SVPWM 去开六只管子。
入门策略常常是 Id = 0,只管 Iq。位置可以来自磁编码(有感),也可以靠观测器估(无感)。方波电调是六步、两相通电;FOC 是三相连续出力。硬件上都是三相桥,差在 采样和算法,不是差在「有没有六只 MOS」。
有感 FOC 最小集合其实就这些:
- 电角度:SPI 磁编码(不是霍尔的前置)
- 电流:低端分流 + 运放
- 母线电压:给占空比换算、欠压/过压
- 功率级:预驱 + 六管
霍尔接口、CAN、外挂 Flash、LCD,都不是电流环的零件。
2. 示波器上的 MA 不是正弦
MA/MB/MC 是桥臂中点,对地就是 0 和母线之间的方波(开关频率大约 20 kHz)。绕组是电感,电流被积得比较圆;电压要经过 RC 低通(板上电压采样大约 167 Hz 截止)才会变成「马鞍」或近似正弦的平均值。
所以:
- 调试逻辑看
HIN/LIN、采样触发看TIM1_CH4(有的图叫APH4) - 看相电压看分压后的
VA/VB/VC - 不必再给高压相线做一套示波器 RC;和 ADC 采样重复,还把高压引到调试座上
APH4 不是用来「校准定时器准不准」的,而是看 ADC 卡在 PWM 周期的哪一点(通常在中央,躲开开关尖峰)。触发在芯片内部已经连上,脚可以不引出。
3. 预驱:MCU 为什么推不动栅极
STM32 的 3.3 V GPIO 既没有十几伏的 Vgs,也灌不出开通瞬间的安培级电流;上管源极还跟着相线在 0~母线之间飞。所以中间是 FD6288 这类芯片:下管用芯片地作参考,上管用 VB/VS 自举 造一个浮地 12 V。
栅极那一组分立件也很典型:
- 22 Ω:开通走电阻,开慢一点,少 EMI、少直通
- 反并二极管:关断走二极管,关快一点
- 10 kΩ 栅源:没驱动时默认关
- 1 nF 栅源:压振荡、缓和米勒
自举二极管要用 肖特基(或超快恢复),耐压按 母线 选,不是按 12 V 选。上管一开,二极管阴极会到「母线+12 V」,普通 1N4007 来不及关断,会倒抽自举电容。12/24 V 母线可以用 60 V 管;要做到 48 V,换 100 V。电容跨在 VB–VS 上,耐压按 12 V 档(16 V/25 V 陶瓷),容量按 MOS 的栅极电荷 Qg,常见 100 nF~1 µF,每相一颗。
4. 源极怎么已经有电压了?
手册写:上管开通后源极约等于母线。当时想:不是应该先有 Vgs 才开通吗?源极怎么先变成母线?
顺序其实是:
- 下管开:相线约等于 0,自举电容充到约 12 V。
- 死区过后,芯片把
HO接到VB:这一瞬间源极 仍在 0 附近,Vgs 约等于 12 V,条件先满足。 - 沟道导通,源极 才从 0 被拉到母线;电容电压不能突变,VB 跟着抬,Vgs 一直约 12 V。
两个「12 V」容易混:预驱电源是 12 V(栅源电压);若电池也是 12 V,开通后源极对地碰巧也是 12 V。换 24 V 电池,源极对地变成约 24 V,Vgs 仍是约 12 V。
5. 保护页里那些「一直击穿」的稳压管
入口常有防反接 N-MOS、过压+缓启动 P-MOS。栅极上的 12 V 稳压管(G–S)在输入高于 12 V 时 就是一直击穿的——它钳的是 Vgs,不是把母线降成 12 V。多出来的电压在下拉电阻上。
不必为了「电机是 12 V」再在母线上加一级大电流 Buck。逆变器自己就是斩波器:有效电压约等于 母线 × 占空比。辅助电源那颗 1 A 的 LM5164 只给预驱和 5 V/3.3 V,电机电流不走它。
过压回路上的 1.5 MΩ 反馈和一只小电容,多半是抗抖,不是缓启动的主路径;缓启动主要靠 P-MOS 栅源的 RC,让管子在线性区给母线电容充电。
6. 电源:手册和开源图经常对不上
同步降压都有 SW 和 BST:内部上管也是 N-MOS,同样要自举。LDO 没有这两脚。
开源学习板喜欢全板 100 nF。那对 MCU 电源脚是对的,对 LDO/Buck 的 输出电容 往往偏小:
- XC6210 / LP5907:手册要 ≥1 µF,只焊 100 nF 能亮,环路和噪声不保证
- RY8411 输出:手册 22 µF×2,四颗 100 nF 差两个数量级
- LM5164 输入改成 10 µF、输出改成几颗 10 µF 陶瓷,属于同量级替换,和上面不是一类问题
STM32G431 的 USB:手册写明 片内已经含匹配阻抗,D+/D− 不必外串 22 Ω(F1 时代的习惯)。Type-C 当设备时,CC1/CC2 应各 5.1 kΩ 到地,接到 VBUS 很多 C-to-C 线不会出 5 V。
12 V 滤波一堆 10 µF 里混一颗 1206:主要是 直流偏压下小封装容量缩水,1206/25 V 才更像「真的 10 µF」。不必迷信九颗 0603。
晶振:负载电容是 pF,接在 OSC_IN/OUT 对地;四脚封装的 2、4 脚接地。8 MHz 可以,但要和 CubeMX 的 HSE 一致。
7. 电流采样:中点和开尔文
ADC 不能采负压,零电流要落在 1.65 V。AVCC 分压再经跟随器得到 VREF,运放做成:
ADC电压 ≈ VREF + 20 × I × 1mΩ
正电流往 3.3 V 走,负电流往 0 走。学习板用 电阻分压 + 跟随器 就够,不必 DAC。运放在 3.3 V 上尽量选轨到轨,老 LM321 的输出摆幅卡在 1.65 V 边上。
1 mΩ 两端若在原理图里都叫 GND,铺铜时采样会贴到大电流回流上。Net Tie / 短接符号是为了:只在电阻焊盘处 把采样网和功率地连起来。改成导线也能通,但布线仍要从焊盘拉细线,否则几毫欧地弹都会进电流环。
8. 电压采样和无感
有感 FOC 可以不要 VA/VB/VC;建议留一路 VBUS。无感再把三相分压加上。分压到地,二极管到 3.3 V 只是钳位保护,平时反偏;正偏时电流被 20 kΩ 限在几毫安,灌进 VCC 一般能被负载吃掉。
三只 1 kΩ 从 VA/VB/VC 交于 COM,是 虚拟星点,电压约等于 (VA+VB+VC)/3。SVPWM 有共模(马鞍),VA−COM 才更像绕组相对中性点的电压。方波无感拿它比过零;FOC 观测器有了它更干净,但不是「没有 COM 就不能无感」。
无感和有感 功率级可以同一套。差别是:有感要编码(或霍尔);无感要估电角度 θe,低速还要强拖/I-F。没有「无感专用六管桥」。
磁编码:芯片自己测轴上磁铁,SPI 出角度。电机三线霍尔是另一路接口,不是磁编码的前置。
9. 外设:哪些是 FOC,哪些是产品
- LCD:ST7789 四线 SPI(SCK、MOSI、CS)+ DC/RES/背光。背光是屏后面的灯,和图像数据无关。PNP 高边时,
LCD_BLK低电平往往是亮。 - Flash(W25Q16):存字库、多套参数。算法不需要。和 LCD 可共用 SPI3,CS 分开,Flash 的 CS/WP/HOLD 要上拉,上电时 CS 漂低可能误写。
- CAN:多板组网才有意义。单电机学习、USB/UART 调试即可。二维云台是 两台电机 + IMU + 外环,不是加了 CAN 就变成云台;两块驱动之间先串口也行。
- 终端电阻 120 Ω 用模拟开关切换时,控制脚是「电阻使能」,不要和逆变使能共用一根
R_EN。
指示灯不要挂在 LCD_RES、LCD_DC 上,那是功能脚;用户 LED 用空闲 GPIO。R_EN 若只控制 CAN 终端,灯亮表示电阻接上了,不表示电机在转。
10. 还没做完的
二维云台:先让 一个轴 有感闭环,再复制第二块板,主控发两个目标,然后才是 IMU 稳定。一块 G431 学习板按单电机画更稳。
无感可以在同一块硬件上加软件,但先把有感电流环做稳,观测器才有干净的 Ia、Ib。
对照开源原理图时,现在会先问三句:这根网是功率、采样还是逻辑?这个 12 V 是母线、栅极还是芯片电源?这颗电容是环路稳定还是随手去耦?分得清,后面的「为什么一直击穿」「为什么要肖特基」「为什么不是正弦」都会好懂很多。

浙公网安备 33010602011771号