直流电机数学模型与状态空间分析——详解版

直流电机数学模型:从第一性原理到现代控制状态空间

? 核心提要:核心提要与知识图谱
直流电机是电机控制世界的“透明模型”。它干净、线性、没有复杂的坐标变换,机电耦合规律写在脸上。本文旨在从最原初的牛顿力学与法拉第电磁感应定律出发,推导直流电机的完整物理模型,并将其抽象为现代控制理论中的状态空间矩阵(State-Space),最终落实为单片机(MCU)中的离散化 C 代码实现。
前置知识节点:[[牛顿经典力学]]、[[法拉第电磁感应定律]]、[[线性代数基础]]
后继进阶节点:[[坐标变换与FOC原理]]、[[滑模观测器 SMO 离散化实现]]


在现代工业中,虽然永磁同步电机(PMSM)和磁场定向控制(FOC)占据了主导地位,但所有高级电机算法的根基都深植于直流电机模型之中。把直流电机吃透,再看 PMSM 与 FOC,你会产生一种顿悟:所谓的 FOC,本质上就是通过极其巧妙的数学手段(Park 与 Clark 变换),把一台非线性、强耦合的三相交流电机,在算法的虚拟维度里“强行扭曲”成一台简单的直流电机。


一、 机械域:从直线运动到旋转物理世界

1.1 旋转世界的“牛顿第二定律”

电机控制的基础是力学。回顾初中物理的牛顿第二定律(直线运动):

\[F_{net} = m \frac{dv}{dt} \]

当我们将视角从直线的“推箱子”切换到电机的“转圈圈”时,物理量的维度发生了完美的映射:

  • 直线上的“合外力 \(F_{net}\)\(\rightarrow\) 旋转世界里的“合力矩 \(T_{net}\)” (Torque)
  • 直线上的“质量 \(m\)\(\rightarrow\) 旋转世界里的“转动惯量 \(J\)” (Inertia,表示物体改变旋转状态的阻力)
  • 直线上的“线速度 \(v\)\(\rightarrow\) 旋转世界里的“角速度 \(\omega_m\)” (Angular velocity)

因此,旋转世界的牛顿第二定律表达为:

\[T_{net} = J \frac{d\omega_m}{dt} \]

1.2 电机的机械运动方程

将电机的实际受力情况代入上述定律,我们得到电机学中最经典的机械运动方程:

\[T_e = J \frac{d\omega_m}{dt} + B \omega_m + T_L \]

为了更清晰地看清物理本质,我们将阻力项移到等式左边:

\[T_e - T_L - B \omega_m = J \frac{d\omega_m}{dt} \]

? 工程洞察:机械方程参数深度解析

  • \(T_e\) (电磁转矩):电机定转子磁场相互作用产生的绝对主动力。
  • \(T_L\) (外部负载转矩):电机轴上挂载的死负载(如提升重物、切削阻力)。
  • \(B \omega_m\) (黏性摩擦转矩):随转速正比例增加的系统摩擦与风阻。\(B\) 为摩擦系数。
  • \(J\) (系统总转动惯量):包含电机转子自身惯量 \(J_{motor}\) 与外部负载折算到轴上的惯量 \(J_{load}\)
  • \(\frac{d\omega_m}{dt}\) (角加速度):转速的变化率。只要合力矩不为 0,系统就必然处于加速或减速的动态过程中。

1.3 工程实战避坑:惯量 \(J\) 与速度环 PI 参数的致命羁绊

在实际的电机控制代码中,转动惯量 \(J\) 绝对不是一个简单的常量。它是 \(J_{\Sigma} = J_{motor} + J_{load}\)

?? 警告:调试案例:洗衣机负载突变

  • 空载状态:拔掉皮带,系统只有极小的 \(J_{motor}\)。算法输出微小的转矩指令,电机转速就能瞬间飙升至目标值。
  • 满载状态:滚筒塞满吸水衣物,\(J_{load}\) 极其巨大。系统总惯量可能是空载的几十倍。

控制逻辑推演:如果用空载时调好的速度环比例增益 \(K_p\) 去推满载电机,由于推力不足,电机会反应极其迟钝;反之,如果用满载调好的大 \(K_p\) 去推空载电机,由于“药效过猛”,电机会出现疯狂的超调震荡甚至异响。
前沿算法(惯量辨识):高级伺服驱动器会在上电瞬间注入高频微小扰动信号,通过观测转速响应,利用递归最小二乘法(RLS)在线计算出当前的总惯量 \(J\),从而实现 PID 参数的自适应整定。


二、 电气域:水管模型与机电耦合方程

2.1 电枢电压平衡方程(水管模型)

将电池接在直流电机两端,电机内部的电枢绕组本质上是一个“具有动态反压的 RL 串联电路”。描述这个电路状态的方程为:

\[u_a = R_a i_a + L_a \frac{di_a}{dt} + e_b \]

  • \(u_a\):外加电枢端电压 (V)
  • \(R_a i_a\):电枢电阻产生的纯热损耗压降 (V)
  • \(L_a \frac{di_a}{dt}\):电枢电感抵抗电流突变产生的感生电动势 (V)
  • \(e_b\):转子切割磁感线产生的反电动势 (V)

2.2 两大宏观机电耦合方程

电学和力学是通过以下两个核心方程跨界握手的:

  1. 电生力(转矩生成)

    \[T_e = K_t i_a \]

    电流 \(i_a\) 流过磁场产生安培力,宏观表现为转矩。\(K_t\) (转矩常数, N·m/A) 决定了 1A 电流能换取多少力气。
  2. 动生电(反电势生成)

    \[e_b = K_e \omega_m \]

    转子线圈在磁场中旋转切割磁感线,产生对抗外加电压的电动势。\(K_e\) (反电动势常数, V/(rad/s)) 决定了每单位转速能发出多少伏特的电压。

2.3 宇宙法则:证明 \(K_e = K_t\)

在标准的国际单位制(SI)下,这台电机“把电变成力”的能力,和“把力变成电”的能力绝对相等。这不是经验规律,而是基于能量守恒定律的物理强约束。

严密证明过程

  1. 忽略内部热损耗与铁损,电机输入的纯电磁功率为:\(P_{em} = e_b i_a\)
  2. 电机输出的纯机械功率为:\(P_m = T_e \omega_m\)
  3. 根据能量守恒定理,\(P_{em} \equiv P_m\),即:

    \[e_b i_a = T_e \omega_m \]

  4. 将机电耦合方程代入上式:

    \[(K_e \omega_m) i_a = (K_t i_a) \omega_m \]

  5. 两边消去变量 \(\omega_m\)\(i_a\),得到铁证:

    \[K_e = K_t \]


三、 微观溯源:反电动势与结构常数的推导

我们要知其然,更要知其所以然。\(K_e\) 究竟是怎么由电机的机械结构决定的?

3.1 从单根导线到法拉第定律

反电动势的物理本源是法拉第电磁感应定律:\(e = -\frac{d\psi}{dt}\)
假设转子表面有一根有效导线,电机有 \(2p\) 个磁极(即极对数为 \(p\)),单极磁通量为 \(\Phi\) (Wb)。

  • 导线转一整圈切割的总磁通变化量:\(\Delta \psi = 2p \cdot \Phi\)
  • 导线转一圈花费的时间:\(\Delta t = \frac{2\pi}{\omega_m}\)
  • 根据离散化的法拉第定律 \(e_{avg} = \frac{\Delta \psi}{\Delta t}\),单根导线的平均发电机电压为:

    \[e_{avg} = \frac{2p \Phi}{\frac{2\pi}{\omega_m}} = \frac{p \Phi}{\pi} \omega_m \]

3.2 宏观电机的“机械放大器”

实际转子上有 \(N\) 根有效导线,这些导线被电刷和换向器分成了 \(2a\) 条并联支路(并联支路对数为 \(a\))。
根据电路原理,并联不增加电压,只有串联才能叠加电压。因此,真正在电路上串联对外输出电压的导线数量为 \(\frac{N}{2a}\)

将单根导线电压进行宏观放大:

\[e_b = \left( \frac{N}{2a} \right) \cdot e_{avg} = \frac{N}{2a} \cdot \left( \frac{p \Phi}{\pi} \omega_m \right) \]

重新排列组合,提取出与转速和磁通无关的结构常数 \(C\)

\[e_b = \left( \frac{p N}{2\pi a} \right) \cdot \Phi \cdot \omega_m \]

\[C = \frac{p N}{2\pi a} \]

对比 \(e_b = K_e \omega_m\),得出微观结构与宏观常数的终极关系:

\[K_e = C \cdot \Phi \]

****Quote:工程师的直觉构建
结构常数 \(C\) 就是一个由绕线工人手工决定的“机械放大器”。\(K_e\) 就是这个放大器将磁铁的底层磁通 \(\Phi\) 放大了无数倍后,在端子上呈现的宏观等效磁链。如果在代码里做“弱磁控制(Flux Weakening)”,本质上就是人为通过定子电流去抵消 \(\Phi\),从而强行减小 \(K_e\),以换取更高的极限转速。


四、 稳态与动态:来自工程现场的拷问

4.1 扰动推演:突加重载的物理死锁

场景设定:电机外加稳压源 \(U=24V\) 不变,处于空载稳态。突然轴上挂载极重的铁块(\(T_L\) 阶跃增大)。不加任何单片机干预,电机会发生什么?

物理传导链(微秒级推演)

  1. 力学失衡:瞬间合力矩 \(T_e - T_L < 0\),系统获得负角加速度,惯量 \(J\) 开始被消耗,转速 \(\omega_m\) 被迫下降。
  2. 反电势跌落:由于 \(\omega_m\) 下降,根据 \(e_b = K_e \omega_m\),反电动势 \(e_b\) 同步跌落。
  3. 电流被动灌入:恒压源 \(U\) 发现反电势 \(e_b\) 变小了,根据 \(i_a = \frac{U - e_b}{R_a}\),巨大的压差瞬间将大电流 \(i_a\) 灌入绕组。
  4. 推力重建:电流增大导致电磁转矩 \(T_e = K_t i_a\) 攀升。
  5. 新稳态达成:当 \(T_e\) 攀升至与新负载 \(T_{L\_new}\) 相等时,合力矩归零。电机停止减速,停留在比原来更低的转速更大的电流下运转。

直流电机的“软特性”结论:外加电压死死不变的情况下,“大推力”与“高转速”在物理上绝对不可兼得。要想维持原转速,唯有引入 PI 控制器,在转速跌落的瞬间,由单片机人为提升 PWM 占空比(提升等效外加电压 \(U\)),打破物理死锁。

4.2 示波器上的直觉映射(无感 FOC 剧透)

在算法工程师眼中,数字波形就是机械世界的投影:

  • 看电流知转矩:因为 \(T_e = K_t i_a\),如果看到相电流波形瞬间刺出一个巨大尖峰,说明轴上遭遇了极其暴力的卡顿或起步。如果出现纯粹的直线飙升至 \(I = U/R_a\),说明电机机械堵转,必须在微秒级触发过流保护断电,否则炸管。
  • 看反电势知转速:因为 \(e_b = K_e \omega_m\)。这也是无感 FOC (Sensorless FOC) 的全部核心理论基础。单片机中运行的滑模观测器(SMO),本质就是抛弃实体霍尔传感器,通过疯狂采样 \(u_a\)\(i_a\),硬生生逆运算算出不可见的 \(e_b\),进而提取出转子角度 \(\theta\) 和速度 \(\omega_m\)

五、 状态空间视角:现代控制理论的降维打击

当系统复杂度上升,传统的微分方程会陷入混乱。现代控制理论(LQR、状态观测器等)采用极度统一的矩阵形式描述万物:

\[\dot{x} = Ax + Bu + Ed \]

5.1 状态变量的选择

状态变量代表了系统中具有“记忆效应”(不能发生物理跃变)的储能元件。

  • 电感储能(磁场能 \(E = \frac{1}{2}L_a i_a^2\)):决定了电流不能突变。令 \(x_1 = i_a\)
  • 惯量储能(动能 \(E = \frac{1}{2}J \omega_m^2\)):决定了转速不能突变。令 \(x_2 = \omega_m\)
    定义状态列向量:\(x = \begin{bmatrix} i_a \\ \omega_m \end{bmatrix}\)

5.2 构建状态矩阵

将第一节的电压方程和机械方程,按照“导数留在左边,其余扔到右边”的原则重构:

整理电压方程 (求 \(\dot{x}_1\))

\[L_a \frac{di_a}{dt} = u_a - R_a i_a - K_e \omega_m \implies \dot{x}_1 = -\frac{R_a}{L_a} x_1 - \frac{K_e}{L_a} x_2 + \frac{1}{L_a} u_a \]

整理机械方程 (求 \(\dot{x}_2\))

\[J \frac{d\omega_m}{dt} = K_t i_a - B \omega_m - T_L \implies \dot{x}_2 = \frac{K_t}{J} x_1 - \frac{B}{J} x_2 - \frac{1}{J} T_L \]

将其合并为标准矩阵形式:

\[\begin{bmatrix} \dot{x}_1 \\ \dot{x}_2 \end{bmatrix} = \begin{bmatrix} -\frac{R_a}{L_a} & -\frac{K_e}{L_a} \\ \frac{K_t}{J} & -\frac{B}{J} \end{bmatrix} \begin{bmatrix} x_1 \\ x_2 \end{bmatrix} + \begin{bmatrix} \frac{1}{L_a} \\ 0 \end{bmatrix} u_a + \begin{bmatrix} 0 \\ -\frac{1}{J} \end{bmatrix} T_L \]

5.3 矩阵的工程学解读

  • A 矩阵 (系统状态矩阵):电机的“数字 DNA”。它内部全由出厂定死的结构参数组成。它决定了在没有任何外加干预时,电机自身动态衰减的固有属性(特征根决定了系统极点)。
  • B 矩阵 (控制输入矩阵):算法的“方向盘传动比”。注意 B 矩阵的第二行是 0!这说明算法输出的电压 \(u_a\) 绝对无法瞬间直接改变转速 \(\dot{x}_2\)。电压只能直接改变第一行对应的电流,再通过 A 矩阵内部的交叉项(耦合项)去间接改变转速。
  • E 矩阵 (扰动矩阵):描述外部恶意负载 \(T_L\) 如何破坏系统的平衡。由于第一行为 0,说明外部扰动不会直接在电路上产生电流,而是作为负角加速度死死拽住转子的脖子。

六、 离散化方案与单片机 C 语言落地

物理世界的时间是连续的(存在导数),而单片机的世界只有一次次定时器中断的“节拍”(采样周期 \(T_s\))。将连续矩阵 \((A, B)\) 转化为单片机可运行的数字差分方程 \((A_d, B_d)\),是算法落地的最后也是最关键的一跃。
离散化目标:\(x_{k+1} = A_d x_k + B_d u_k\)

6.1 前向欧拉法 (Forward Euler):工程师的暴力快刀

直接用中断周期的割线斜率代替微积分的导数:

\[\dot{x}(t) \approx \frac{x_{k+1} - x_k}{T_s} \]

代入连续方程 \(\frac{x_{k+1} - x_k}{T_s} = A x_k + B u_k\),整理得到:

\[x_{k+1} = (I + A T_s) x_k + (B T_s) u_k \]

因此,欧拉离散矩阵为:

\[A_d = I + A T_s \]

\[B_d = B T_s \]

?? 警告:欧拉法的死穴
欧拉法极其节省算力,仅适用于中断频率极高的系统(如 \(T_s \le 100 \mu s\) 的 FOC 核心环)。如果采样频率稍低,或者系统极点偏高,这种一阶近似会导致 \(A_d\) 矩阵特征值跑出单位圆,引发代码算出的预测电流呈指数爆炸,最终导致单片机跑飞(发散)。

6.2 零阶保持器法 (Zero-Order Hold, ZOH):数学家的降维打击

考虑到 MCU 的 PWM 寄存器在整个 \(T_s\) 周期内会保持电压 \(u_k\) 不变(这就是 ZOH 的物理本质),通过求解连续微分方程的精确解析解并分段积分,我们得到绝对精确的离散矩阵:

\[A_d = e^{A T_s} \]

\[B_d = \left( \int_{0}^{T_s} e^{A \eta} d\eta \right) B \]

注:这里的 \(e^{AT_s}\) 不是简单的自然底数求幂,而是矩阵指数(Matrix Exponential),可通过泰勒展开求解。你会发现,欧拉法仅仅是泰勒展开截断了所有高阶项后留下的一阶近似。

6.3 算法落地 C 代码框架

在实际的 C 语言开发中,我们绝不会让单片机去算什么积分或矩阵指数。算法工程师会在 MATLAB 中用 c2d(sys, Ts, 'zoh') 提前算好这些常数矩阵,并在头文件中写死:

// ==========================================
// 直流电机状态观测器 (离散化 C 代码示例)
// ==========================================

// 预编译的 ZOH 离散化系统矩阵常数 (由 MATLAB 生成)
#define AD_11  (0.9985f)
#define AD_12  (-0.0120f)
#define AD_21  (0.0450f)
#define AD_22  (0.9991f)

#define BD_1   (0.0035f)
#define BD_2   (0.0001f)

// 状态变量结构体
typedef struct {
    float i_a;      // x1: 观测电流
    float omega;    // x2: 观测转速
} MotorState_t;

MotorState_t x_hat = {0.0f, 0.0f};

/**
 * @brief 在定时器/PWM 中断中调用的状态预测函数
 * @param u_a 当前外加电压 (PWM 占空比换算值)
 */
void StateSpace_Predict(float u_a) {
    float next_i_a, next_omega;
    
    // 矩阵乘加运算:x(k+1) = Ad * x(k) + Bd * u(k)
    // 这种形式彻底将具体的物理器件解耦为了纯数学运算
    next_i_a   = AD_11 * x_hat.i_a + AD_12 * x_hat.omega + BD_1 * u_a;
    next_omega = AD_21 * x_hat.i_a + AD_22 * x_hat.omega + BD_2 * u_a;
    
    // 更新状态记忆
    x_hat.i_a   = next_i_a;
    x_hat.omega = next_omega;
}
posted @ 2026-04-13 14:17  yangyiBL  阅读(13)  评论(0)    收藏  举报