3、坐标变换:Clark变换、Park变换、逆变换的数学推导与实现
各位同学,咱们今天聊聊FOC里最核心的数学工具——坐标变换。
说实话,我刚入行那会儿,看到这些变换公式也是一头雾水。什么αβ轴、dq轴,感觉像在学天书。但后来做项目做多了,我慢慢发现,这些变换其实就是换个角度看问题。你想想看,电机里三相电流绕来绕去,多复杂。但如果我们换个坐标系,一切就清晰了。
3.1 为什么需要坐标变换?
先问大家一个问题:三相电机里,电流是正弦波,对吧?那我们要控制转矩,直接控制三相电流行不行?
行是行,但很麻烦。因为三相电流是耦合的,你调A相,B相和C相也会跟着变。而且转矩和电流的关系不是线性的,控制起来特别费劲。
坐标变换的目的,就是把三相静止坐标系下的交流量,变成两相旋转坐标系下的直流量。说白了,就是把交流电机控制问题,变成直流电机控制问题。这样PID调节器就能直接上了,简单粗暴。
核心思想: 三相交流 → 两相交流(Clark) → 两相直流(Park)
3.2 Clark变换:从abc到αβ
Clark变换,也叫3s/2s变换。就是把三相静止坐标系(a, b, c)映射到两相静止坐标系(α, β)。
我习惯把α轴和a轴对齐,这样计算起来最方便。数学推导其实不复杂,就是投影。
变换公式:
Iα = Ia
Iβ = (Ia + 2*Ib) / √3
等等,这里有个细节。上面这个公式是等幅值变换,也就是变换前后电流幅值不变。还有一种叫等功率变换,系数会不一样。我个人习惯用等幅值变换,因为调试时看波形更直观。
完整的矩阵形式:
| Iα | | 1 -1/2 -1/2 | | Ia |
| | = | | | |
| Iβ | | 0 √3/2 -√3/2 | | Ib |
| Ic |
注意,三相电流满足 Ia + Ib + Ic = 0,所以实际计算时可以简化。
我的经验: 在实际代码中,我一般只采样两相电流,第三相用公式算出来。这样省一个ADC通道,还能减少误差。
3.3 Park变换:从αβ到dq
Clark变换完了,我们得到的是两相交流量。但交流量还是不好控,因为它在随时间变化。Park变换就是解决这个问题的。
Park变换,也叫2s/2r变换。它把静止的αβ坐标系,旋转到与转子磁场同步的dq坐标系。这样交流量就变成了直流量。
变换公式:
Id = Iα * cos(θ) + Iβ * sin(θ)
Iq = -Iα * sin(θ) + Iβ * cos(θ)
这里的θ是转子电角度,由编码器或霍尔传感器提供。
为什么会这样?你想想看,如果你坐在一个旋转的椅子上看外面的世界,静止的东西在你眼里也是旋转的。反过来,如果你跟着电机转子一起转,那定子电流在你眼里就是静止的。Park变换做的就是这件事。
避坑指南: 我曾经在项目里搞错过电角度方向。注意,Park变换的旋转方向要和电机旋转方向一致。如果搞反了,Id和Iq会完全乱掉,电机根本转不起来。
3.4 逆变换:从dq回到abc
控制完Id和Iq,我们还得把结果变回三相电压,才能给逆变器用。这就是逆变换。
逆Park变换(dq → αβ):
Vα = Vd * cos(θ) - Vq * sin(θ)
Vβ = Vd * sin(θ) + Vq * cos(θ)
逆Clark变换(αβ → abc):
Va = Vα
Vb = (-Vα + √3 * Vβ) / 2
Vc = (-Vα - √3 * Vβ) / 2
嗯,这里要注意,逆Clark变换的系数和正变换不一样,别搞混了。
3.5 代码实现示例
下面是我在实际项目中用过的C代码片段,大家可以参考一下。
// Clark变换
void clark_transform(float ia, float ib, float *i_alpha, float *i_beta) {
*i_alpha = ia;
*i_beta = (ia + 2.0f * ib) * 0.577350269f; // 1/√3
}
// Park变换
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变换
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;
}
// 逆Clark变换
void inv_clark_transform(float v_alpha, float v_beta,
float *v_a, float *v_b, float *v_c) {
*v_a = v_alpha;
*v_b = -0.5f * v_alpha + 0.866025404f * v_beta; // √3/2
*v_c = -0.5f * v_alpha - 0.866025404f * v_beta;
}
性能优化建议: 三角函数计算很费时间。我一般用查表法或者CORDIC算法来算sin和cos。如果MCU有硬件浮点单元,那就直接用math库,省事。
3.6 常见问题与调试技巧
| 问题现象 | 可能原因 | 解决方法 |
|---|---|---|
| 电机抖动、噪声大 | 电角度不准或变换系数错误 | 检查编码器零位,确认变换公式系数 |
| Id和Iq波形有交流分量 | Park变换角度滞后或超前 | 检查角度采样时序,增加滤波 |
| 电机转矩输出不足 | Iq限幅或变换方向反了 | 检查Iq参考值,确认Park变换符号 |
我记得有一次调试,电机怎么都转不起来,Id和Iq乱跳。查了半天,发现是Clark变换里把Ib和Ic搞反了。这种低级错误,大家一定要避免。
3.7 小结
坐标变换是FOC的基石。Clark变换把三相变两相,Park变换把交流变直流。逆变换再把控制结果变回去。说白了,就是一套数学工具,让我们能用直流电机的思路去控制交流电机。
下节课我们会讲SVPWM,也就是怎么把dq轴的电压指令变成实际的PWM波形。到时候大家会发现,这些变换是环环相扣的。
课后练习: 自己动手写一个坐标变换的仿真程序。输入一组三相正弦电流,观察Clark变换后的αβ波形,再观察Park变换后的dq波形。看看是不是变成了直流量?