跳到正文
孔乙己

FOC:从 Clarke/Park 变换到 SVPWM

推导磁场定向控制如何把三相电机变成"直流电机"来控制:坐标变换、dq 电机模型、电流环 PI 整定与空间矢量调制的完整链路。

机器人,关节与驱动5分钟阅读

机器人关节里的电机绝大多数是永磁同步电机(PMSM)或无刷直流电机(BLDC)。它们没有电刷换向器,想让转子持续转动,必须由控制器主动决定“什么时刻给哪相绕组通多大电流”。磁场定向控制(Field-Oriented Control,FOC)要回答的问题是:

给定期望转矩,三相绕组的电流应该如何随转子位置实时变化,才能像直流电机那样——电流与转矩成正比、且每安培电流产生的转矩最大?

本文按信号流的顺序推导 FOC 的完整链路:为什么转矩只和一个分量有关、Clarke/Park 变换如何把三相交流量变成两个直流量、dq 模型下电流环怎么整定、以及 SVPWM 如何把电压指令变成六个开关管的通断。

有刷直流电机的转矩公式是 Te=KT iT_e = K_T \, i:电刷和换向器用机械方式保证了电枢磁场始终与定子磁场垂直,所以转矩直接正比于电流,控制器只需要一个电流环。

PMSM 去掉了电刷,转子上是永磁体,磁场随转子一起旋转。定子三相绕组在空间上相差 120°,通电后合成一个磁场矢量。转矩来自定子磁场与转子磁场的相互作用:

Te∝∣ψs∣∣ψr∣sin⁡δT_e \propto \left|\boldsymbol\psi_s\right| \left|\boldsymbol\psi_r\right| \sin\delta

其中 δ\delta 是两个磁场的夹角。要转矩最大且平稳,就要让定子磁场始终领先转子磁场 90° 电角度。转子在转,所以定子电流必须是随转子位置变化的三相正弦量——直接在 abc 三相坐标下用 PI 控制三个正弦电流是不现实的:PI 对正弦给定存在稳态幅值与相位误差,且转速越高误差越大。

FOC 的思路是换坐标系:跳到与转子同步旋转的坐标系上看,三相正弦电流就变成了两个直流量,PI 控制器对直流量可以做到无稳态误差。这就是接下来两个变换的动机。

三相绕组电流 ia,ib,ici_a, i_b, i_c 在空间上相差 120°,合成的电流矢量可以用一个两维静止直角坐标系(αβ 系,α 轴与 a 相轴线重合)等价表示。取等幅值约定(amplitude-invariant):

[iαiβ]=23[1−12−12032−32][iaibic]\begin{bmatrix} i_\alpha \ i_\beta \end{bmatrix} = \frac{2}{3} \begin{bmatrix} 1 & -\tfrac{1}{2} & -\tfrac{1}{2} \[2pt] 0 & \tfrac{\sqrt3}{2} & -\tfrac{\sqrt3}{2} \end{bmatrix} \begin{bmatrix} i_a \ i_b \ i_c \end{bmatrix}

**系数 23\tfrac23 从哪来?**把三相合成的电流矢量写成复数形式,三个绕组轴线方向分别是 1,a,a21, \mathbf a, \mathbf a^2(a=ej2π/3\mathbf a = e^{j 2\pi/3}),合成矢量取

i⃗s=k(ia+a ib+a2ic)\vec i_s = k\left(i_a + \mathbf a, i_b + \mathbf a^2 i_c\right)

代入对称三相电流 ia=Icos⁡θi_a = I\cos\theta、ib=Icos⁡(θ−2π3)i_b = I\cos(\theta - \tfrac{2\pi}{3})、ic=Icos⁡(θ+2π3)i_c = I\cos(\theta + \tfrac{2\pi}{3}),用 cos⁡x=12(ejx+e−jx)\cos x = \tfrac12(e^{jx} + e^{-jx}) 展开。正频分量 ejθe^{j\theta} 的系数是 I2(1+a a−1⋅1+a2a−2)=3I2\tfrac{I}{2}(1 + \mathbf a\,\mathbf a^{-1}\cdot 1 + \mathbf a^2 \mathbf a^{-2}) = \tfrac{3I}{2},负频分量的系数是 I2(1+a a−2⋯ )=I2(1+a2+a4)=0\tfrac{I}{2}(1 + \mathbf a\, \mathbf a^{-2}\cdots) = \tfrac{I}{2}(1 + \mathbf a^2 + \mathbf a^4) = 0(三次单位根之和为零)。于是

i⃗s=k 3I2 ejθ\vec i_s = k,\frac{3I}{2}, e^{j\theta}

——三相对称电流合成一个幅值恒定、匀速旋转的矢量,取 k=23k = \tfrac23 恰好让矢量幅值等于相电流幅值 II,这就是等幅值约定;取 k=2/3k = \sqrt{2/3} 则保持功率不变(等功率约定),两种约定的转矩公式差一个系数,混用是新手常见错误。上面的矩阵就是 k=23k = \tfrac23 时取实部、虚部的结果。

星形接法且中性点不引出时 ia+ib+ic=0i_a + i_b + i_c = 0,代入可消去一相:

iα=ia,iβ=ia+2ib3i_\alpha = i_a, \qquad i_\beta = \frac{i_a + 2 i_b}{\sqrt3}

所以实际采样两相电流即可。变换后 iα,iβi_\alpha, i_\beta 仍是正弦量——坐标系还没有转起来。

把 αβ 系绕原点旋转电角度 θe\theta_e(转子磁链方向定义为 d 轴,超前 90° 为 q 轴),得到 dq 旋转坐标系:

\begin{bmatrix} \cos\theta_e & \sin\theta_e \ -\sin\theta_e & \cos\theta_e \end{bmatrix} \begin{bmatrix} i_\alpha \ i_\beta \end{bmatrix}

Clarke 与 Park 变换的矢量关系 同一个电流矢量 isi_s:在 αβ 静止系下两个分量是正弦量,转到与转子同步的 dq 系下变成两个直流量

在稳态下电流矢量与转子同步旋转,因此 id,iqi_d, i_q 是直流量。物理含义非常清晰:

  • idi_d:与转子磁链同向的分量,改变气隙磁场强弱(励磁分量);
  • iqi_q:与转子磁链垂直的分量,产生转矩(转矩分量)。

注意 θe\theta_e 是电角度:极对数为 pp 的电机,θe=p θm\theta_e = p\,\theta_m。编码器给出机械角 θm\theta_m 后还要乘极对数、再对齐零位(通常上电时给 d 轴注入电流把转子拉到已知位置来标定)。

电压方程不需要背,它是“换到旋转坐标系”这一个动作的必然产物,推一遍就记住了。静止 αβ 系下,定子回路就是电阻加磁链变化率(法拉第定律):

u⃗αβ=Rs i⃗αβ+dψ⃗αβdt\vec u_{\alpha\beta} = R_s, \vec i_{\alpha\beta} + \frac{\mathrm d \vec\psi_{\alpha\beta}}{\mathrm d t}

把任意矢量换到以 θe\theta_e 旋转的 dq 系:x⃗αβ=x⃗dq ejθe\vec x_{\alpha\beta} = \vec x_{dq}\, e^{j\theta_e}。关键一步是对乘积求导——旋转坐标系里求导要多出一项:

dx⃗αβdt=dx⃗dqdtejθe+jωe x⃗dq ejθe⟹ddt∣αβ=ddt∣dq+jωe\frac{\mathrm d \vec x_{\alpha\beta}}{\mathrm d t} = \frac{\mathrm d \vec x_{dq}}{\mathrm d t} e^{j\theta_e} + j\omega_e, \vec x_{dq}, e^{j\theta_e} \quad\Longrightarrow\quad \left.\frac{\mathrm d}{\mathrm d t}\right|{\alpha\beta} = \left.\frac{\mathrm d}{\mathrm d t}\right|{dq} + j\omega_e

(这正是理论力学里“旋转系中的科氏项”,只是写成了复数。)代入电压方程并约去 ejθee^{j\theta_e}:

u⃗dq=Rs i⃗dq+dψ⃗dqdt+jωe ψ⃗dq\vec u_{dq} = R_s, \vec i_{dq} + \frac{\mathrm d \vec\psi_{dq}}{\mathrm d t} + j\omega_e, \vec\psi_{dq}

dq 系的好处在磁链表达式上兑现:d 轴对准转子磁链后,ψd=Ldid+ψf\psi_d = L_d i_d + \psi_f、ψq=Lqiq\psi_q = L_q i_q(ψf\psi_f 是永磁体磁链,在 dq 系里是常数——这就是换坐标系的全部动机)。代入并把 jωeψ⃗dq=jωe(ψd+jψq)=−ωeψq+jωeψdj\omega_e \vec\psi_{dq} = j\omega_e(\psi_d + j\psi_q) = -\omega_e \psi_q + j\omega_e \psi_d 按实部(d)、虚部(q)拆开:

ud=Rsid+Lddiddt−ωeLqiquq=Rsiq+Lqdiqdt+ωeLdid+ωeψf\begin{aligned} u_d &= R_s i_d + L_d \frac{\mathrm d i_d}{\mathrm d t} - \omega_e L_q i_q \[4pt] u_q &= R_s i_q + L_q \frac{\mathrm d i_q}{\mathrm d t} + \omega_e L_d i_d + \omega_e \psi_f \end{aligned}

三个“多出来”的项全部来自那一个 jωej\omega_e:

  • −ωeLqiq-\omega_e L_q i_q 与 +ωeLdid+\omega_e L_d i_d:交叉耦合项,d、q 轴互相干扰——本质是旋转系里的运动电动势;
  • ωeψf\omega_e \psi_f:反电动势,随转速线性增大——永磁磁链在旋转系里“看似不动”,但它对静止绕组的相对运动实实在在地感应电压。

转矩方程为

Te=32p[ψfiq+(Ld−Lq) idiq]T_e = \frac{3}{2} p \left[ \psi_f i_q + (L_d - L_q), i_d i_q \right]

对 SPMSM,第二项(磁阻转矩)为零,于是

Te=32p ψf iq=KT iqT_e = \frac{3}{2} p, \psi_f, i_q = K_T, i_q

这就是 FOC 的全部要点:只要坐标变换的角度准确,转矩就只由 iqi_q 决定,和直流电机一模一样。控制策略随之明确——SPMSM 令 id∗=0i_d^* = 0(每安培电流转矩最大);IPMSM 则按最大转矩电流比(MTPA)分配 id∗,iq∗i_d^*, i_q^*,利用磁阻转矩多出一部分力矩。

令 id\*=0i_d^\*=0 并把耦合项当作扰动前馈补偿掉之后,d、q 两轴各自退化为一阶惯性对象:

G(s)=i(s)u(s)=1Ls+RsG(s) = \frac{i(s)}{u(s)} = \frac{1}{L s + R_s}

用 PI 控制器 C(s)=Kp+KisC(s) = K_p + \dfrac{K_i}{s} 做零极点对消:取

KpKi=LRs⟹C(s)G(s)=KpLs\frac{K_p}{K_i} = \frac{L}{R_s} \quad\Longrightarrow\quad C(s)G(s) = \frac{K_p}{L s}

闭环变成标准一阶系统,带宽 ωc=Kp/L\omega_c = K_p / L。于是整定公式简单到可以背下来:

Kp=ωcL,Ki=ωcRsK_p = \omega_c L, \qquad K_i = \omega_c R_s

工程上电流环带宽通常取 PWM 频率的 1/20 ~ 1/10(例如 20 kHz PWM 配 1~2 kHz 电流环带宽),再往上会被采样延迟和逆变器死区破坏相位裕度。两点实践细节:

  • 解耦前馈:把 −ωeLqiq-\omega_e L_q i_q、+ωeLdid+ωeψf+\omega_e L_d i_d + \omega_e \psi_f 直接加到 PI 输出上,高速时尤其重要,否则 q 轴阶跃会在 d 轴激起明显扰动;
  • 抗积分饱和:电压指令受母线电压限制(下一节的六边形),PI 必须做 back-calculation 或 clamping,否则减速时会出现长时间的转矩失控。

电流环输出的是 dq 系电压指令 ud\*,uq\*u_d^\*, u_q^\*,反 Park 变换回 αβ 系得到 uα\*,uβ\*u_\alpha^\*, u_\beta^\*。最后一步是让三相两电平逆变器“输出”这个电压矢量。

三相桥有 23=82^3 = 8 种开关组合。先算清基本矢量的幅值:以状态 100(A 相上管通、B/C 下管通)为例,三相端电压为 (23Udc,−13Udc,−13Udc)(\tfrac{2}{3}U_{dc}, -\tfrac13 U_{dc}, -\tfrac13 U_{dc})(对中性点,由星形绕组分压得出),代入 Clarke 变换得 U⃗1=23Udc∠0°\vec U_1 = \tfrac23 U_{dc} \angle 0°。六个非零矢量幅值均为 23Udc\tfrac23 U_{dc}、彼此相隔 60°,把平面分成六个扇区;000 与 111 两个零矢量位于原点。

SVPWM 六个基本电压矢量与参考矢量合成 参考矢量落在扇区 I 时,用相邻的 U⃗1\vec U_1、U⃗2\vec U_2 与零矢量按伏秒平衡合成

逆变器一个周期内只能输出这 8 个离散矢量,怎么“输出”任意的 U⃗ref\vec U_{ref}?答案是时间平均——伏秒平衡:电流环的等效对象是电感,电感电流的增量由电压对时间的积分(伏秒积)决定,只要一个开关周期 TsT_s 内的伏秒积相同,对电流的作用就等效:

U⃗ref Ts=U⃗1T1+U⃗2T2+U⃗0,7 T0\vec U_{ref}, T_s = \vec U_1 T_1 + \vec U_2 T_2 + \vec U_{0,7}, T_0

设 U⃗ref\vec U_{ref} 幅值 UU、幅角 θ\theta 落在扇区 I。把矢量方程按实轴、虚轴投影成两个标量方程(U⃗1\vec U_1 沿 0°0°,U⃗2\vec U_2 沿 60°60°):

Ucos⁡θ⋅Ts=23Udc(T1+T2cos⁡60°)=23Udc(T1+12T2)Usin⁡θ⋅Ts=23Udc T2sin⁡60°=Udc3 T2\begin{aligned} U\cos\theta \cdot T_s &= \tfrac23 U_{dc}\left(T_1 + T_2 \cos 60°\right) = \tfrac23 U_{dc}\left(T_1 + \tfrac12 T_2\right) \ U\sin\theta \cdot T_s &= \tfrac23 U_{dc}, T_2 \sin 60° = \tfrac{U_{dc}}{\sqrt3}, T_2 \end{aligned}

第二式直接给出 T2T_2;代回第一式,用差角公式 32cos⁡θ−12sin⁡θ=sin⁡(π3−θ)\tfrac{\sqrt3}{2}\cos\theta - \tfrac12\sin\theta = \sin(\tfrac{\pi}{3} - \theta) 整理出 T1T_1:

T1=3 Ts UUdcsin⁡ ⁣(π3−θ),T2=3 Ts UUdcsin⁡θ,T0=Ts−T1−T2T_1 = \frac{\sqrt3, T_s, U}{U_{dc}} \sin!\left(\frac{\pi}{3} - \theta\right), \qquad T_2 = \frac{\sqrt3, T_s, U}{U_{dc}} \sin\theta, \qquad T_0 = T_s - T_1 - T_2

两个作用时间恰好是 U⃗ref\vec U_{ref} 到扇区两条边的“角度距离”的正弦——图中绿色、橙色两段分解即是。T0≥0T_0 \ge 0 是可行性条件,它等价于 U⃗ref\vec U_{ref} 落在六边形内。其余扇区不用重新推导:把 θ\theta 减去扇区起始角(60°60° 的整数倍)即可复用同一组公式,这也是代码里“扇区判断 + 查表”结构的由来。

把 T0T_0 均分给 000 与 111 并对称排列(七段式:U⃗0 U⃗1 U⃗2 U⃗7 U⃗2 U⃗1 U⃗0\vec U_0\,\vec U_1\,\vec U_2\,\vec U_7\,\vec U_2\,\vec U_1\,\vec U_0),每个周期内每相只开关两次,谐波性能最优。

线性调制区的极限是参考矢量圆内切于六边形:

∣U⃗ref∣max=Udc3≈0.577 Udc\left|\vec U_{ref}\right|{max} = \frac{U{dc}}{\sqrt3} \approx 0.577, U_{dc}

比普通正弦 PWM 的 0.5 Udc0.5\,U_{dc} 高约 15.5%——这就是 SVPWM 直流母线利用率更高的确切含义。实现上不必真的做扇区判断和三角函数:注入共模三次谐波(min-max 中点平移)的载波调制与七段式 SVPWM 在数学上等价,代码只有几行。

flowchart LR subgraph 每个 PWM 周期执行 A[采样 ia、ib<br/>读取编码器 θm] --> B[Clarke 变换<br/>iα、iβ] B --> C[Park 变换<br/>id、iq] C --> D[d 轴 PI:id* = 0<br/>q 轴 PI:iq* 来自速度环] D --> E[解耦 + 反电动势前馈] E --> F[反 Park 变换<br/>uα*、uβ*] F --> G[SVPWM<br/>三相占空比] G --> H[三相逆变桥] end H --> M[PMSM] M -->|相电流| A M -->|转子位置| A

外面再套速度环和位置环就是机器人关节常见的三环结构。各环带宽按约一个数量级递减(例如电流环 1 kHz、速度环 100 Hz、位置环 20 Hz),保证内环对外环近似为理想执行器:

ωpos≪ωvel≪ωcur≪ωPWM\omega_{pos} \ll \omega_{vel} \ll \omega_{cur} \ll \omega_{PWM}

真正把 FOC 跑在 MCU 上,坑几乎都不在算法本身:

  1. 电流采样时刻:低边采样电阻方案只能在下管导通时采样,ADC 触发必须与 PWM 计数器中心对齐;占空比接近 100% 时下管导通窗口太短,要做最小脉宽限制或移相。
  2. 电角度标定:编码器零位和 d 轴的偏差直接变成转矩损失(cos⁡Δθ\cos\Delta\theta)和 d 轴扰动。标定方法:给 id>0,iq=0i_d > 0, i_q = 0 强制转子对齐,记录此时编码器读数。
  3. 死区补偿:上下管互锁死区(典型 0.5~2 μs)造成电压畸变,低速轻载时表现为电流过零附近的爬行和噪声,需按电流方向做补偿。
  4. 速度测量:低速时编码器脉冲计数噪声大,用 M/T 法或对位置做跟踪微分器/PLL 提取速度。
  5. 执行时序:整条链路(采样 → 变换 → PI → SVPWM 装载比较寄存器)必须在一个 PWM 周期内完成,20 kHz 下预算只有 50 μs,三角函数用查表或 CORDIC。

两个常见扩展,思路在 dq 模型里都已经埋好:

  • 弱磁(field weakening):反电动势 ωeψf\omega_e\psi_f 随转速增大,逼近电压极限 ud2+uq2≤Umax2u_d^2 + u_q^2 \le U_{max}^2 后电流环失去调节余量。解决办法是注入负的 idi_d 抵消一部分永磁磁链,用铜损换转速上限,电流工作点沿电压极限椭圆滑动。
  • 无传感器(sensorless):中高速用反电动势观测器(滑模观测器或磁链观测器)从 uαβ,iαβu_{\alpha\beta}, i_{\alpha\beta} 反推 θe\theta_e;零低速反电动势太小,改用高频注入(HFI)利用 Ld≠LqL_d \ne L_q 的凸极性提取位置。云台、风机类负载常用纯无感方案,机器人关节因为要做位置控制,一般仍配编码器。

模块 输入 → 输出 关键结论
Clarke iabc→iαβi_{abc} \to i_{\alpha\beta} 三相冗余信息压缩为两维,采两相电流即可
Park iαβ→idqi_{\alpha\beta} \to i_{dq} 正弦量变直流量,PI 无稳态误差成为可能
dq 模型 — Te=32pψfiqT_e = \tfrac32 p \psi_f i_q,转矩控制退化为 iqi_q 控制
电流环 PI idq\*→udq\*i_{dq}^\* \to u_{dq}^\* 零极点对消:Kp=ωcLK_p = \omega_c L,Ki=ωcRsK_i = \omega_c R_s
SVPWM uαβ\*→u_{\alpha\beta}^\* \to 占空比 母线利用率 Udc/3U_{dc}/\sqrt3,比 SPWM 高 15.5%

FOC 的本质一句话就能说完:用准确的转子角度做坐标变换,把交流电机的转矩控制问题变换成两个直流量的调节问题。链路里每一环(角度、采样时刻、死区、带宽分配)损失的精度,最后都会以转矩纹波和噪声的形式还回来。

  • P. C. Krause, O. Wasynczuk, S. D. Sudhoff. Analysis of Electric Machinery and Drive Systems. Wiley-IEEE Press.
  • R. Krishnan. Permanent Magnet Synchronous and Brushless DC Motor Drives. CRC Press.
  • 阮毅, 陈伯时. 《电力拖动自动控制系统——运动控制系统》. 机械工业出版社.
  • TI Application Report: Field Orientated Control of 3-Phase AC-Motors (BPRA073).

评论