第三节:电机模型基础——PMSM数学模型与坐标变换的HIL实现

各位同学,咱们今天聊聊永磁同步电机(PMSM)的数学模型。说实话,很多做HIL测试的工程师,一上来就急着搭模型、跑仿真,结果波形一塌糊涂,根本不知道问题出在哪。我当年也踩过这个坑——模型参数没搞对,Clark变换符号反了,折腾了两天才发现是坐标轴定义的问题。

所以这节课,咱们把基础打扎实。你想想看,HIL测试的核心是什么?就是用真实的控制器去驱动一个虚拟的电机。这个虚拟电机要是模型不准,那测试结果就是废纸一张。

3.1 PMSM的数学模型——别被公式吓到

永磁同步电机的数学模型,说白了就是三个方程:电压方程、磁链方程、转矩方程。咱们先看最常用的d-q轴模型。

电压方程:

ud = Rs * id + Ld * (did/dt) - ωe * Lq * iq
uq = Rs * iq + Lq * (diq/dt) + ωe * (Ld * id + ψf)

这里有个细节我提醒一下:ωe是电角速度,不是机械角速度。我在项目中遇到过有人直接把电机转速代进去,结果算出来的反电动势差了极对数倍。嗯,这个坑很常见。

磁链方程:

ψd = Ld * id + ψf
ψq = Lq * iq

转矩方程:

Te = 1.5 * p * (ψd * iq - ψq * id)
   = 1.5 * p * (ψf * iq + (Ld - Lq) * id * iq)

注意看,转矩由两部分组成:永磁转矩(ψf * iq)和磁阻转矩((Ld-Lq)*id*iq)。对于表贴式PMSM,Ld≈Lq,磁阻转矩基本为零。但内嵌式PMSM就不一样了,Ld明显小于Lq,这时候可以利用磁阻转矩来提高效率。我做过一个项目,通过优化id电流分配,把电机效率提升了3个百分点。

关键参数表:

符号含义单位典型值范围
Rs定子电阻Ω0.01~1
Ld, Lqd/q轴电感mH0.1~10
ψf永磁体磁链Wb0.01~0.5
p极对数-2~8

3.2 Clark变换与Park变换——坐标变换的本质

为什么要做坐标变换?说白了,就是把三相交流量变成两相直流量。这样PID控制器才好使。你想想看,如果直接控制三相正弦电流,那控制器得追着正弦波跑,稳态误差永远消不掉。

Clark变换(3相→2相静止坐标系):

[iα]   [1      -1/2    -1/2  ] [ia]
[iβ] = [0      √3/2   -√3/2 ] [ib]
                              [ic]

这里用的是等幅值变换。我个人习惯用等幅值,因为这样变换前后电流幅值不变,调试时直观。也有用等功率变换的,但那个系数不同,注意别混用。

Park变换(静止→旋转坐标系):

[id]   [cosθ   sinθ] [iα]
[iq] = [-sinθ  cosθ] [iβ]

θ是转子电角度。这个角度从哪里来?在HIL中,通常由电机模型内部的积分器给出。我见过有人直接用外部信号给角度,结果模型和控制器不同步,电流波形乱成一团。

我的经验:在HIL中实现坐标变换时,建议把Clark和Park分开写两个函数。这样调试时可以单独验证每一步。我曾经遇到一个问题,id和iq有直流偏置,查了半天发现是Clark变换的系数写错了。

3.3 HIL中的实现——代码怎么写

好了,理论讲完了,咱们看看在HIL平台上怎么实现。以下是一个典型的PMSM模型核心代码,用C语言风格写的:

// PMSM模型单步更新函数
void PMSM_Step(float ud, float uq, float dt, float wm, 
               float *id, float *iq, float *te, float *theta) {
    // 电流微分方程(前向欧拉法)
    float did_dt = (ud - Rs * (*id) + we * Lq * (*iq)) / Ld;
    float diq_dt = (uq - Rs * (*iq) - we * (Ld * (*id) + psi_f)) / Lq;
    
    // 更新电流
    *id += did_dt * dt;
    *iq += diq_dt * dt;
    
    // 计算电磁转矩
    *te = 1.5f * p * (psi_f * (*iq) + (Ld - Lq) * (*id) * (*iq));
    
    // 更新电角度
    float we = p * wm;  // 电角速度
    *theta += we * dt;
    *theta = fmod(*theta, 2 * PI);  // 限制在0~2π
}

注意几个关键点:

  • 步长选择:dt一般取1~10μs。太大模型会发散,太小仿真速度跟不上。我一般取5μs,兼顾精度和实时性。
  • 数值稳定性:前向欧拉法简单,但步长太大容易不稳定。如果发现电流振荡,试试减小步长,或者改用梯形法。
  • 角度处理:一定要做模运算,否则角度会溢出。我见过有人忘了这步,跑了10分钟模型就崩了。

避坑指南:我曾经在HIL测试中遇到一个诡异问题——电机低速时转矩波动很大。查了两天,发现是角度更新时用了机械角速度,忘了乘极对数。嗯,这种低级错误,犯过一次就再也不会忘了。

3.4 反Park变换——把控制量送回三相

控制器输出的是ud、uq,但最终要加到三相绕组上。所以需要反Park变换和反Clark变换:

// 反Park变换
uα = ud * cosθ - uq * sinθ;
uβ = ud * sinθ + uq * cosθ;

// 反Clark变换(等幅值)
ua = uα;
ub = -0.5f * uα + 0.866f * uβ;
uc = -0.5f * uα - 0.866f * uβ;

这里有个细节:反Clark变换的系数要和正变换一致。如果你正变换用的是等幅值,反变换也要用等幅值。混用的话,电压幅值会差1.5倍。

3.5 模型验证——怎么知道模型对不对

模型搭好了,怎么验证?我一般做三个测试:

  1. 空载反电动势测试:给电机一个转速,看三相端电压是不是正弦波,幅值对不对。公式是E = ωe * ψf。
  2. 堵转测试:转子固定,给三相通直流电,看转矩是不是和电流成正比。这时候id=0,转矩只和iq有关。
  3. 阶跃响应测试:给一个iq阶跃,看电流响应时间常数是不是τ = Lq/Rs。

这三个测试都过了,模型基本就靠谱了。我有个习惯,每次换电机参数后,先跑一遍这三个测试,再开始正式的HIL测试。磨刀不误砍柴工嘛。

总结一下:

  • PMSM模型的核心是d-q轴电压方程和转矩方程
  • Clark/Park变换把三相交流变两相直流,方便控制
  • HIL实现时注意步长、数值稳定性和角度处理
  • 模型验证三步走:空载、堵转、阶跃响应

下节课咱们聊逆变器模型和PWM调制在HIL中的实现。到时候我会分享一个我踩过的坑——死区时间对电流波形的影响,那真是让人头大。咱们下次见。