3. 数学模型(二):Clark变换与Park变换推导,dq轴数学模型建立
上一章我们把PMSM在三相静止坐标系下的电压方程、磁链方程和转矩方程都摆出来了。但你真拿那套方程去写控制代码,会发现根本没法用——三个相电流耦合在一起,转子还在转,电感参数跟着位置变,这谁受得了?
所以这一章,我们要干两件事:坐标变换和dq模型建立。说白了,就是把那个乱糟糟的三相系统,变成两个直流系统来控。我当年刚接触FOC时,觉得Clark和Park就是两个数学游戏,后来调试一台抖动严重的伺服电机,才真正体会到——没有这两个变换,你连电流环都调不稳。
3.1 为什么非变不可?
先看三相静止坐标系下的电压方程长什么样:
u_a = R_s * i_a + d(ψ_a)/dt
u_b = R_s * i_b + d(ψ_b)/dt
u_c = R_s * i_c + d(ψ_c)/dt
每个相的磁链ψ_a、ψ_b、ψ_c不仅包含自感,还包含另外两相的互感,而且互感还随转子位置θ变化。你想想看,这要是直接做PI控制,三个环互相打架,参数整定能把你整疯。
我做过一个项目,用三相模型直接做电流预测控制,结果跑出来的电流波形全是毛刺。后来换成dq轴模型,同样的算法,波形干净得像教科书。这就是坐标变换的价值——把时变系统变成定常系统。
3.2 Clark变换:从三相到两相
Clark变换的目标很简单:把abc三相绕组,等效成αβ两相正交绕组。注意,这里只是等效,不是真的把电机拆了重绕。
变换的核心思想是磁动势不变。也就是说,三相绕组产生的合成磁动势,和两相绕组产生的合成磁动势,在空间上完全一样。
我习惯用等幅值变换,因为这样变换后的电流幅值和实际相电流幅值一致,调试时方便观察。公式如下:
[i_α] [1 -1/2 -1/2 ] [i_a]
[i_β] = [0 √3/2 -√3/2 ] [i_b]
[i_0] [1/2 1/2 1/2 ] [i_c]
其中i_0是零序分量,对于星形连接且中线不引出的电机,i_a + i_b + i_c = 0,所以i_0 = 0,可以忽略。
Clark变换的逆变换也很简单:
[i_a] [1 0 1 ] [i_α]
[i_b] = [-1/2 √3/2 1 ] [i_β]
[i_c] [-1/2 -√3/2 1 ] [i_0]
3.3 Park变换:从静止到旋转
Clark变换做完,我们得到了αβ坐标系下的两相正弦电流。但问题来了——这两个电流还是交流量,PI控制器对交流量的跟踪效果很差,稳态误差永远消不掉。
Park变换就是来解决这个问题的。它把αβ坐标系旋转起来,旋转速度和转子同步,这样从旋转坐标系看过去,电流就变成了直流量。
变换公式:
[i_d] [cosθ sinθ] [i_α]
[i_q] = [-sinθ cosθ] [i_β]
其中θ是转子电角度,由编码器或霍尔传感器提供。
逆Park变换:
[i_α] [cosθ -sinθ] [i_d]
[i_β] = [sinθ cosθ] [i_q]
3.4 dq轴数学模型建立
经过Clark和Park变换,我们终于得到了dq坐标系下的数学模型。这个模型是FOC的基石,也是参数辨识的理论依据。
电压方程:
u_d = R_s * i_d + L_d * di_d/dt - ω_e * L_q * i_q
u_q = R_s * i_q + L_q * di_q/dt + ω_e * (L_d * i_d + ψ_f)
其中:
- R_s:定子电阻
- L_d、L_q:d轴和q轴电感
- ω_e:电角速度
- ψ_f:永磁体磁链
磁链方程:
ψ_d = L_d * i_d + ψ_f
ψ_q = L_q * i_q
转矩方程:
T_e = 1.5 * p * (ψ_d * i_q - ψ_q * i_d)
= 1.5 * p * [ψ_f * i_q + (L_d - L_q) * i_d * i_q]
看到这个转矩方程,你应该能理解为什么会有最大转矩电流比(MTPA)控制——对于凸极电机(L_d ≠ L_q),利用i_d可以产生额外的磁阻转矩。
3.5 变换的物理意义与避坑
我再用一个直观的方式解释一下:
- Clark变换:把三个绕组投影到两个正交轴上,相当于降维。
- Park变换:把坐标系转到和转子一起转,相当于你坐在转子上看电流。
你想想看,坐在转子上看,电流当然就是直流了。
下面这张图展示了整个变换流程:
3.6 代码实现:C语言版Clark+Park
下面是我在实际项目中用的一段代码,做了定点数优化,适合在DSP或MCU上跑:
// 三相电流输入:ia, ib, ic
// 转子电角度:theta_elec
// 输出:id, iq
void clark_park_transform(float ia, float ib, float ic,
float theta_elec,
float *id, float *iq)
{
// 1. Clark变换(等幅值)
float i_alpha = ia;
float i_beta = (ia + 2.0f * ib) / 1.7320508f; // 1/√3 近似
// 2. Park变换
float cos_t = cosf(theta_elec);
float sin_t = sinf(theta_elec);
*id = i_alpha * cos_t + i_beta * sin_t;
*iq = -i_alpha * sin_t + i_beta * cos_t;
}
// 逆变换:从dq到三相电压给定
void inv_park_clark_transform(float vd, float vq,
float theta_elec,
float *va, float *vb, float *vc)
{
float cos_t = cosf(theta_elec);
float sin_t = sinf(theta_elec);
// 逆Park变换
float v_alpha = vd * cos_t - vq * sin_t;
float v_beta = vd * sin_t + vq * cos_t;
// 逆Clark变换(等幅值)
*va = v_alpha;
*vb = -0.5f * v_alpha + 0.8660254f * v_beta;
*vc = -0.5f * v_alpha - 0.8660254f * v_beta;
}
3.7 常见问题与避坑
| 问题 | 现象 | 原因 | 解决办法 |
|---|---|---|---|
| 电流id、iq有交流分量 | id、iq波形不是直线,有正弦波动 | Park变换用的θ不准或延迟太大 | 检查编码器角度读取时序,做角度补偿 |
| 转矩输出抖动 | 电机低速运行时转矩脉动明显 | Clark变换系数用错(等功率vs等幅值) | 统一用等幅值变换,系数为2/3 |
| 电流环发散 | 给定转速后电流迅速增大到限幅值 | θ极性反了(正转给成反转) | 交换两相线序或取反θ符号 |
我曾经在一个风电变流器项目里,调试时发现id、iq波形总是有100Hz的波动。查了两天,最后发现是角度采样和电流采样不同步——电流在PWM周期中点采,角度在周期起点采,差了半个周期。后来做了角度预测补偿,问题解决。嗯,这种时序问题,示波器看不出来,得靠逻辑分析仪抓总线。
3.8 小结
这一章我们完成了从abc到dq的完整变换推导,得到了PMSM在旋转坐标系下的数学模型。这个模型是后续所有控制算法和参数辨识方法的基础。你如果能把Clark和Park变换的物理意义和数学形式都吃透,后面学MTPA、弱磁控制、无传感器控制都会轻松很多。