4. Park变换:两相静止坐标系到两相旋转坐标系
好,咱们接着往下走。上一章聊了 Clarke 变换,把三相 ABC 变到了两相静止的 αβ 坐标系。但问题来了——αβ 坐标系里的电流还是正弦波,你想想看,PI 控制器追正弦波,永远追不上,稳态误差是跑不掉的。
那怎么办?把正弦波变成直流。这就是 Park 变换要干的事。
Park 变换,说白了就是把 αβ 两相静止坐标系,旋转一下,变成跟转子磁极同步旋转的 dq 坐标系。这样一来,原本交变的电流分量,在 dq 坐标系里就变成了直流量。PI 控制器追直流量,那叫一个轻松。
核心思想:Park 变换的本质是「坐标旋转」。把静止的 αβ 轴系,旋转一个角度 θ(转子位置角),得到旋转的 dq 轴系。d 轴与转子磁极对齐,q 轴超前 d 轴 90°。
4.1 变换矩阵推导
推导其实不复杂。咱们从几何角度来理解。
假设 αβ 坐标系里有一个矢量,它在 α 轴上的分量为 Iα,在 β 轴上的分量为 Iβ。现在,我们把这个坐标系逆时针旋转 θ 角,得到 dq 坐标系。那么,这个矢量在 dq 坐标系下的分量 Id、Iq 是多少?
画个图就清楚了。我习惯用投影法来记:
- d 轴分量:Iα 在 d 轴上的投影 + Iβ 在 d 轴上的投影
- q 轴分量:Iα 在 q 轴上的投影 + Iβ 在 q 轴上的投影
写成数学表达式:
Id = Iα · cosθ + Iβ · sinθ
Iq = -Iα · sinθ + Iβ · cosθ
写成矩阵形式:
[ Id ] [ cosθ sinθ ] [ Iα ]
[ Iq ] = [ -sinθ cosθ ] [ Iβ ]
这就是 Park 变换矩阵。记法有个小窍门:第一行是 cos 和 sin,第二行是 -sin 和 cos。我当年刚学的时候,老是搞混正负号,后来在项目里烧过一次 MOSFET 之后,就再也没记错过。
我的小技巧:如果你用的是等幅值变换(Clarke 变换系数为 2/3),那么 Park 变换矩阵不需要额外系数。如果你用的是等功率变换,Clarke 和 Park 的系数要统一处理。我个人习惯用等幅值变换,调试时看波形更直观。
4.2 反Park变换
有正变换,自然就有反变换。从 dq 回到 αβ,就是 Park 的逆变换。
因为 Park 变换矩阵是正交矩阵(行列式为 1),它的逆矩阵就是转置矩阵:
[ Iα ] [ cosθ -sinθ ] [ Id ]
[ Iβ ] = [ sinθ cosθ ] [ Iq ]
反 Park 变换在 FOC 里用在哪儿?电压输出环节。PI 控制器算出来的是 dq 坐标系下的电压指令 Vd*、Vq*,但 SVPWM 模块要的是 αβ 坐标系下的电压。所以,必须先用反 Park 变换,把 Vd*、Vq* 变回 Vα*、Vβ*,才能喂给 SVPWM。
4.3 角度θ的重要性
嗯,这里要重点敲黑板。Park 变换里这个 θ,是整个 FOC 的灵魂。
θ 是转子磁极的位置角。它必须实时、准确地反映转子当前的位置。如果 θ 不准,会发生什么?
- θ 偏差 5°:转矩输出会损失约 0.4%,还能转,但效率下降。
- θ 偏差 30°:转矩损失约 13%,电机开始抖。
- θ 偏差 90°:d 轴和 q 轴完全串扰,转矩输出几乎为零,电机可能直接堵转。
我曾经在一个伺服项目里,因为编码器安装时有个 0.5mm 的偏心,导致角度反馈有周期性误差。电机低速运行时,电流波形上出现了明显的 2 次谐波,转矩脉动大得离谱。查了三天,最后用示波器对比编码器 A/B 信号和反电动势过零点,才定位到问题。
避坑指南:千万不要以为角度误差「一点点没关系」。在 FOC 里,角度误差直接映射为电流的 dq 轴耦合。误差越大,你 PI 调得再好也没用。我曾经见过一个团队,花了两周调 PI 参数,电流纹波就是下不去,最后发现是编码器零位偏了 3°。换了个编码器,问题秒解。
4.4 角度获取方式
实际工程中,θ 怎么来?主要有三种方式:
| 方式 | 传感器/方法 | 精度 | 成本 | 适用场景 |
|---|---|---|---|---|
| 绝对式编码器 | 光电/磁编码器 | 高(12-20 bit) | 高 | 伺服、机器人、高端数控 |
| 增量式编码器+初始定位 | 光电/磁编码器 | 中高 | 中 | 通用伺服、工业驱动 |
| 无传感器观测器 | 滑模观测器/磁链观测器 | 中(中高速较好) | 低 | 风机、水泵、家电 |
我个人建议,能上编码器就上编码器。无传感器方案虽然省成本,但低速性能和带载能力差一截。除非你的应用对成本极度敏感,或者工作环境不允许装传感器(比如压缩机内部),否则别省这个钱。
4.5 Park变换在FOC中的位置
咱们把整个 FOC 的电流环串起来看看:
- 采样三相电流 IA、IB、IC
- Clarke 变换 → Iα、Iβ
- Park 变换 → Id、Iq(本章内容)
- Id、Iq 分别与给定值比较,经过 PI 控制器 → Vd*、Vq*
- 反 Park 变换 → Vα*、Vβ*
- SVPWM 调制 → 六路 PWM 驱动逆变器
你看,Park 变换处在电流环的「入口」位置。它把交流量变成了直流量,让 PI 控制器有了用武之地。没有 Park 变换,FOC 就无从谈起。
4.6 代码实现示例
最后,给一段 C 代码。这是我在 STM32F4 上实际跑过的 Park 变换实现:
typedef struct {
float Id; // d轴电流
float Iq; // q轴电流
} DQ_Current;
DQ_Current Park_Transform(float I_alpha, float I_beta, float theta)
{
DQ_Current dq;
float sin_theta = sinf(theta);
float cos_theta = cosf(theta);
dq.Id = I_alpha * cos_theta + I_beta * sin_theta;
dq.Iq = -I_alpha * sin_theta + I_beta * cos_theta;
return dq;
}
DQ_Current Inv_Park_Transform(float Vd, float Vq, float theta)
{
DQ_Current ab;
float sin_theta = sinf(theta);
float cos_theta = cosf(theta);
ab.Id = Vd * cos_theta - Vq * sin_theta; // 这里复用结构体,实际是 V_alpha
ab.Iq = Vd * sin_theta + Vq * cos_theta; // 这里复用结构体,实际是 V_beta
return ab;
}
工程建议:sinf 和 cosf 计算比较耗时。如果 MCU 没有硬件 FPU 或三角函数加速指令,建议用查表法或者 CORDIC 算法。我在一个低成本 MCU 项目里,用 256 点的 sin 表 + 线性插值,角度分辨率达到 1.4°,完全够用,计算时间从 12μs 降到了 1.5μs。