3. 直流电机数学模型:从物理方程到状态空间

直流电机,说白了就是电能转机械能的核心部件。很多初学者一上来就盯着PID调参,结果电机嗡嗡响就是不转——其实根子往往在模型没搞透。我个人习惯是先搭好数学模型,再动手写代码。这一章我们就来把直流电机的数学模型掰开揉碎。

本章核心脉络:电枢回路方程 → 机械运动方程 → 传递函数 → 状态空间表达式。每一步都对应着实际工程中的物理量,不是纯数学游戏。

直流电机数学模型知识体系 直流电机数学模型知识体系 直流电机数学模型 电枢回路方程 U = E + iR + L di/dt 机械运动方程 Te - TL = J dω/dt + Bω 传递函数 G(s) = ω(s)/U(s) 状态空间表达式 ẋ = Ax + Bu, y = Cx + Du 四个模块层层递进:从物理定律 → 频域模型 → 现代控制理论标准形式

3.1 电枢回路方程

先看电枢回路。直流电机通电后,电枢绕组里流过电流,产生电磁转矩。但绕组本身有电阻和电感,还会切割磁感线产生反电动势。这些物理量必须用一个方程统一描述。

电枢回路的电压平衡方程长这样:

U = E + iR + L * (di/dt)

其中:

  • U — 电枢两端施加的电压(V)
  • E — 反电动势(V),E = Ke · ω
  • i — 电枢电流(A)
  • R — 电枢回路总电阻(Ω)
  • L — 电枢回路总电感(H)

我的经验:实际项目中R和L不是固定值。温度升高时绕组电阻会增大,我遇到过因为没考虑温升导致电流环发散的情况。建议在模型里预留R的温度补偿系数。

反电动势E是电机转速ω的函数。Ke是反电动势常数,单位V·s/rad。这个参数在电机铭牌上通常不直接给,但可以通过空载实验测出来——我习惯用额定转速和额定电压反推。

3.2 机械运动方程

电机轴上的转矩平衡,说白了就是「谁推谁」的问题。电磁转矩驱动转子旋转,负载转矩和摩擦转矩是阻力,再加上惯性的影响。

机械运动方程:

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

参数含义:

符号 含义 单位 典型值范围
Te 电磁转矩 N·m 0.01 ~ 1000+
TL 负载转矩 N·m 由工况决定
J 转动惯量(转子+负载折算) kg·m² 10⁻⁵ ~ 10
B 粘性摩擦系数 N·m·s/rad 10⁻⁴ ~ 10⁻²
ω 转子角速度 rad/s 0 ~ 额定转速

电磁转矩Te = Kt · i,Kt是转矩常数。在SI单位制下,Kt = Ke,这个关系在模型里可以直接用。

注意:J是折算到电机轴上的总惯量。如果负载通过减速器连接,Jtotal = Jmotor + Jload / n²,n是减速比。我曾经因为忘记折算,仿真结果和实测差了3倍。

3.3 传递函数推导

有了时域方程,接下来拉普拉斯变换走一波。把电枢回路和机械运动方程联立,消去中间变量电流i,就能得到从电压U(s)到转速ω(s)的传递函数。

拉氏变换后的方程组:

U(s) = Ke·ω(s) + I(s)·(R + Ls)
Kt·I(s) - TL(s) = (Js + B)·ω(s)

令负载TL = 0(空载情况),消去I(s)得到:

G(s) = ω(s) / U(s) = Kt / [ (R + Ls)(Js + B) + KeKt ]

展开分母,整理成标准二阶系统形式:

G(s) = Kt / (LJs² + (LB + RJ)s + (RB + KeKt))

这个传递函数有两个极点,对应电气时间常数τe = L/R和机械时间常数τm = J/B。实际电机中τe远小于τm,所以简化模型时常忽略电感L。

简化技巧:当L很小时(比如永磁直流电机),令L=0,传递函数降为一阶:

G(s) = Kt / (RJs + (RB + KeKt))

这个一阶模型在电流环设计时非常实用,我经常用它做快速原型验证。

3.4 状态空间表达式

传递函数适合频域分析,但现代控制算法(比如LQR、MPC)需要状态空间模型。我们把转速ω和电流i选为状态变量,电压U为输入,转速ω为输出。

状态变量:x = [i, ω]T

输入:u = U

输出:y = ω

从时域方程出发:

di/dt = -(R/L)·i - (Ke/L)·ω + (1/L)·U
dω/dt = (Kt/J)·i - (B/J)·ω - (1/J)·TL

写成矩阵形式:

ẋ = Ax + Bu
y = Cx + Du

其中:

矩阵 表达式 维度
A [[-R/L, -Ke/L], [Kt/J, -B/J]] 2×2
B [[1/L], [0]] 2×1
C [0, 1] 1×2
D [0] 1×1

实用建议:在Simulink里搭建状态空间模型时,直接用State-Space模块填入A、B、C、D矩阵。我习惯先用MATLAB的ss()函数验证特征值是否与传递函数极点一致——这是一个很好的自检手段。

如果考虑负载转矩TL作为扰动输入,B矩阵可以扩展为2×2:

B = [[1/L, 0], [0, -1/J]]

这样模型就能同时响应电压控制和负载变化,更贴近实际工况。

3.5 模型参数获取与验证

模型搭好了,参数从哪来?我一般按这个优先级获取:

  1. 电机数据手册 — 直接查R、L、Kt、J
  2. 空载实验 — 测反电动势常数Ke
  3. 堵转实验 — 测电阻R和转矩常数Kt
  4. 阶跃响应拟合 — 用实测转速曲线反推J和B

避坑指南:我曾经用数据手册的J值直接仿真,结果响应速度比实测快了一倍。后来发现手册给的是转子惯量,没算负载和联轴器。记住:仿真用的J必须是折算到电机轴上的总惯量。

验证模型最简单的方法:给一个阶跃电压,看转速响应是否与实际电机一致。重点关注稳态转速和上升时间,这两个指标对上了,模型基本可用。