3、坐标变换理论:Clark变换原理与实现、Park变换原理与实现、反Park变换
好,咱们进入正题。这一章要聊的坐标变换,说白了就是FOC算法的数学基础。没有它,你根本没法让电机转得顺滑。
我记得刚入行那会儿,看到一堆αβ、dq的公式,头都大了。后来亲手调了几次电机,才明白这些变换到底在干什么。说白了,就是把三相交流电这种“绕来绕去”的东西,变成我们好控制的直流信号。
3.1 为什么需要坐标变换?
你想想看,电机里通的是三相正弦电流。三个相位差120度的正弦波,在空间里合成一个旋转的磁场。这个磁场带着转子转,电机就动了。
但问题来了——我们想控制转矩,直接控制三相电流行不行?行,但非常麻烦。因为三相电流是耦合的,你动A相,B相和C相也跟着变。控制起来就像在玩杂技。
坐标变换的目的,就是把这三相电流,先变成两相正交的电流(Clark变换),再变成旋转坐标系下的直流分量(Park变换)。这样一来,转矩和磁通就能分开控制了。嗯,这就是FOC的精髓。
核心思想: 把交流量变成直流量,把耦合量变成解耦量。
3.2 Clark变换原理与实现
Clark变换,也叫3s/2s变换。就是把三相静止坐标系(A、B、C)下的量,映射到两相静止坐标系(α、β)下。
为什么是两相?因为三相系统其实有冗余。你想想,三相电流加起来等于零(星形接法),所以真正独立的只有两相。Clark变换就是去掉这个冗余。
数学公式长这样:
Iα = Ia
Iβ = (Ia + 2*Ib) / √3
等等,这里有个常见的坑。我刚开始写代码时,直接套用了这个公式,结果发现电机转起来抖得厉害。后来查了半天,才发现是等幅值变换和等功率变换的区别。
注意: 上面这个公式是等幅值变换。如果你要做等功率变换,系数要乘以√(2/3)。我个人习惯用等幅值变换,因为电流环调试时更直观。
代码实现其实很简单:
void clark_transform(float Ia, float Ib, float Ic,
float *Ialpha, float *Ibeta) {
// 等幅值Clark变换
*Ialpha = Ia;
*Ibeta = (Ia + 2.0f * Ib) / 1.7320508f; // 1.732 = √3
}
嗯,这里要注意,Ic其实没用到。因为Ia + Ib + Ic = 0,所以Ic = -Ia - Ib。你如果非要传三个参数,也可以,但实际计算时用两个就够了。
3.3 Park变换原理与实现
Clark变换完了,我们有了Iα和Iβ。但这两个还是交流量,随着转子位置变化而变化。要变成直流量,就得做Park变换。
Park变换,也叫2s/2r变换。就是把两相静止坐标系(α、β)下的量,映射到两相旋转坐标系(d、q)下。这个旋转坐标系的转速,要和转子磁场同步。
公式如下:
Id = Iα * cos(θ) + Iβ * sin(θ)
Iq = -Iα * sin(θ) + Iβ * cos(θ)
这里的θ,就是转子电角度。从编码器或者霍尔传感器读到的。
我曾经犯过一个低级错误——把电角度和机械角度搞混了。电机转一圈,电角度可能转了好几圈(取决于极对数)。如果你用机械角度去做Park变换,那电流环会完全失控。
小技巧: 调试时,可以先用手慢慢转动电机轴,观察Id和Iq的值。如果Id和Iq在某个位置变成直流,说明角度对了。如果还在波动,那就是角度有问题。
代码实现:
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;
}
3.4 反Park变换
反Park变换,就是把d、q轴上的电压指令,变回α、β坐标系下的电压。因为最终我们要输出的是三相PWM波,得先回到静止坐标系。
公式就是Park变换的逆运算:
Vα = Vd * cos(θ) - Vq * sin(θ)
Vβ = Vd * sin(θ) + Vq * cos(θ)
你看,其实就是把矩阵转置了一下。因为Park变换矩阵是正交矩阵,逆矩阵等于转置矩阵。
代码实现:
void inverse_park_transform(float Vd, float Vq, float theta,
float *Valpha, float *Vbeta) {
float sin_theta = sinf(theta);
float cos_theta = cosf(theta);
*Valpha = Vd * cos_theta - Vq * sin_theta;
*Vbeta = Vd * sin_theta + Vq * cos_theta;
}
这里有个细节要注意。反Park变换之后,得到的是Vα和Vβ。但你要输出三相PWM,还得再做一次反Clark变换(2s/3s变换)。不过很多MCU的PWM模块可以直接用Vα、Vβ生成三相占空比,比如SVPWM算法。
3.5 三种变换的关系总结
我把这三个变换串起来,画个流程图你就明白了:
| 步骤 | 变换名称 | 输入 | 输出 | 说明 |
|---|---|---|---|---|
| 1 | Clark变换 | Ia, Ib, Ic | Iα, Iβ | 三相→两相静止 |
| 2 | Park变换 | Iα, Iβ, θ | Id, Iq | 两相静止→两相旋转 |
| 3 | PI调节 | Id_ref, Iq_ref | Vd, Vq | 电流环控制 |
| 4 | 反Park变换 | Vd, Vq, θ | Vα, Vβ | 两相旋转→两相静止 |
| 5 | SVPWM | Vα, Vβ | PWM占空比 | 生成三相驱动信号 |
你看,整个FOC的电流环,就是在这几个坐标系之间来回穿梭。每次变换都离不开角度θ。所以角度测量的精度,直接决定了FOC的性能。
避坑指南: 我曾经在一个项目里,用了便宜的霍尔传感器,角度分辨率只有60度电角度。结果Park变换出来的Id和Iq,波动非常大,电流环根本稳不住。后来换了磁编码器,分辨率提高到0.1度,问题才解决。所以,角度传感器的选择,千万别省。
3.6 实际调试中的注意事项
最后,分享几个我在调试中积累的经验:
- 角度对齐: 第一次上电时,一定要做角度对齐。让电机转到某个固定位置,把编码器读数清零。否则Park变换的角度基准是错的,电机要么不转,要么乱转。
- 浮点运算速度: 坐标变换里有很多sin、cos计算。如果MCU没有硬件浮点单元,建议用查表法或者CORDIC算法。否则一个电流环周期可能跑不完。
- 数值溢出: 变换过程中,电流值可能会放大。比如Clark变换的等功率版本,系数是√(2/3)≈0.816,但等幅值版本系数是1。注意你的ADC量程和变量类型。
- 调试顺序: 我建议先单独测试Clark变换,给一组已知的三相电流,看αβ输出对不对。再测Park变换,用手转动电机,看Id、Iq是否稳定。最后再联调整个环路。
嗯,这一章的内容就到这里。坐标变换是FOC的基石,理解透了,后面的控制策略才能玩得转。下一章,咱们聊聊SVPWM,看看怎么把Vα、Vβ变成实实在在的PWM波。