3、伺服电机建模:从物理方程到Simulink仿真

电机建模这事,说难不难,说简单也不简单。我刚开始做伺服驱动时,总觉得直接拿厂家给的参数搭个模型就完事了。结果呢?仿真跑得挺欢,一上实际系统就露馅。后来才明白——模型精度决定了你的调优天花板。

这一章,咱们把直流伺服和交流伺服的电機模型掰开揉碎,再聊聊怎么在Simulink里搭出来,最后讲讲参数辨识那些坑。

3.1 直流伺服电机数学模型

直流伺服电机虽然现在用得少了,但它的模型是理解交流伺服的基础。说白了,它就是电枢回路加机械负载的组合。

3.1.1 电枢回路方程

电枢回路由电阻Ra、电感La和反电动势eb串联而成。根据基尔霍夫电压定律:

u_a(t) = R_a * i_a(t) + L_a * di_a(t)/dt + e_b(t)

其中反电动势与转速成正比:

e_b(t) = K_e * ω(t)

Ke是反电动势常数,单位V/(rad/s)。

3.1.2 转矩方程

电磁转矩与电枢电流成正比:

T_e(t) = K_t * i_a(t)

Kt是转矩常数,单位N·m/A。理想情况下,Kt = Ke(SI单位制下)。

3.1.3 机械运动方程

电机轴上的转矩平衡:

T_e(t) = J * dω(t)/dt + B * ω(t) + T_L(t)

J是转动惯量,B是粘滞摩擦系数,TL是负载转矩。

核心要点:直流伺服电机模型本质上是二阶系统,由电气时间常数τe = La/Ra和机械时间常数τm = J/B共同决定动态响应。

3.2 交流伺服电机数学模型

交流伺服电机(永磁同步电机,PMSM)的模型比直流复杂得多。我在项目中遇到过最头疼的事——明明参数都对,仿真就是抖。后来发现是dq轴耦合项没处理好。

3.2.1 dq轴数学模型

通过Clark和Park变换,把三相静止坐标系转换到两相旋转坐标系:

电压方程:
u_d = R_s * i_d + L_d * di_d/dt - ω_e * L_q * i_q
u_q = R_s * i_q + L_q * di_q/dt + ω_e * (L_d * i_d + ψ_f)

转矩方程:
T_e = 1.5 * p * [ψ_f * i_q + (L_d - L_q) * i_d * i_q]

机械方程:
T_e = J * dω_m/dt + B * ω_m + T_L

其中ωe = p * ωm,p是极对数,ψf是永磁体磁链。

我的经验:很多人忽略Ld和Lq的差异。对于表贴式PMSM(SPMSM),Ld ≈ Lq,磁阻转矩项可以忽略。但对于内置式PMSM(IPMSM),Ld < Lq,磁阻转矩贡献很大,必须保留。

3.2.2 直流与交流模型对比

对比项 直流伺服电机 交流伺服电机(PMSM)
控制变量 电枢电压ua dq轴电压ud、uq
转矩产生 与电流线性关系 与iq线性 + 磁阻项
耦合特性 无耦合 dq轴之间存在交叉耦合
模型阶数 二阶 四阶(含电气动态)
参数数量 4个(Ra, La, Kt, J) 7个(Rs, Ld, Lq, ψf, J, B, p)

3.3 Simulink中电机模型的搭建

我个人习惯用两种方式搭模型:一种是直接用Simscape Electrical的现成模块,另一种是自己搭数学方程。前者快,后者灵活。调试阶段我建议用后者——你能看到每个中间变量。

3.3.1 直流伺服电机模型搭建

用Simulink基本模块搭一个直流电机模型,核心是三个子系统:

  1. 电气子系统:输入ua,输出ia,包含Ra、La和反电动势反馈。
  2. 转矩子系统:ia乘以Kt得到Te。
  3. 机械子系统:Te减去TL和摩擦项,积分得到转速和位置。
% 直流电机模型参数示例
Ra = 1.0;      % 电枢电阻,Ω
La = 0.005;    % 电枢电感,H
Kt = 0.5;      % 转矩常数,N·m/A
Ke = 0.5;      % 反电动势常数,V/(rad/s)
J  = 0.01;     % 转动惯量,kg·m²
B  = 0.001;    % 粘滞摩擦系数,N·m·s/rad

3.3.2 交流伺服电机模型搭建

PMSM模型搭建的关键是处理好dq轴耦合。我建议用MATLAB Function模块写方程,比搭积木式连线更清晰:

function [id, iq, omega_m, theta_e] = PMSM_model(u_d, u_q, T_L, param)
    % 参数解包
    Rs = param(1); Ld = param(2); Lq = param(3);
    psi_f = param(4); J = param(5); B = param(6); p = param(7);
    
    % 状态变量(使用持久变量模拟积分)
    persistent id_old iq_old omega_old theta_old dt
    if isempty(id_old)
        id_old = 0; iq_old = 0; omega_old = 0; theta_old = 0; dt = 1e-4;
    end
    
    % 电气方程
    did_dt = (u_d - Rs*id_old + p*omega_old*Lq*iq_old) / Ld;
    diq_dt = (u_q - Rs*iq_old - p*omega_old*(Ld*id_old + psi_f)) / Lq;
    
    % 转矩方程
    Te = 1.5 * p * (psi_f*iq_old + (Ld-Lq)*id_old*iq_old);
    
    % 机械方程
    domega_dt = (Te - B*omega_old - T_L) / J;
    dtheta_dt = p * omega_old;
    
    % 更新状态
    id = id_old + did_dt * dt;
    iq = iq_old + diq_dt * dt;
    omega_m = omega_old + domega_dt * dt;
    theta_e = theta_old + dtheta_dt * dt;
    
    % 保存状态
    id_old = id; iq_old = iq; omega_old = omega_m; theta_old = theta_e;
end

注意:上面代码是简化示意,实际Simulink中应该用积分模块(Integrator)而不是持久变量。这里只是为了展示方程结构。另外,仿真步长dt必须足够小,一般取电气时间常数的1/10以下。

3.4 电机参数辨识方法

模型搭好了,参数从哪来?厂家给的datasheet往往是在标准工况下测的,实际运行中参数会变。我记得有一次,电机跑热了之后,电阻变化了20%,导致电流环震荡。从那以后,我每次调试都会做一遍参数辨识。

3.4.1 离线辨识方法

离线辨识是在电机静止或特定工况下进行:

  • 电阻Rs辨识:注入直流电压,测量稳态电流,Rs = udc / idc。
  • 电感Ld、Lq辨识:注入高频电压信号,通过电流响应幅值计算。我常用旋转高频注入法,一次就能把Ld和Lq都辨识出来。
  • 反电动势常数Ke辨识:用外力拖动电机到已知转速,测量开路相电压。
  • 转动惯量J辨识:做加减速实验,记录转矩和加速度,J = ΔTe / Δ(dω/dt)。

3.4.2 在线辨识方法

在线辨识是在电机正常运行中实时更新参数。你想想看,如果控制器能自动适应参数变化,那鲁棒性得多强?

最常用的是递推最小二乘法(RLS):

% RLS在线辨识电阻和磁链
θ(k) = θ(k-1) + K(k) * [y(k) - φ(k)^T * θ(k-1)]
K(k) = P(k-1) * φ(k) / [λ + φ(k)^T * P(k-1) * φ(k)]
P(k) = [I - K(k) * φ(k)^T] * P(k-1) / λ

其中λ是遗忘因子,一般取0.95~0.99。λ越小,算法跟踪越快,但噪声敏感度也越高。

我的建议:刚开始做在线辨识时,别一上来就全参数都辨识。先固定电阻和电感,只辨识转动惯量J和负载转矩TL。这两个参数变化最大,也最影响性能。等系统稳定了,再逐步放开其他参数。

3.4.3 参数辨识流程

下面这张图是我在实际项目中总结的辨识流程,你可以参考:

电机参数辨识流程 开始辨识 离线辨识阶段(电机静止或空载) 电阻Rₛ辨识 电感Ld、Lq辨识 反电动势Ke辨识 在线辨识阶段(电机运行中) RLS递推最小二乘法 模型参考自适应(MRAS) 参数更新到控制器 建议:先离线粗调,再在线精调

3.5 模型验证与校准

模型搭完、参数辨识完,怎么知道对不对?我的做法是——对比仿真和实测的阶跃响应。给同样的电压指令,看电流和转速的上升时间、超调量是否一致。

如果偏差超过5%,我会检查:

  • 摩擦模型是不是太简单了?实际系统有库仑摩擦和Stribeck效应。
  • 电感参数是不是随电流变化了?饱和效应在高电流下很明显。
  • 温度影响考虑了没有?电阻随温度变化约0.4%/℃。

一句话总结:电机建模不是一次性的工作。随着系统老化、温度变化、负载改变,参数会漂移。定期做参数辨识,才能让仿真始终贴近实际。我每个季度都会跑一遍完整的辨识流程,确保模型精度。