电机数学模型:从物理到方程

系列:电机控制系列 - 第 4 篇 目标平台:STM32F407ZGT6 阅读时间:35 分钟 前置知识:微积分、电路理论、第 2 篇(电机基础)

前言

很多人看到数学公式就想逃。

不懂数学模型 = 不懂控制

  • 为什么 PID 参数这样调?
  • 为什么观测器需要这个方程?
  • 为什么弱磁要这样计算?

答案都在数学模型里。

本篇目标

  • ✅ 理解 PMSM 的电压/磁链/转矩方程
  • ✅ 掌握 abc → αβ → dq 坐标变换
  • ✅ 学会离散化与代码实现

不用担心:我会用直觉 + 图示解释,不只是公式。


一、abc 坐标系下的电机模型

1.1 三相静止坐标系(abc)

 abc 坐标系:
 - a 轴:参考轴(0°)
 - b 轴:超前 a 轴 120°
 - c 轴:超前 b 轴 120°
 
         b 轴
          /\
         /  \
        /    \
       /______\
      a 轴   c 轴

1.2 电压方程

法拉第定律

 施加电压 = 电阻压降 + 电感压降 + 反电动势
 
 ua = Rs·ia + (dψa/dt)
 ub = Rs·ib + (dψb/dt)
 uc = Rs·ic + (dψc/dt)
 
 其中:
 - ua, ub, uc:相电压(V)
 - ia, ib, ic:相电流(A)
 - Rs:定子电阻(Ω)
 - ψa, ψb, ψc:磁链(Wb)

磁链方程

 磁链 = 自感磁链 + 互感磁链 + 永磁体磁链
 
 ψa = Laa·ia + Lab·ib + Lac·ic + ψf·cos(θe)
 ψb = Lba·ia + Lbb·ib + Lbc·ic + ψf·cos(θe - 120°)
 ψc = Lca·ia + Lcb·ib + Lcc·ic + ψf·cos(θe + 120°)
 
 其中:
 - Laa, Lbb, Lcc:自感(H)
 - Lab, Lbc, Lca:互感(H)
 - ψf:永磁体磁链(Wb)
 - θe:电角度(rad)

1.3 转矩方程

能量守恒

 电磁转矩 = 电磁功率 / 机械角速度
 
 Te = P × [ψf·(ia·cosθe + ib·cos(θe-120°) + ic·cos(θe+120°)) +
           (Ld - Lq)·(id·iq)]
 
 其中:
 - P:极对数
 - id, iq:dq 坐标系电流(后续推导)
 - Ld, Lq:d 轴、q 轴电感

1.4 运动方程

牛顿第二定律

 J × (dω/dt) = Te - TL - B×ω
 
 其中:
 - J:转动惯量(kg·m²)
 - ω:机械角速度(rad/s)
 - Te:电磁转矩(N·m)
 - TL:负载转矩(N·m)
 - B:摩擦系数(N·m·s/rad)

二、坐标变换:从 abc 到 dq

2.1 为什么要坐标变换?

问题:abc 坐标系下

  • ❌ 三相耦合(ia, ib, ic 相互影响)
  • ❌ 时变系统(电感随角度变化)
  • ❌ 控制复杂

解决:变换到 dq 坐标系

  • ✅ 解耦(id, iq 独立控制)
  • ✅ 时不变(电感常数)
  • ✅ 控制简单

2.2 Clarke 变换(abc → αβ)

 abc(三相静止) → αβ(两相静止)
 
 α 轴与 a 轴重合
 β 轴超前 α 轴 90°
 
 变换矩阵(等幅值变换):
 
 [ iα ]   [  1      -1/2      -1/2    ] [ ia ]
 [ iβ ] = [  0      √3/2     -√3/2    ] [ ib ]
           └────────────────────────────┘
                     2/3
 
 简化公式:
 iα = ia
 iβ = (ia + 2·ib) / √3

物理意义

  • 3 维(abc)→ 2 维(αβ)
  • 信息不变,只是换个坐标系

2.3 Park 变换(αβ → dq)

 αβ(两相静止) → dq(两相旋转)
 
 d 轴:磁极方向(直轴)
 q 轴:垂直磁极(交轴)
 dq 坐标系以电角速度 ωe 旋转
 
 变换矩阵:
 
 [ id ]   [  cosθe   sinθe ] [ iα ]
 [ iq ] = [ -sinθe   cosθe ] [ iβ ]
 
 其中:
 - θe:电角度(rad)
 - θe = P × θm(极对数 × 机械角度)

物理意义

  • 从"地面"看(αβ)→ 从"转子"看(dq)
  • 旋转的电流矢量 → 静止的 id, iq

2.4 完整变换流程

 abc → αβ → dq
 
 [ ia ]      [ iα ]      [ id ]
 [ ib ]  →   [ iβ ]  →   [ iq ]
 [ ic ]
 
 Clarke       Park
 变换         变换

逆变换

dq → αβ → abc

[ id ]      [ iα ]      [ ia ]
[ iq ]  →   [ iβ ]  →   [ ib ]
                         [ ic ]

Inv_Park    Inv_Clarke

三、dq 坐标系下的电机模型

3.1 电压方程(dq 坐标系)

最终形式(简洁!)

ud = Rs·id + Ld·(did/dt) - ωe·Lq·iq
uq = Rs·iq + Lq·(diq/dt) + ωe·Ld·id + ωe·ψf
     └──┬──┘   └───┬───┘   └──────┬──────┘
      电阻      电感压降     旋转电动势

其中:
- ud, uq:d 轴、q 轴电压(V)
- id, iq:d 轴、q 轴电流(A)
- Ld, Lq:d 轴、q 轴电感(H)
- ωe:电角速度(rad/s)= P × ωm
- ψf:永磁体磁链(Wb)

关键项解析

公式物理意义控制影响
电阻压降Rs·id, Rs·iq铜损耗低速影响大
电感压降Ld·did/dt电流变化产生动态响应
旋转电动势-ωe·Lq·iqd 轴耦合项需要解耦补偿
反电动势ωe·ψf永磁体产生高速主导

3.2 磁链方程(dq 坐标系)

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

简洁!无互感项!

3.3 转矩方程(dq 坐标系)

Te = (3/2)·P·[ψf·iq + (Ld - Lq)·id·iq]
     └─────┬─────┘  └──────────┬──────────┘
       永磁转矩         磁阻转矩

SPM(Ld = Lq):Te = (3/2)·P·ψf·iq
IPM(Ld < Lq):额外磁阻转矩

3.4 运动方程(不变)

J·(dω/dt) = Te - TL - B·ω

四、数学模型的离散化

4.1 为什么需要离散化?

数字控制器

  • 单片机是离散系统(采样周期 Ts)
  • 需要将连续微分方程 → 离散差分方程

4.2 欧拉法(一阶近似)

原理

连续:dx/dt = f(x, u)

离散:x(k+1) = x(k) + f(x(k), u(k))·Ts

其中:
- Ts:采样周期(s)
- x(k):当前状态
- x(k+1):下一时刻状态

4.3 电压方程离散化

d 轴电流离散化

连续:
ud = Rs·id + Ld·(did/dt) - ωe·Lq·iq

解出 did/dt:
did/dt = (ud - Rs·id + ωe·Lq·iq) / Ld

离散化(欧拉法):
id(k+1) = id(k) + Ts·(ud - Rs·id + ωe·Lq·iq) / Ld

q 轴电流离散化

iq(k+1) = iq(k) + Ts·(uq - Rs·iq - ωe·Ld·id - ωe·ψf) / Lq

4.4 代码实现

/**
 * @brief 电流预测(离散化模型)
 */
void Current_Predict(float ud, float uq, float id, float iq,
                     float omega_e, float Ts,
                     Motor_Params_t *motor,
                     float *id_next, float *iq_next) {
    // d 轴电流预测
    *id_next = id + Ts * (ud - motor->Rs * id + omega_e * motor->Lq * iq) / motor->Ld;

    // q 轴电流预测
    *iq_next = iq + Ts * (uq - motor->Rs * iq - omega_e * motor->Ld * id - omega_e * motor->Psi_f) / motor->Lq;
}

五、STM32 代码实现

5.1 电机参数结构体

/**
 * @brief 电机参数
 */
typedef struct {
    float Rs;      // 定子电阻(Ω)
    float Ld;      // d 轴电感(H)
    float Lq;      // q 轴电感(H)
    float Psi_f;   // 永磁体磁链(Wb)
    float J;       // 转动惯量(kg·m²)
    float B;       // 摩擦系数(N·m·s/rad)
    uint8_t P;     // 极对数

    // 计算参数(加速运算)
    float inv_Ld;  // 1/Ld
    float inv_Lq;  // 1/Lq
    float inv_J;   // 1/J
} Motor_Params_t;

/**
 * @brief 初始化电机参数
 */
void Motor_Params_Init(Motor_Params_t *motor) {
    motor->Rs = 0.15f;    // Ω
    motor->Ld = 0.0025f;  // H
    motor->Lq = 0.0035f;  // H
    motor->Psi_f = 0.08f; // Wb
    motor->J = 0.0005f;   // kg·m²
    motor->B = 0.0001f;   // N·m·s/rad
    motor->P = 4;         // 8 极

    // 计算倒数(加速)
    motor->inv_Ld = 1.0f / motor->Ld;
    motor->inv_Lq = 1.0f / motor->Lq;
    motor->inv_J = 1.0f / motor->J;
}

5.2 坐标变换函数

#include <math.h>

/**
 * @brief Clarke 变换(abc → αβ)
 */
void Clarke_Transform(float ia, float ib, float ic,
                      float *i_alpha, float *i_beta) {
    // 等幅值变换
    *i_alpha = ia;
    *i_beta = (ia + 2.0f * ib) / 1.732050808f;  // √3 ≈ 1.732
}

/**
 * @brief Park 变换(αβ → dq)
 */
void Park_Transform(float i_alpha, float i_beta, float theta_e,
                    float *id, float *iq) {
    float cos_theta = cosf(theta_e);
    float sin_theta = sinf(theta_e);

    *id =  i_alpha * cos_theta + i_beta * sin_theta;
    *iq = -i_alpha * sin_theta + i_beta * cos_theta;
}

/**
 * @brief 逆 Park 变换(dq → αβ)
 */
void Inv_Park_Transform(float vd, float vq, float theta_e,
                        float *v_alpha, float *v_beta) {
    float cos_theta = cosf(theta_e);
    float sin_theta = sinf(theta_e);

    *v_alpha = vd * cos_theta - vq * sin_theta;
    *v_beta  = vd * sin_theta + vq * cos_theta;
}

5.3 转矩计算

/**
 * @brief 计算电磁转矩
 */
float Calc_Torque(float id, float iq, Motor_Params_t *motor) {
    // Te = (3/2)·P·[ψf·iq + (Ld - Lq)·id·iq]
    float Te_perm = 1.5f * motor->P * motor->Psi_f * iq;
    float Te_reluct = 1.5f * motor->P * (motor->Ld - motor->Lq) * id * iq;

    return Te_perm + Te_reluct;
}

5.4 完整的电机模型仿真

/**
 * @brief 电机状态结构体
 */
typedef struct {
    float id, iq;        // dq 电流
    float omega_m;       // 机械角速度(rad/s)
    float theta_m;       // 机械角度(rad)
    float theta_e;       // 电角度(rad)
} Motor_State_t;

/**
 * @brief 电机模型更新(仿真一个采样周期)
 */
void Motor_Update(Motor_State_t *state,
                  float vd, float vq,
                  float TL,
                  float Ts,
                  Motor_Params_t *motor) {
    // 1. 计算电角速度
    float omega_e = state->omega_m * motor->P;

    // 2. 电流更新(欧拉法)
    float id_dot = (vd - motor->Rs * state->id + omega_e * motor->Lq * state->iq) * motor->inv_Ld;
    float iq_dot = (vq - motor->Rs * state->iq - omega_e * motor->Ld * state->id - omega_e * motor->Psi_f) * motor->inv_Lq;

    state->id += id_dot * Ts;
    state->iq += iq_dot * Ts;

    // 3. 转矩计算
    float Te = Calc_Torque(state->id, state->iq, motor);

    // 4. 转速更新
    float omega_dot = (Te - TL - motor->B * state->omega_m) * motor->inv_J;
    state->omega_m += omega_dot * Ts;

    // 5. 角度更新
    state->theta_m += state->omega_m * Ts;
    state->theta_e = state->theta_m * motor->P;

    // 6. 角度归一化
    if (state->theta_m > 2.0f * M_PI) {
        state->theta_m -= 2.0f * M_PI;
    }
    if (state->theta_e > 2.0f * M_PI) {
        state->theta_e -= 2.0f * M_PI;
    }
}

六、模型验证

6.1 稳态验证

测试条件

  • id = 0, iq = 5A(额定电流)
  • ωm = 3000 rpm = 314 rad/s
  • TL = 0(空载)

预期结果

1. 转矩:
Te = 1.5 × 4 × 0.08 × 5 = 2.4 N·m

2. 稳态电压:
ud = Rs·id - ωe·Lq·iq = 0 - 314×4×0.0035×5 = -21.98V
uq = Rs·iq + ωe·ψf = 0.15×5 + 314×4×0.08 = 0.75 + 100.48 = 101.23V

3. 转速(稳态):
J·dω/dt = 0 → Te = B·ω
ω = Te / B = 2.4 / 0.0001 = 24000 rad/s(理论,实际受电压限制)

6.2 动态响应

仿真代码

int main(void) {
    Motor_Params_t motor;
    Motor_State_t state = {0};
    Motor_Params_Init(&motor);

    float vd = 0, vq = 50.0f;  // 施加 50V q 轴电压
    float TL = 0;
    float Ts = 0.0001f;  // 0.1ms

    for (int i = 0; i < 10000; i++) {
        Motor_Update(&state, vd, vq, TL, Ts, &motor);

        if (i % 100 == 0) {
            printf("%f, %f, %f, %f\n", i*Ts, state.id, state.iq, state.omega_m);
        }
    }

    return 0;
}

七、总结

7.1 核心公式汇总

方程abc 坐标系dq 坐标系备注
电压复杂ud = Rs·id + Ld·did/dt - ωe·Lq·iq✅ dq 简洁
磁链耦合ψd = Ld·id + ψf✅ dq 解耦
转矩复杂Te = (3/2)·P·[ψf·iq + (Ld-Lq)·id·iq]✅ dq 清晰

7.2 关键要点

  1. 坐标变换是核心

    • abc → αβ → dq
    • 解耦、简化控制
  2. dq 坐标系下

    • id 控制:磁通(弱磁)
    • iq 控制:转矩
    • 独立控制,互不干扰
  3. 离散化

    • 欧拉法:简单但精度一般
    • 高阶方法:龙格-库塔、双线性变换

7.3 下一步

下一篇坐标变换详解:Clarke 与 Park 变换的数学推导与代码实现

我们将深入学习:

  • ✅ Clarke/Park 变换的严格推导
  • ✅ 等功率 vs 等幅值变换
  • ✅ 三角函数优化(查表法)
  • ✅ CMSIS-DSP 加速

附录:常用公式速查表

A. 坐标变换矩阵

Clarke(等幅值)

[iα]   [  1      -1/2      -1/2   ] [ia]
[iβ] = [  0      √3/2     -√3/2   ] [ib]
        └──────────────────────────┘
                   2/3

Park

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

Inv\_Park

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

B. dq 电压方程

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

C. 转矩方程

Te = (3/2)·P·[ψf·iq + (Ld - Lq)·id·iq]

参考资料

  1. 《交流电机数学模型及调速系统》- 李永东
  2. 《现代永磁同步电机控制原理及 MATLAB 仿真》- 袁雷
  3. Krause, P. C. "Analysis of Electric Machinery and Drive Systems"
  4. Texas Instruments: "InstaSPIN-FOC Solution"

版权声明:本文采用 CC BY-NC-SA 4.0 协议,欢迎转载,但请注明出处。

更新日志

  • 2026-03-13:发布第 1 版
最后修改:2026 年 03 月 14 日
如果觉得我的文章对你有用,请随意赞赏