【三相PMSM】的坐标变换
@
0. 引言
三相交流电机的定子电流是交流量,幅值和相位随时间变化,直接去"稳住"它非常困难。磁场定向控制(FOC)的核心思路,就是通过坐标变换把旋转的三相交流量,等效成一个静止的直流量,从而像控制直流电机一样,用 PI 调节器实现对磁链和转矩的解耦控制。
整个变换路径为:
本篇文章从几何意义出发,逐一对 Clarke 变换、逆 Clarke 变换、Park 变换、逆 Park 变换 进行推导,给出矩阵形式、代码实现和工程中容易踩的坑。
1. 三种坐标系与变换链路
1.1 三种坐标系
| 坐标系 | 名称 | 特点 | 常用符号 |
|---|---|---|---|
| ABC | 三相静止自然坐标系 | 三相绕组空间相差 120°,电流为交流量 | \(i_A, i_B, i_C\) |
| α-β | 两相静止坐标系 | α 轴取 A 相轴线,β 轴逆时针超前 α 轴 90°,电流仍为交流量 | \(i_\alpha, i_\beta\) |
| d-q | 两相旋转坐标系 | d 轴与转子磁链对齐,随转子以 \(\omega_e\) 同步旋转,电流为直流量 | \(i_d, i_q\) |
下面这张图直观展示了 α-β 静止坐标系、d-q 旋转坐标系以及三相绕组 B、C 之间的空间角度关系:

从图中可以读出关键角度信息:
- α 轴:水平向右,作为角度基准(0°);
- β 轴:竖直向上,与 α 轴垂直(90°);
- B 相绕组轴线:与 α 轴夹角 120°;
- C 相绕组轴线:与 α 轴夹角 240°(即 -120°),B、C 相差 120°;
- d 轴:相对 α 轴偏转 \(\theta_e\)(电角度);
- ωₑ:d-q 坐标系的同步旋转角速度,且 \(\theta_e = \omega_e t\);
- q 轴:超前 d 轴 90°(图中未标出,垂直于 d 轴)。
1.2 整体变换链路

为什么 d-q 坐标下电流是直流量? 因为 d-q 坐标系与磁链同步旋转,d 轴始终对准磁链方向,于是 d 轴分量 \(i_d\)(励磁电流)和 q 轴分量 \(i_q\)(转矩电流)相对坐标系静止不变,PI 才能稳态无静差地调节。
2. Clarke 变换(3s/2s):三相 → 两相静止
2.1 变换思想
Clarke 变换把三相绕组(空间相差 120°)的电流,投影到两相正交的 α-β 轴上。结合上图:B 相在 120°、C 相在 240°,把它们分别向 α 轴(0°)和 β 轴(90°)做投影,再叠加,就得到等效的两相电流 \(i_\alpha\)、\(i_\beta\)。
投影关系(角度以 α 轴为基准,逆时针为正):
2.2 等幅值 Clarke 变换(最常用)
为了让变换后的 α 分量幅值等于相电流幅值,取系数 \(\frac{2}{3}\) (第三行是零序分量)(原来\(A\)相的电流经过clark变化后再\(\alpha\)轴上被放大了 \(\frac{3}{2}\)倍,所以要使用 \(\frac{2}{3}\)放因子来进行等幅值缩放):
写成常用的两行形式(忽略零轴,或考虑三线制 \(i_A+i_B+i_C=0\)):
展开为标量形式:
三相平衡简化:当 \(i_A+i_B+i_C=0\) 时,等幅值 Clarke 可进一步简化为:
这一形式在嵌入式实现中非常常用(少一次乘法)。
2.3 等功率(正交)Clarke 变换
等功率变换保证变换前后功率不变,系数取 \(\sqrt{\frac{2}{3}}\):
两者关系:等幅值变换前后幅值不变但功率变了(功率为原来的 1.5 倍);等功率变换前后功率不变但幅值变为 \(\sqrt{\frac{3}{2}}\) 倍。工程上 STM32、TI 等平台驱动电机多用等幅值(和 SVPWM 的电压利用率配合更直观)。
2.4 零轴分量 \(i_0\)
三线制电机(星形/三角形,无中线)有 \(i_A+i_B+i_C=0\),零轴分量恒为零,可忽略。只有带中线的四线制系统才需要保留零轴。
3. 逆 Clarke 变换(2s/3s):两相静止 → 三相
由 Clarke 变换矩阵求逆(注意逆矩阵不再含 \(\frac{2}{3}\) 系数):
标量形式:
注意系数:等幅值 Clarke 的前向变换带 \(\frac{2}{3}\),但逆变换系数为 1(不需要 \(\frac{2}{3}\))。原因是正逆变换合起来要保证"先正后逆回到原三相"。而等功率 Clarke 正逆变换都带 \(\sqrt{\frac{2}{3}}\)。混用等幅值前向 + 等功率逆向会得到错误结果,这是最常见的坑。
4. Park 变换(2s/2r):两相静止 → 两相旋转
4.1 变换思想
Park 变换把静止的 α-β 坐标,旋转 \(\theta_e\) 角到与磁链同步的 d-q 坐标系。结合图:d 轴相对 α 轴偏转 \(\theta_e\),q 轴垂直 d 轴。把 \(\alpha\beta\) 分量向 d、q 轴投影即可。
标量形式:
相位约定:上式是"d 轴对齐磁链"的常用惯例(转子磁场定向)。d-q 旋转矩阵是一个正交矩阵,其行列式为 1,是纯旋转,不改变矢量幅值。
5. 逆 Park 变换(2r/2s):两相旋转 → 两相静止
由于旋转矩阵是正交矩阵(\(R^{-1} = R^T\)),求逆只需转置:
标量形式:
逆 Park 变换在 FOC 的电压重构阶段使用:PI 输出的 \(u_d, u_q\) 先逆 Park 得到 \(u_\alpha, u_\beta\),再逆 Clarke 得到三相电压参考,最后交给 SVPWM。
6. 四种变换汇总
| 变换 | 方向 | 变换矩阵 | 系数 | 说明 |
|---|---|---|---|---|
| Clarke 正变换 | ABC → αβ | \(\begin{bmatrix}1&-\frac12&-\frac12\\0&\frac{\sqrt3}{2}&-\frac{\sqrt3}{2}\end{bmatrix}\) | \(\frac{2}{3}\)(等幅值) \(\sqrt{\frac{2}{3}}\)(等功率) |
三相 → 两相静止 |
| 逆 Clarke | αβ → ABC | \(\begin{bmatrix}1&0\\-\frac12&\frac{\sqrt3}{2}\\-\frac12&-\frac{\sqrt3}{2}\end{bmatrix}\) | \(1\)(等幅值) \(\sqrt{\frac{2}{3}}\)(等功率) |
两相静止 → 三相 |
| Park 正变换 | αβ → dq | \(\begin{bmatrix}\cos\theta_e&\sin\theta_e\\-\sin\theta_e&\cos\theta_e\end{bmatrix}\) | \(1\) | 两相静止 → 两相旋转 |
| 逆 Park | dq → αβ | \(\begin{bmatrix}\cos\theta_e&-\sin\theta_e\\\sin\theta_e&\cos\theta_e\end{bmatrix}\) | \(1\) | 两相旋转 → 两相静止 |
记忆口诀:Clarke 管"三相↔两相"、系数 2/3;Park 管"静止↔旋转"、靠 θₑ 旋转、系数 1、逆变换就是转置。
7. FOC 信号流图

完整闭环中,θₑ(转子电角度)由编码器或无感观测器实时估计,d-q 坐标才跟得上磁链。
8. C 语言实现(等幅值,float)
8.1 Clarke 变换
#include <math.h>
// 等幅值 Clarke 变换:三相 ABC → αβ
// 输入: ia, ib, ic 三相电流
// 输出: *ialpha, *ibeta
void clarke(float ia, float ib, float ic, float *ialpha, float *ibeta)
{
const float INV_SQRT3 = 1.0f / 1.7320508075688772f; // 1/√3
*ialpha = (2.0f / 3.0f) * (ia - 0.5f * ib - 0.5f * ic);
*ibeta = INV_SQRT3 * (ib - ic); // 简化形式
}
8.2 逆 Clarke 变换
// 等幅值逆 Clarke 变换:αβ → 三相 ABC
void inverse_clarke(float ialpha, float ibeta, float *ia, float *ib, float *ic)
{
const float SQRT3 = 1.7320508075688772f;
*ia = ialpha;
*ib = -0.5f * ialpha + (SQRT3 / 2.0f) * ibeta;
*ic = -0.5f * ialpha - (SQRT3 / 2.0f) * ibeta;
}
8.3 Park 变换
// Park 变换:αβ → dq(θe 为转子电角度,rad)
void park(float ialpha, float ibeta, float theta, float *id, float *iq)
{
float c = cosf(theta);
float s = sinf(theta);
*id = ialpha * c + ibeta * s;
*iq = -ialpha * s + ibeta * c;
}
8.4 逆 Park 变换
// 逆 Park 变换:dq → αβ
void inverse_park(float id, float iq, float theta, float *ialpha, float *ibeta)
{
float c = cosf(theta);
float s = sinf(theta);
*ialpha = id * c - iq * s;
*ibeta = id * s + iq * c;
}
工程优化提示:
- 若 θₑ 来自编码器,可用查表法(LUT)或 CORDIC 替代
cosf/sinf提高实时性;- 多个变换可合并(如 Clarke+Park 合成一个矩阵),减少乘法;
- 定点 DSP 上注意 Q 格式定标。

浙公网安备 33010602011771号