2. 电机数学模型:永磁同步电机(PMSM)的数学模型、坐标变换(Clark/Park)
好,咱们正式开始啃这块硬骨头——PMSM的数学模型和坐标变换。
说实话,我刚入行那会儿,看到那一堆αβ、dq坐标变换公式,头都是大的。心想:我直接控制三相电流不就行了?干嘛要绕这么大一圈?
后来在调试一个高速主轴电机时,我才彻底明白——不搞坐标变换,你连电流环都稳不住。为什么?因为三相交流量是时变的,你用PID去跟踪一个正弦波,带宽根本不够。说白了,坐标变换就是把交流变直流,让控制变得简单。
2.1 永磁同步电机的物理模型
先看电机长什么样。PMSM的定子有三相绕组,空间上相差120°。转子呢,嵌着永磁体。
我习惯把电机想象成一个旋转的电磁场系统。定子通电产生旋转磁场,转子永磁体跟着转。就这么简单。
核心概念:PMSM的数学模型建立在三个假设之上:
- 忽略铁芯饱和(磁路是线性的)
- 忽略涡流和磁滞损耗
- 定子绕组三相对称,反电动势为正弦
嗯,实际电机肯定有偏差,但做控制算法时,这些假设够用了。
2.2 三相静止坐标系下的数学模型
在三相静止坐标系(ABC坐标系)下,电压方程长这样:
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 = L_a * i_a + M_ab * i_b + M_ac * i_c + ψ_f * cos(θ_e)
ψ_b = M_ba * i_a + L_b * i_b + M_bc * i_c + ψ_f * cos(θ_e - 2π/3)
ψ_c = M_ca * i_a + M_cb * i_b + L_c * i_c + ψ_f * cos(θ_e + 2π/3)
你看,这玩意儿耦合得一塌糊涂。L和M都是时变的,跟转子位置θ_e有关。你想想看,用这个模型去设计控制器,得多痛苦?
我曾经踩过的坑:刚做FOC时,我试图直接在ABC坐标系下调电流环参数。结果发现,同样的PI参数,转子在不同位置时,电流响应完全不一样。折腾了两天,最后发现——不是参数的问题,是模型本身就没解耦。从那以后,我再也不敢跳过坐标变换了。
2.3 Clark变换:从ABC到αβ
Clark变换的目的很简单——把三个变量变成两个。三相系统其实只有两个自由度(因为i_a + i_b + i_c = 0),所以完全可以降维。
变换公式:
[i_α] [ 1 -1/2 -1/2 ] [i_a]
[i_β] = [ 0 √3/2 -√3/2 ] [i_b]
[i_c]
等幅值变换下,还有个系数2/3:
i_α = (2/3) * (i_a - 0.5*i_b - 0.5*i_c)
i_β = (2/3) * (√3/2 * i_b - √3/2 * i_c)
我个人习惯用等幅值变换,因为这样变换后的αβ电流幅值跟实际三相电流幅值一致,调试时看着直观。
小技巧:实际代码实现时,i_c = -i_a - i_b,所以Clark变换可以简化成:
i_α = i_a
i_β = (i_a + 2*i_b) / √3
少采一路电流,省一个ADC通道。我在产品中一直这么用。
2.4 Park变换:从αβ到dq
Clark变换只是把三相变两相,但信号还是交流的。Park变换才是真正的杀招——把交流变直流。
变换公式:
i_d = i_α * cos(θ_e) + i_β * sin(θ_e)
i_q = -i_α * sin(θ_e) + i_β * cos(θ_e)
这里的θ_e是转子电角度。你看,变换后的d轴和q轴电流,在稳态时是直流量。
为什么会这样?因为Park变换相当于把坐标系旋转起来了,旋转速度跟转子同步。你站在旋转的dq坐标系上看,定子电流就变成了静止的。
物理意义:
- i_d(直轴电流): 产生磁场,但不产生转矩。说白了,就是励磁分量。
- i_q(交轴电流): 产生转矩。你想要的力,全靠它。
所以FOC的核心思想就是:控制i_d和i_q这两个直流量,间接控制电机的转矩和磁场。
2.5 dq坐标系下的数学模型
经过Clark+Park变换后,PMSM的数学模型变得清爽多了:
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)
转矩方程:
T_e = 1.5 * p * [ψ_f * i_q + (L_d - L_q) * i_d * i_q]
你看,现在u_d只跟i_d和i_q有关,u_q也是。虽然还有交叉耦合项(-ω_e * L_q * i_q 和 +ω_e * L_d * i_d),但至少是线性时不变系统了。
| 参数 | 含义 | 典型值范围 |
|---|---|---|
| R_s | 定子电阻 | 0.01 ~ 1 Ω |
| L_d | 直轴电感 | 0.1 ~ 10 mH |
| L_q | 交轴电感 | 0.1 ~ 10 mH |
| ψ_f | 永磁体磁链 | 0.01 ~ 0.5 Wb |
| p | 极对数 | 2 ~ 30 |
注意:对于表贴式PMSM(SPMSM),L_d ≈ L_q,转矩方程简化为T_e = 1.5 * p * ψ_f * i_q。这时候i_d给0就行。但对于内置式PMSM(IPMSM),L_d < L_q,会产生磁阻转矩,这时候就需要用i_d来优化了——这就是后面弱磁控制的基础。
2.6 坐标变换的完整流程
我把整个流程画成了一张图,你一看就明白:
你看,整个流程就是:采样三相电流 → Clark变αβ → Park变dq → 在dq域做PI控制 → 反Park变αβ → 反Clark变ABC → 送SVPWM。
2.7 代码实现示例
我贴一段实际项目中的代码,你感受一下:
// Clark变换
void clark_transform(float i_a, float i_b, float i_c, float *i_alpha, float *i_beta) {
*i_alpha = i_a;
*i_beta = (i_a + 2.0f * i_b) * 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 i_d, float i_q, float theta, float *i_alpha, float *i_beta) {
float sin_theta = sinf(theta);
float cos_theta = cosf(theta);
*i_alpha = i_d * cos_theta - i_q * sin_theta;
*i_beta = i_d * sin_theta + i_q * cos_theta;
}
我个人的建议:实际工程中,sin/cos计算可以用查表法或者CORDIC算法,别直接调math.h的sinf,太慢了。我在STM32F4上用过查表+线性插值,精度0.1°,耗时不到1μs。
2.8 常见问题与避坑
- 角度对齐问题:Park变换用的θ_e必须是转子永磁体N极方向。如果编码器零位没对齐,整个dq轴都是歪的。我曾经因为这个,调了一整天电流环都调不稳。
- 等幅值 vs 等功率:两种变换差一个√(2/3)系数。我个人习惯用等幅值,因为调试时看电流波形更直观。但要注意,等幅值变换下,功率计算要乘以3/2。
- 反Clark变换的系数:别忘了反Clark变换也要乘系数。等幅值下,反Clark是正Clark的转置,系数是1(不是2/3)。
避坑指南:我曾经在一个项目中,Clark变换用了等幅值,但反Clark忘了调整系数,结果SVPWM输出的电压幅值只有理论值的一半。电机能转,但力矩小了一半。查了两天才发现这个bug。所以,正反变换的系数一定要配对使用。
好了,这一章的内容就到这儿。数学模型和坐标变换是FOC的基石,你把它吃透了,后面的电流环、速度环、位置环设计就是水到渠成的事。