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 坐标变换的完整流程

我把整个流程画成了一张图,你一看就明白:

FOC坐标变换流程 三相ABC 两相αβ 旋转dq Clark变换 Park变换 两相αβ 三相ABC 反Park 反Clark 说明: 正向变换:ABC → αβ(Clark)→ dq(Park),用于电流采样和反馈。 反向变换:dq → αβ(反Park)→ ABC(反Clark),用于生成SVPWM调制波。

你看,整个流程就是:采样三相电流 → 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的基石,你把它吃透了,后面的电流环、速度环、位置环设计就是水到渠成的事。