4、Park变换:两相静止坐标系到两相旋转坐标系变换
好,咱们接着聊。上一节我们把三相电流硬生生掰成了两相静止坐标系下的 Iα 和 Iβ。但问题来了——这两个量还是交流信号,控制器处理起来依然费劲。
那怎么办?
答案就是 Park 变换。它能把静止的 α-β 坐标系,旋转起来,变成跟着转子走的 d-q 坐标系。说白了,就是把交流变直流,让 PID 控制器能像控制直流电机一样去控制永磁同步电机。
4.1 为什么要做 Park 变换?
我个人习惯把 FOC 的核心思想总结成一句话:把交流电机当成直流电机来控。
直流电机为什么好控?因为它的电枢电流和励磁磁场天然正交,你只需要调一个电压值,转矩就跟着线性变。但交流电机不行,三相电流是旋转的,相位、幅值都在变,直接 PID 根本没法下手。
Park 变换就是干这个的。它把静止坐标系下的 Iα、Iβ,投影到一个以转子磁极位置旋转的坐标系上。结果就是:
- d 轴(直轴):对应励磁分量,控制磁场强弱
- q 轴(交轴):对应转矩分量,控制输出转矩
这两个量在稳态下是直流量。你想想看,PID 控直流,那还不是手到擒来?
核心理解:Park 变换的本质是「坐标旋转」,不是「坐标缩放」。它不改变矢量的模长,只是换了个角度看问题。
4.2 数学推导:从几何到公式
咱们先别急着背公式。你想象一下:
α-β 坐标系是固定的,d-q 坐标系跟着转子转,转速是 ωe,角度是 θe。那么,一个空间矢量在 α-β 下的坐标 (Iα, Iβ),在 d-q 下的坐标 (Id, Iq) 是什么?
其实就是个旋转投影问题。高中数学就够用:
Id = Iα * cos(θe) + Iβ * sin(θe)
Iq = -Iα * sin(θe) + Iβ * cos(θe)
写成矩阵形式更清爽:
[ Id ] [ cos(θe) sin(θe) ] [ Iα ]
[ Iq ] = [ -sin(θe) cos(θe) ] [ Iβ ]
嗯,这里要注意:θe 是转子电角度,不是机械角度。如果你用的是表贴式电机,电角度 = 机械角度 × 极对数。内嵌式电机也一样,只是后续的 MTPA 控制会复杂些。
我的经验:我在项目中遇到过好几次,Park 变换出来的 Id、Iq 死活不对。查了半天,发现是角度 θe 的符号搞反了。记住:逆时针为正,和电机正转方向一致。
4.3 逆 Park 变换:从 d-q 回到 α-β
有正变换就有逆变换。控制器算出来的输出电压 Ud、Uq,最终还是要变回三相电压去驱动逆变器。逆 Park 变换公式就是:
Uα = Ud * cos(θe) - Uq * sin(θe)
Uβ = Ud * sin(θe) + Uq * cos(θe)
矩阵形式:
[ Uα ] [ cos(θe) -sin(θe) ] [ Ud ]
[ Uβ ] = [ sin(θe) cos(θe) ] [ Uq ]
你看,其实就是正变换矩阵的转置。因为旋转矩阵是正交矩阵,逆矩阵等于转置矩阵。这个性质在代码里很实用——你只需要写一个旋转函数,正反变换都能用。
4.4 代码实现:C 语言版
好了,理论说完了,咱们直接上代码。这是我个人比较喜欢的一种写法,清晰、高效,适合嵌入式环境:
/**
* @brief Park 变换:静止 α-β 坐标系 → 旋转 d-q 坐标系
* @param Ialpha α 轴电流
* @param Ibeta β 轴电流
* @param theta 转子电角度 (rad)
* @param Id 输出 d 轴电流 (指针)
* @param Iq 输出 q 轴电流 (指针)
*/
void Park_Transform(float Ialpha, float Ibeta, float theta,
float *Id, float *Iq)
{
float sin_theta = sinf(theta);
float cos_theta = cosf(theta);
*Id = Ialpha * cos_theta + Ibeta * sin_theta;
*Iq = -Ialpha * sin_theta + Ibeta * cos_theta;
}
/**
* @brief 逆 Park 变换:旋转 d-q 坐标系 → 静止 α-β 坐标系
* @param Ud d 轴电压
* @param Uq q 轴电压
* @param theta 转子电角度 (rad)
* @param Ualpha 输出 α 轴电压 (指针)
* @param Ubeta 输出 β 轴电压 (指针)
*/
void Inv_Park_Transform(float Ud, float Uq, float theta,
float *Ualpha, float *Ubeta)
{
float sin_theta = sinf(theta);
float cos_theta = cosf(theta);
*Ualpha = Ud * cos_theta - Uq * sin_theta;
*Ubeta = Ud * sin_theta + Uq * cos_theta;
}
避坑指南:我曾经在 STM32F103 上跑 FOC,发现 Park 变换占用了不少 CPU 时间。后来一查,是 sinf() 和 cosf() 调用太频繁。建议:
- 如果芯片没有 FPU,用查表法代替三角函数
- 如果芯片有 FPU,确保编译选项开启了 -mfpu=fpv4-sp-d16
- 角度 θe 建议用 Q15 或 Q24 格式的定点数,配合 CORDIC 算法
4.5 常见问题与调试技巧
在实际调试中,Park 变换出问题通常就几个原因:
| 现象 | 可能原因 | 排查方法 |
|---|---|---|
| Id、Iq 抖动剧烈 | 角度 θe 有噪声或延迟 | 检查角度观测器输出,加低通滤波 |
| Id 不为零,Iq 控不住 | 角度偏移(初始位置不对) | 做一次角度校准,或者用高频注入法 |
| 转矩输出反向 | 角度符号反了 | 交换两相线序,或者取反 θe |
| 高速时失控 | 角度更新跟不上转速 | 提高控制频率,或者用预测补偿 |
调试小技巧:我习惯在代码里加一个调试模式,把 Iα、Iβ、Id、Iq 通过 DAC 输出到示波器。用手转动电机轴,看 Id 是否接近 0,Iq 是否随转矩变化。如果 Id 跟着 Iq 一起跳,那角度大概率有问题。
4.6 小结
Park 变换是整个 FOC 的「翻译官」。它把交流信号翻译成直流信号,让 PID 控制器能看懂、能处理。你只要记住:
- 正变换:α-β → d-q,用于电流采样
- 逆变换:d-q → α-β,用于电压输出
- 角度 θe 是灵魂,错了就全错
下一节,咱们聊聊怎么用 PI 控制器去控这些直流分量。到时候你会发现,前面这些变换做得越扎实,后面的调参就越轻松。