2. 电机模型与坐标系:Clark变换、Park变换、反Park变换的数学基础
好,咱们进入正题。这一章聊的是FOC的“骨架”——坐标系变换。说白了,就是怎么把电机里那些乱七八糟的物理量,变成我们能轻松控制的数字信号。
我刚开始接触FOC时,最头疼的就是这三个变换。明明都是数学公式,为什么非得转来转去?后来踩过坑才明白:没有坐标系变换,FOC就是空中楼阁。
2.1 为什么需要坐标系变换?
你想想看,三相电机里电流是正弦波,互相差120度。直接控制这三相电流,就像同时追三只兔子——累死也追不上。
FOC的精髓在于:把交流问题变成直流问题。
- Clark变换:把三相(a,b,c)变两相(α,β)。从三个变量变成两个,但信号还是交流的。
- Park变换:把静止的两相(α,β)变旋转的两相(d,q)。这下好了,交流变直流,控制就简单了。
- 反Park变换:把控制结果再变回α,β,最后合成三相电压。
我个人习惯把这三个变换看作“翻译官”。电机说三相交流,控制器说两相直流,中间全靠它们沟通。
核心思想:Clark变换把三相变两相,Park变换把静止变旋转。反Park就是Park的逆过程。
2.2 Clark变换:从三相到两相
Clark变换也叫3s/2s变换(三相静止到两相静止)。数学上很简单,就是投影。
假设三相电流为 ia、ib、ic,且满足 ia + ib + ic = 0(星形接法)。那么:
iα = ia
iβ = (ia + 2*ib) / √3
等等,这里有个细节。上面是等幅值变换,还有等功率变换。区别在于系数不同。
| 变换类型 | α轴分量 | β轴分量 |
|---|---|---|
| 等幅值 | iα = ia | iβ = (ia + 2ib) / √3 |
| 等功率 | iα = √(2/3) * ia | iβ = (ia + 2ib) / √2 |
我在项目中遇到过一个问题:用等幅值变换算出来的电流环PI参数,换到等功率变换后就不对了。后来才发现,两种变换的增益不同,PI参数必须重新整定。
我的建议:初学者先用等幅值变换。物理意义更直观,调试时容易理解。
2.3 Park变换:从静止到旋转
Clark变换后,我们有了α,β轴上的交流信号。但交流信号控制起来还是麻烦——有相位、有频率。
Park变换(2s/2r变换)就是来解决这个问题的。它把静止的α,β坐标系,旋转到与转子磁场同步的d,q坐标系。
公式如下:
id = iα * cos(θ) + iβ * sin(θ)
iq = -iα * sin(θ) + iβ * cos(θ)
其中θ是转子电角度。这个角度从哪里来?编码器或者观测器。
嗯,这里要注意:θ的精度直接影响Park变换的效果。我曾经因为编码器安装偏差,导致d轴和q轴电流耦合严重,电机嗡嗡响。后来加了角度补偿才解决。
避坑指南:Park变换中的θ必须是电角度,不是机械角度。极对数p要乘上去:θ电 = p * θ机。
2.4 反Park变换:从旋转回到静止
反Park变换就是Park的逆过程。我们在d,q坐标系里算好了电压指令(ud*, uq*),要变回α,β坐标系才能合成三相电压。
公式:
uα* = ud* * cos(θ) - uq* * sin(θ)
uβ* = ud* * sin(θ) + uq* * cos(θ)
你看,和Park变换的公式很像,只是符号变了。说白了就是矩阵求逆。
得到uα*和uβ*后,再用反Clark变换(或者直接SVPWM)合成三相电压。
2.5 代码实现示例
下面是我常用的C代码片段。注意用浮点运算,精度够用。
// Clark变换:三相电流 -> αβ轴电流
void clark_transform(float ia, float ib, float ic, float *i_alpha, float *i_beta) {
*i_alpha = ia;
*i_beta = (ia + 2.0f * ib) / 1.7320508f; // 1.732 = sqrt(3)
}
// Park变换:αβ轴电流 -> dq轴电流
void park_transform(float i_alpha, float i_beta, float theta, float *i_d, float *i_q) {
float sin_theta = sinf(theta);
float cos_theta = cosf(theta);
*i_d = i_alpha * cos_theta + i_beta * sin_theta;
*i_q = -i_alpha * sin_theta + i_beta * cos_theta;
}
// 反Park变换:dq轴电压 -> αβ轴电压
void inv_park_transform(float v_d, float v_q, float theta, float *v_alpha, float *v_beta) {
float sin_theta = sinf(theta);
float cos_theta = cosf(theta);
*v_alpha = v_d * cos_theta - v_q * sin_theta;
*v_beta = v_d * sin_theta + v_q * cos_theta;
}
性能提示:sin/cos计算很耗时。我建议用查表法或者CORDIC算法。在STM32F4上,查表比直接计算快3倍以上。
2.6 常见问题与调试经验
- 电流波形畸变:检查θ是否准确。编码器零位偏移会导致dq轴耦合。
- 电机噪音大:可能是Clark变换的系数用错了。等幅值和等功率混用会出问题。
- 启动抖动:低速时反Park变换的θ更新频率不够。我建议至少10kHz的PWM频率,θ每个周期更新一次。
我记得有一次调试,电机空载正常,带载就抖。查了两天,最后发现是Park变换里用了float,精度不够。换成double就好了。嗯,嵌入式里用double要小心,但有些场合确实需要。
2.7 小结
这一章的内容,说白了就是三个公式、两个方向。Clark把三相变两相,Park把静止变旋转,反Park再变回去。
你想想看,整个FOC的核心,其实就是在这三个坐标系之间来回穿梭。理解了它们,你就掌握了FOC的“语法”。下一章我们聊SVPWM,看看怎么把α,β电压变成实实在在的PWM波。
对了,如果你在调试中遇到坐标系相关的问题,欢迎交流。我踩过的坑,说不定能帮你省几天时间。