最近在帮某实验室搭PMSM(永磁同步电机)的伺服驱动模型时,客户反复问到一个点:能不能把负载转矩观测出来?当时项目用的是传统PI速度环,负载一突变,转速波动明显,恢复时间也拖得比较久。后来我直接把滑模观测器(SMO)接了上去,用MATLAB/Simulink搭了一版负载转矩观测模型,效果比预想的好。这篇文章就来聊聊这个模型是怎么搭的、公式是怎么来的、调参踩了哪些坑,以及从仿真到台架还差哪几步。
对于正在做永磁同步电机矢量控制、速度环扰动抑制或者无传感器控制相关课题的朋友,这块内容会很实用。
1. 为什么要在PMSM控制里单独观测负载转矩
1.1 观测负载转矩,本质上是补上机械侧的眼睛
在矢量控制框架下,电流环和速度环已经把电气侧看得足够清楚——d-q轴电流、转子位置、转速,都有传感器或者能通过估算得到。但唯独负载转矩,常规手段拿不到。你只知道电机带着多大电流,却不知道这些电流里有多少用来克服负载、多少用来加减速。负载转矩一旦突变,速度环只能靠PI积分一步步去补,动态性能自然差一截。
观测负载转矩最直接的价值,就是给速度环做前馈补偿。我的习惯是把它叠加到速度环PI的输出上,等效成一个“提前预判”的转矩指令。实测下来,负载突加瞬间转速跌落可以从额定值的10%压到3%左右,恢复时间也能缩短一半以上。如果应用场景是工业机械臂、电梯或卷绕控制这类负载变化剧烈的场合,这个收益会非常明显。
1.2 为什么选滑模观测器而不是龙贝格观测器
把负载转矩当作状态量来估计,最常见的候选方案是龙贝格观测器和滑模观测器。龙贝格观测器在线性系统里用起来很顺手,极点配置一摆就行,但它对模型参数误差和外部扰动比较敏感。PMSM机械方程里的转动惯量J、阻尼系数B本来就不容易标准,温度变化还会让永磁体磁链漂移,这些参数误差最后都会变成观测器输出的稳态偏置。我试过在参数偏差20%的工况下,龙贝格观测值已经明显不准了。
滑模观测器走的是另一条路——用不连续的开关项把观测误差强行拉到零,并保持在滑模面上。它在本质上对内部参数变化和外部扰动具有鲁棒性,只要增益设计合理,参数失配带来的影响会小很多。代价是抖振,这个后面专门聊。综合来看,SMO更适合电机这种参数时变、扰动明显的工况,这也是它在PMSM负载观测中被广泛采用的根本原因。
2. 滑模观测器的建模思路与公式推导
2.1 从机械运动方程到增广状态空间
PMSM在dq同步旋转坐标系下的电磁转矩表达式为:
Te = 1.5·p·(ψf·iq + (Ld - Lq)·id·iq)
对表贴式电机,Ld ≈ Lq,在id=0的控制策略下,Te = 1.5·p·ψf·iq,这就是qr轴电流到电磁转矩的标定关系。机械运动方程为:
J·(dωm/dt) = Te - TL - B·ωm
其中,J是转动惯量,ωm是机械角速度,TL是负载转矩,B是粘滞阻尼系数。把TL当作一个状态量,同时假设它变化缓慢,即dTL/dt ≈ 0,就得到机械侧的增广状态方程:
dωm/dt = (Te - TL - B·ωm)/J dTL/dt = 0
输出方程为y = ωm。这个增广模型就是所有负载转矩观测器的共同基础。区别在于,龙贝格观测器基于线性格林函数设计增益,SMO则引入不连续的滑模项。
2.2 滑模面选取与等效控制原理
滑模观测器的核心思路是设计观测误差的动态方程,使其能到达并维持在滑模面上。以转速估计误差s = ωm - ωm_hat为滑模面,观测器方程可以写成:
dωm_hat/dt = (Te - TL_hat - B·ωm_hat)/J + k1·sgn(s) dTL_hat/dt = k2·sgn(s)
其中k1、k2是待设计的滑模增益。当系统进入滑模状态后,s = 0,且ds/dt = 0。这时候,开关函数中的等效控制量包含了负载转矩的真实信息。将sgn(s)通过一个低通滤波器提取出平均值,就能得到一个连续的等效项,再经过相应的增益换算,即可还原出TL。
这里的“等效控制”概念是理解SMO的关键。可以把不连续的sgn(s)想象成一把高频敲击的锤子——它让误差在零附近来回穿过,宏观上观测值却稳定在真实值上。滤波之后,锤子的平均效果就变成了一股方向正确、大小合适的持续作用力。
2.3 增益设计的稳定性约束
我习惯采用Lyapunov函数来反推增益约束。构造V = s²/2,求导后代入误差动态方程,为了保证V < 0,需要满足:
k1 > |(TL - TL_hat)/J_hat|
而负载转矩估计误差的动态又由k2的符号决定,两者耦合。工程上不会去严格求解这个不等式,更常用的做法是:先保证“k1足够大”让滑模存在,再选k2控制收敛速度。一般取k1为电磁转矩加速度量级的1.5~2倍,k2根据实际响应调试。k1太大,抖振会更明显;k1太小,一旦负载突变速率超过观测器跟踪能力,误差会被瞬间拉出滑模面,造成观测值“跳变”。
3. MATLAB/Simulink模型搭建实战
3.1 模型整体结构与电机本体模块
我搭这套模型时没有直接调用现成的永磁同步电机库,而是用基础模块手动搭建,原因有二:一是便于跟定制化SMO逻辑衔接,二是能清楚掌握每一步的物理含义。
电机本体包含三部分,电压方程、磁链方程和机械方程。三相电压通过Clarke和Park变换转到dq坐标系,再由dq轴电流计算电磁转矩。用到的模块无非是Fcn、Gain、Integrator、Sum这一类基础模块。搭建顺序上,建议先搭电流动态,再搭机械动态,最后把反电动势反馈回路闭合起来。刚搭完时检查一个最简单的工况——空载启动并突加额定负载——看电磁转矩能不能贴近负载转矩,再往下做。
3.2 SMO观测器子系统的实现细节
SMO子系统分为两块:转速估计通道和负载转矩估计通道。转速通道中,除了积分器反馈,还有一个sgn(s)·k1的输入;转矩通道中则是sgn(s)·k2,同时输出TL_hat用于下一步运算。sgn(s)直接用MATLAB Function模块实现,比用Sign模块更直接,因为我还要在这里同时计算s的符号和幅值,为后续调试做准备。
一个关键细节是滤波器的位置。通常是在sgn(s)之后再接低通滤波器,提取等效控制量,再换算成负载转矩。滤波器选一阶低通即可,截止频率取速度环带宽的5~10倍比较合理。若叠加太多级滤波器,动态响应会被严重拖慢,观测器就失去了前瞻能力。
3.3 连续/离散设置与求解器选择
仿真层面,我推荐把整个模型处理成离散系统,用固定步长求解器。原因很直接:离散化能更真实地映射数字控制器里观测器的行为,同时避免连续求解器下出现的代数环报警。步长我一般设1e-5~1e-4秒,取决于开关频率。开关频率10kHz时,取1e-4秒较稳妥;如果研究抖振的高频成分,可以缩到1e-5秒。
值得一提的是,SMO在连续域和离散域的表现差异挺大。连续域中滑模面可以严格为零,离散系统中误差却在一个边界层内来回跳变,形成“准滑模”。所以,离散仿真中无需追求s严格等于0,只要边界层宽度可控,观测效果就算达标。
4. 负载突变仿真:结果、误差与参数整定
4.1 阶跃负载下的动态跟踪表现
我常用的验证工况是0.2s时从空载阶跃加载到额定转矩,转速指令保持在1000rpm。在k1=200、k2=5000、滤波器截止频率500Hz这组参数下,观测器在0.01s内就能把负载转矩跟踪到位。但加载瞬间,观测值会出现一个尖峰,幅度大约是目标值的115%,随后回落。这个尖峰对应的物理含义是:电磁转矩迅速上升以克服转速跌落时,观测器将部分电磁转矩的瞬态分量误判成了负载转矩。
要抑制这个尖峰,有两个方向:把k2调大一点,让转矩通道跟得更快;或者把滤波器的截止频率降一点。实际调参时需要在两者之间找平衡。下表是我在一组固定参数下观察到的典型现象:
| 调整动作 | 观测尖峰幅度 | 跟踪时间 | 稳态噪声 |
|---|---|---|---|
| k2增大 | 减小 | 缩短 | 基本不变 |
| 滤波器截止频率降低 | 减小 | 变长 | 明显减小 |
| k1增大 | 基本不变 | 略有缩短 | 明显增大 |
| 阻尼系数B失配 | 出现稳态偏置 | 不变 | 不变 |
4.2 观测误差的来源与低通滤波器取舍
SMO负载转矩观测的误差主要有三个来源。
第一,开关函数的平均化误差。sgn(s)经滤波后得到的等效控制量,本质上是一个存在“边界层”的近似值。边界层越厚,等效控制越粗糙。第二,滤波器的相位滞后。低通滤波器会引入延迟,负载快速变化时观测值的相位会落后于真实值,幅度越大延迟越明显。第三,离散化误差。固定步长下,离散滑模比连续滑模多了一个固有误差项,这个误差与采样步长成正比。
想同时抑制这三个误差,单个滤波器调整是不够的。我只推荐一个实践做法:滤波器截止频率定得比速度环带宽高一个数量级,以保证相位滞后可控;再把滑模边界层通过饱和函数h代替sgn来抑制抖振,h的取值一般在0.5%~2%额定转速对应误差范围内。
4.3 调参顺序与判断标准
调参顺序上,我的个人习惯是“先转速通道后转矩通道、先连续后离散”。首先把增益设到足够大,观察转速误差方向,确认滑模存在——此时观测值会贴着真实值小幅高频抖动。然后调k2,缩短负载转矩的上升时间和超调量。最后调滤波器,根据示波器的观测曲线逐步降低截止频率,直到稳态噪声可以接受。
判断标准我不看单一指标,而是看三个维度同步是否达标:稳态误差在2%以内,加载尖峰不超过目标值的20%,稳态抖振幅度小于目标值的1%。这三个指标之间存在内在矛盾,比如过渡追求稳态噪声小会把截止频率压得太低,导致加载尖峰变大。所以,我通常按应用场景分配优先级——伺服定位看重动态恢复速度,张力控制更看重稳态平滑。
5. 工程化落地的几个常见坑
5.1 转动惯量标错的典型表现
这是很多人问得最多的问题,也是我最想强调的坑。转动惯量J在观测器中是作为比例系数参与运算的。J偏大时,观测器以为电机惯性大,不会对转速误差做出足够响应,导致负载转矩观测值响应变慢;J偏小时,观测器反应过于灵敏,观测值出现振荡甚至超调。
我用J_true = 0.002 kg·m²的模型做过一组对比,当模型里设置J_hat = 0.003时,阶跃负载下观测值达到稳态的时间放慢了约60%;J_hat = 0.001时,观测值出现了明显振铃。这种误差不会直接让系统发散,但会严重恶化观测质量。工程上建议先用厂家提供的数据,再通过加减速实验反推J值,别只依赖铭牌参数。
5.2 抖振抑制方案对比
抑制SMO抖振,我实际对比过三种方案。
第一种是纯低通滤波,最简单,但相位滞后伴随而来,观测滞后与滤波深度成正比。第二种是用饱和函数sigmoid替换sgn,公式简单,边界层厚度h成了一个可调参数,效果比纯滤波好,因为它在边界层内部是连续的,不会产生额外的高频成分。第三种是超螺旋算法,把不连续项叠加为积分形式的连续项,抖振最小但实现复杂,需要调整的参数多(α、β、λ等),对初学者不太友好。
在MATLAB模型阶段,我建议先用第二种方案跑通逻辑,再考虑是否升级到第三种。实际工程里,超过80%的场景用饱和函数就能解决问题。下表是我在同等噪声水平下对比三种方案的实测结果:
| 方案 | 稳态转矩纹波 | 相位滞后 | 实现复杂度 |
|---|---|---|---|
| sgn + 低通滤波 | 较大 | 最大 | 低 |
| 饱和函数 sat(s) | 小 | 中 | 低 |
| 超螺旋算法 | 最小 | 最小 | 高 |
5.3 从仿真到台架的现实差异
仿真里跑得顺,不等于直接上电就对。我遇到的最大差异是采样噪声。Simulink里如果不主动加噪声源,观测器面对的是一个理想测量环境;而实际台架上,编码器反馈的转速信号本身就带量化噪声和齿槽扰动,这些高频噪声会直接被滑模微分放大。
另一个差异是离散周期的一致性。仿真模型里,求解器步长和采样时间可以设成完全一致;而实际控制代码里,速度环周期、电流环周期、观测器周期往往是错开的。我建议在搭建仿真模型时就按主芯片的PWM周期、速度环周期来离散化观测器,而不是等到代码移植阶段再处理。模型和代码的“周期对齐”能省掉大量调试时间。
6. 延伸思考与我的调参经验
6.1 后续可以在仿真模型上扩展的方向
负载转矩观测器搭好之后,天然对接两个方向。
第一个是速度环前馈补偿。把TL_hat直接叠加到速度环PI输出上,形成“PI + 前馈”的双通道结构,可以显著提升负载突变时的速度保持能力。我实测在阶跃负载下,恢复时间缩短约50%,转速跌落减少约60%。如果要实现更高性能,还可以把观测器输出再做一次微分,形成转矩变化率前馈。
第二个是参数在线辨识。既然观测器能连续估计负载转矩,只要转速、电磁转矩已知,就可以反推转动惯量J。这个思路可以扩展成转动惯量在线辨识模块,对负载变化剧烈的机器人应用尤其有价值。
6.2 我在调参过程中沉淀的几条经验
最后说几个实操层面的小节:
- 先用阶跃负载信号验证观测器逻辑,别一上来就叠加复杂工况。阶跃信号下看不到抖动细节,但能最快暴露增益和滤波器的错误配置。
- 增益调试时,先放大k1让系统出现明显抖振,再慢慢降下来。抖振出现本身就是一个“滑模已建立”的诊断信号,如果加再大k1都没有抖振,多半是模型接线或单位出了问题。
- 单位制是最大隐患。Simulink模型里角速度用rad/s、转速用rpm,力矩用N·m,单位不一致会导致增益量级完全失控。我的习惯是全部统一到国际单位制,在输出端口再转换显示。
- 保存一组“基准参数”作为回归测试基线。每次改动增益或滤波参数后,跑同一组仿真,对比观测误差的峰值和恢复时间,防止“越调越差”而不自知。
我在实际项目中养成的一个习惯是,把SMO观测器的输出同时接到示波器和数据记录模块里,仿真结束后直接分析数据曲线而不只看Scope显示。这样能精确测量峰值误差和稳定时间,而不是靠肉眼估。调参永远别靠感觉,让数据说话。