4. Park变换:两相静止坐标系到两相旋转坐标系
好,咱们接着往下走。上一节我们把三相电流硬生生掰成了两相静止的 Iα 和 Iβ,这步叫 Clarke 变换。但问题来了——这两个量还是交流的,随转子位置变化而变化。你想想看,如果控制器要跟踪一个正弦波,那带宽和增益都得留很大余量,控制精度也上不去。
所以就有了 Park 变换。它的任务很简单:把两相静止坐标系下的交流量,变成两相旋转坐标系下的直流量。说白了,就是让控制器的参考值变成常数,而不是正弦波。我当年第一次调 FOC 的时候,看到示波器上 Id 和 Iq 变成两条直线,心里那个爽啊——终于知道自己在控什么了。
核心思想一句话:Park 变换的本质是“坐标旋转”。你站在原地看,电流在转;你跟着转子一起转,电流就不动了。
4.1 数学推导:从静止到旋转
先明确一下坐标系:
- α-β 轴:两相静止坐标系,α 轴与 A 相重合,β 轴超前 90°。
- d-q 轴:两相旋转坐标系,d 轴与转子磁极方向对齐,q 轴超前 90°。
- θ:转子电角度,也就是 d 轴与 α 轴之间的夹角。
现在,假设我们在 α-β 坐标系下有一个向量 I,它的分量为 Iα 和 Iβ。我们要把这个向量投影到旋转的 d-q 坐标系上。这其实就是二维平面上的旋转投影问题——高中数学就够用了。
看图:
从几何上看,向量 I 在 d 轴上的投影就是 Iα 和 Iβ 分别投影到 d 轴再相加。d 轴与 α 轴的夹角是 θ,所以:
- Iα 在 d 轴上的投影 = Iα · cosθ
- Iβ 在 d 轴上的投影 = Iβ · sinθ
- Id = Iα · cosθ + Iβ · sinθ
同理,q 轴与 α 轴的夹角是 θ + 90°,cos(θ+90°) = -sinθ,sin(θ+90°) = cosθ,所以:
- Iα 在 q 轴上的投影 = Iα · (-sinθ)
- Iβ 在 q 轴上的投影 = Iβ · cosθ
- Iq = -Iα · sinθ + Iβ · cosθ
写成矩阵形式就是:
[ Id ] [ cosθ sinθ ] [ Iα ]
[ Iq ] = [ -sinθ cosθ ] [ Iβ ]
这个矩阵就是 Park 变换矩阵。你仔细看,它其实就是二维旋转矩阵的变体——把向量从静止坐标系“转”到了旋转坐标系。
我的小技巧:记这个矩阵不用死背。你只要记住“d 轴是 cosθ 和 sinθ 的正向组合,q 轴是 -sinθ 和 cosθ 的组合”就行。我每次写代码前都在草稿纸上画个十字轴,推一遍,十秒钟搞定。
4.2 物理意义:为什么非要转这么一下?
好,公式推完了。但你可能想问:费这么大劲转一下,到底图什么?
我直接说结论:Park 变换把交流控制变成了直流控制。
在 α-β 坐标系下,Iα 和 Iβ 是正弦波。你让 PID 去跟踪正弦波,带宽得设很高,而且相位滞后很难补偿。但经过 Park 变换后,Id 和 Iq 变成了直流量——Id 对应励磁分量,Iq 对应转矩分量。这时候你用 PI 控制器去跟踪一个常数,那精度和响应速度完全不是一个量级。
再说深一点:
- Id(直轴电流):控制磁通。Id = 0 控制是最常用的,因为永磁体已经提供了磁场,不需要额外励磁。
- Iq(交轴电流):控制转矩。你踩油门加的就是 Iq,它和输出转矩成正比。
这两个量解耦了。你调 Iq 不会影响磁通,调 Id 不会影响转矩——至少在理想情况下是这样。我在做高速主轴电机的时候,就靠这个解耦特性把转速环的带宽推到了 2000 Hz 以上。
注意:解耦是理想情况。实际电机存在交叉耦合效应,高速时反电动势会引入 d-q 轴之间的干扰。这时候需要做前馈解耦补偿,后面章节我会专门讲。
4.3 代码实现:从数学到 C 语言
理论说完了,上代码。我习惯用浮点运算,精度够用,可读性也好。如果你跑在低成本 MCU 上,可以考虑 Q15 或 Q31 定点数,但原理一样。
/**
* Park 变换:将 α-β 静止坐标系电流变换到 d-q 旋转坐标系
* @param Iα α 轴电流分量
* @param Iβ β 轴电流分量
* @param theta 转子电角度(弧度)
* @param Id 输出:d 轴电流
* @param Iq 输出:q 轴电流
*/
void Park_Transform(float Iα, float Iβ, float theta, float *Id, float *Iq) {
float sin_theta = sinf(theta);
float cos_theta = cosf(theta);
*Id = Iα * cos_theta + Iβ * sin_theta;
*Iq = -Iα * sin_theta + Iβ * cos_theta;
}
这段代码没什么花哨的,就是照着公式翻译。但有几个细节我提醒一下:
- 角度单位必须统一。我习惯用弧度,如果你用角度制,记得在调用前转换。
- sin/cos 计算开销。如果 MCU 没有硬件 FPU,sinf/cosf 会吃掉大量 CPU 时间。我一般用查表法或者 CORDIC 算法来加速。
- 角度更新频率。Park 变换每个 PWM 周期都要执行一次,角度 θ 必须与当前时刻的转子位置同步。我踩过这个坑——角度更新慢了半拍,电流波形直接畸变。
避坑指南:我曾经在一个项目里直接用霍尔传感器的原始角度做 Park 变换,结果 Iq 波形上全是毛刺。后来发现霍尔信号有 30° 的电气滞后,必须做角度补偿。解决办法是在软件里加一个滞后补偿表,或者用观测器预估真实角度。
4.4 Park 变换 vs. 逆 Park 变换
有正变换就有逆变换。逆 Park 变换把 d-q 轴的电压指令变回 α-β 坐标系,送给 SVPWM 模块。公式正好反过来:
[ Vα ] [ cosθ -sinθ ] [ Vd ]
[ Vβ ] = [ sinθ cosθ ] [ Vq ]
代码实现:
void InvPark_Transform(float Vd, float Vq, float theta, float *Vα, float *Vβ) {
float sin_theta = sinf(theta);
float cos_theta = cosf(theta);
*Vα = Vd * cos_theta - Vq * sin_theta;
*Vβ = Vd * sin_theta + Vq * cos_theta;
}
你看,正变换和逆变换的矩阵互为转置。这个性质在数学上很漂亮,在工程上也很实用——你只要维护一套 sin/cos 值,正反变换都能用。
| 变换类型 | 输入 | 输出 | 用途 |
|---|---|---|---|
| Park 变换 | Iα, Iβ, θ | Id, Iq | 电流环反馈量 |
| 逆 Park 变换 | Vd, Vq, θ | Vα, Vβ | 电压指令给 SVPWM |
4.5 工程中的常见问题
最后聊几个我实际踩过的坑,你遇到了可以少走弯路:
- 角度抖动导致电流波动:如果编码器分辨率不够或者安装有偏心,θ 会带高频抖动。我建议在角度进入 Park 变换前加一个低通滤波器,或者用锁相环做角度平滑。
- 浮点精度溢出:在 32 位 MCU 上,float 的精度是 7 位有效数字,一般够用。但如果你做积分运算,小心累积误差。我习惯每过一段时间把角度重置到 [0, 2π) 范围内。
- 零速时的角度问题:电机静止时,反电动势为零,观测器估算的角度可能不准。这时候我会切换到开环强制定向,等转速起来再切回闭环。
我的调试习惯:每次写完 Park 变换,我都会在示波器上同时看 Iα、Iβ 和 Id、Iq。如果 Id 和 Iq 在稳态时是平直的直线,说明变换正确;如果还有正弦波动,十有八九是角度不同步或者 sin/cos 算错了。
嗯,Park 变换就讲到这里。你把它理解成“跟着转子一起转着看电流”,后面的电流环设计就顺理成章了。