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基本模块搭一个直流电机模型,核心是三个子系统:
- 电气子系统:输入ua,输出ia,包含Ra、La和反电动势反馈。
- 转矩子系统:ia乘以Kt得到Te。
- 机械子系统: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 参数辨识流程
下面这张图是我在实际项目中总结的辨识流程,你可以参考:
3.5 模型验证与校准
模型搭完、参数辨识完,怎么知道对不对?我的做法是——对比仿真和实测的阶跃响应。给同样的电压指令,看电流和转速的上升时间、超调量是否一致。
如果偏差超过5%,我会检查:
- 摩擦模型是不是太简单了?实际系统有库仑摩擦和Stribeck效应。
- 电感参数是不是随电流变化了?饱和效应在高电流下很明显。
- 温度影响考虑了没有?电阻随温度变化约0.4%/℃。
一句话总结:电机建模不是一次性的工作。随着系统老化、温度变化、负载改变,参数会漂移。定期做参数辨识,才能让仿真始终贴近实际。我每个季度都会跑一遍完整的辨识流程,确保模型精度。