电机数学模型:从物理到方程
系列:电机控制系列 - 第 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·iq | d 轴耦合项 | 需要解耦补偿 |
| 反电动势 | ω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) / Ldq 轴电流离散化:
iq(k+1) = iq(k) + Ts·(uq - Rs·iq - ωe·Ld·id - ωe·ψf) / Lq4.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 关键要点
坐标变换是核心
- abc → αβ → dq
- 解耦、简化控制
dq 坐标系下
- id 控制:磁通(弱磁)
- iq 控制:转矩
- 独立控制,互不干扰
离散化
- 欧拉法:简单但精度一般
- 高阶方法:龙格-库塔、双线性变换
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/3Park:
[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·ψfC. 转矩方程
Te = (3/2)·P·[ψf·iq + (Ld - Lq)·id·iq]参考资料
- 《交流电机数学模型及调速系统》- 李永东
- 《现代永磁同步电机控制原理及 MATLAB 仿真》- 袁雷
- Krause, P. C. "Analysis of Electric Machinery and Drive Systems"
- Texas Instruments: "InstaSPIN-FOC Solution"
版权声明:本文采用 CC BY-NC-SA 4.0 协议,欢迎转载,但请注明出处。
更新日志:
- 2026-03-13:发布第 1 版