基于滑模观测器的PMSM负载转矩观测与Simulink实现

发布时间:2026/10/17 13:57:34
基于滑模观测器的PMSM负载转矩观测与Simulink实现
做永磁同步电机驱动控制最烦的问题莫过于负载突变时转速掉一大截等PI调节器反应过来再补转速已经跌了好几十转。你要是做伺服、做张力控制、做电动汽车电驱这类对动态响应要求高的系统这个动态速降往往就是致命的。前馈补偿是解决这个问题最直接的办法但前提是你得实时知道负载转矩是多少——电机轴上的负载转矩又不能直接拿传感器去测这时候就需要观测它。这篇文章记录的是我基于滑模观测器SMOSliding Mode Observer在Matlab/Simulink里搭建PMSM负载转矩观测模型的完整过程从运动方程推导、扩张状态构造、滑模面设计到Simulink模块搭建、仿真参数整定和踩坑处理都会讲到。内容适合刚接触电机控制、对状态观测器不太熟但手里已经跑通过FOC矢量控制的同学也适合想把负载转矩前馈补进去、但不知道从哪下手的工程师。我会尽量把每个公式背后的物理意义讲明白模型结构也会拆开给你看这样你拿到思路后不仅能复现还能按自己的工况去改。1. 为什么非要观测负载转矩一个现场场景说起我先描述一个实际场景。某传送带驱动系统用PMSM直接驱动滚筒额定转速1500rpm电机带载运行稳定。突然有一段物料压上输送带负载转矩从2Nm跳到6Nm转速瞬间被拉低。传统FOC速度环用的是PI调节器转速误差信号要先经过积分才能消除稳态偏差这个积分过程天然就慢。实测下来从负载突变到转速恢复到误差带内往往要经过150到300毫秒。对印刷、纺织这类对线速度一致性要求高的工艺这个恢复时间已经造成了废品。如果能在负载突变的瞬间就知道电磁转矩应该额外补多少直接把补偿量前馈到iq电流给定上速度环PI只需要处理残余的小偏差动态速降能减小一大半恢复时间可以压缩到几十毫秒以内。这就是负载转矩观测最直接的价值把扰动当成一个可观测量去估计然后把估计值变成前馈补偿量。负载转矩能不能直接测可以在轴上装转矩传感器或者用弹性联轴器加应变片但工业现场这么干的极少原因很简单转矩传感器贵、安装占用轴向空间、高速时可靠性差而且它测的是轴上的静扭矩对高频动态分量响应还未必跟得上。更实际的思路是负载转矩虽然测不了它的效果是作用在机械运动方程里的我们完全可以通过转速的变化反推负载转矩的变化。只要电机的机械模型足够准负载转矩就可以通过数学手段从可测量的电流和转速信号里重构出来。这里插一句观测负载转矩和观测转子位置/转速在思路上是相通的都是拿一个模型去预测系统状态再用预测误差去修正。PMSM无感控制里的滑模观测器估计的是反电动势进而解算转子位置负载转矩观测里的滑模观测器估计的是转速和负载转矩这两个扩张状态。两者的数学结构很相似但滑模面和等效控制的构造略有区别。我第一次把这两件事接在一起想通的时候才真正理解了为什么滑模观测器在电机控制里这么能打。负载转矩观测方案不是只有SMO一种常见的还有龙贝格观测器Luenberger Observer、扩展卡尔曼滤波EKF、模型参考自适应MRAS。这几种方法各有各的路子我简单做个对比方案核心思路优点缺点龙贝格观测器按线性系统理论配置极点用输出误差反馈修正状态结构简单、无抖振、参数好调对模型参数误差和扰动敏感鲁棒性一般扩展卡尔曼滤波在每个采样周期做预测更新两步递归抗噪声性能好能处理非线性计算量大矩阵运算在MCU上跑吃力参数难调模型参考自适应构造参考模型和可调模型用误差自适应律估计参数物理意义清晰自适应律设计有一定门槛收敛速度偏慢滑模观测器设计滑模面用不连续控制项强迫误差收敛对参数扰动鲁棒性强动态响应快存在抖振需要滤波处理选SMO的核心理由是鲁棒性和响应速度。滑模控制的特点是系统一旦进入滑模面运动就不再依赖于原系统参数只取决于滑模面的设计所以电机电阻变化、电感饱和这类参数摄动对观测精度的影响很小。而负载转矩观测恰恰是在线做的动态估计系统参数不可能永远和标称值一致SMO这种针对不确定性免疫的特性就很值钱。代价就是抖振这个我们后面单开一节专门处理。2. 滑模观测器的核心原理扩张状态与滑模面的构造2.1 从机械运动方程到扩张状态模型PMSM在dq旋转坐标系下的机械运动方程是J·(dωm/dt) Te - TL - B·ωm其中J是转动惯量kg·m²ωm是机械角速度rad/sTe是电磁转矩NmTL是负载转矩NmB是粘滞摩擦系数Nm·s/rad。电磁转矩Te在id0的转子磁场定向控制下简化为Te 1.5·p·ψf·iqp是极对数ψf是永磁体磁链Wbiq是q轴电流。在实际控制系统中id0是电流环给定的iq指令来自速度环输出所以Te在每一个采样周期里是已知量——直接由iq反馈值和电机常数算得。现在关键是负载转矩TL。它在一次控制周期内可以认为是恒定值吗严格说是缓慢变化的但它的变化速率远低于电气时间常数所以我们可以做经典的扩张状态假设把负载转矩看成一个新状态并且认为它的导数约等于零即dTL/dt ≈ 0。这不是说负载转矩不变化而是在一个足够短的控制周期内比如10kHz中断周期就是0.1ms负载转矩的变化量微乎其微把它当常数处理在数学上是合理的。这种把未知扰动扩张成新状态的建模方法就是扩张状态观测器这个名字的由来。于是状态方程可以写成dωm/dt (Te - TL - B·ωm) / J dTL/dt 0选择状态变量x1 ωmx2 TL输出y x1 ωm得到dx/dt A·x B·u y C·x其中x [x1, x2]ᵀA [[-B/J, -1/J], [0, 0]]B [1/J, 0]ᵀu TeC [1, 0]。看这个A矩阵上三角元素是-1/J说明转速状态和负载转矩状态是耦合的——转速的变化率受负载转矩影响而负载转矩本身没有动态它的变化完全靠观测器的校正项来逼出来。这个结构就是整个SMO负载转矩观测的理论基础。2.2 滑模面设计与等效控制量有了状态方程下一步就是构建观测器。SMO的思路是构造一个与实际系统结构相同的复制系统让复制系统的状态去跟踪真实系统然后用不连续的控制项符号函数把跟踪误差强制到滑模面上来。定义观测误差e1 ωm_hat - ωm其中ωm_hat是观测转速。观测器方程为dωm_hat/dt (Te - TL_hat - B·ωm_hat) / J k1·sign(ωm - ωm_hat) dTL_hat/dt k2·sign(ωm - ωm_hat)注意符号的方向我分别写了k1·sign(ωm - ωm_hat)和k2·sign(ωm - ωm_hat)作为校正项。把观测方程减去真实方程得到误差动态de1/dt (-B/J)·e1 - (TL_hat - TL)/J - k1·sign(e1) d(TL_hat - TL)/dt -k2·sign(e1)这里我把符号函数写成sign(e1) sign(ωm - ωm_hat)校正方向是让观测转速往真实转速方向拉。如果观测转速低于实际转速e1为正校正项为正推动观测转速上升反之亦然。滑模面选为s e1 0。当系统进入滑模面后e1被强制维持在零附近此时de1/dt 0观测转速紧跟实际转速由误差动态方程可得0 (-B/J)·0 - (TL_hat - TL)/J - k1·sign(e1) sign(e1) -(TL_hat - TL) / (J·k1)把它代入第二个误差方程d(TL_hat - TL)/dt -k2·[-(TL_hat - TL) / (J·k1)] (k2/(J·k1))·(TL_hat - TL)这是一个一阶自治方程只要k2/(J·k1)是负的实际取k1、k2同号即可保证负反馈方向负载转矩观测误差就会指数收敛到零。这说明滑模面上的等效控制量包含了负载转矩信息通过合适的回路设计负载转矩观测值会最终收敛到真实值。这里的数学推导看起来绕但核心就一句话转速跟踪误差的符号被用来驱动负载转矩观测值修正转速误差没了负载转矩修正量也随之稳定到真值。2.3 参数选取的逻辑不是越大越好增益k1和k2的选取是SMO能不能好用最关键的一步。k1决定转速观测回路的收敛速度和滑模切换强度k2决定负载转矩观测回路的收敛速度。先说k1。它要保证系统能进入滑模状态也就是要满足到达条件e1·de1/dt 0。把误差动态代入忽略B项的微小影响到达条件简化为e1·(-k1·sign(e1) - (TL_hat - TL)/J) 0这意味着k1必须大于|TL_hat - TL|/J也就是最初的负载转矩观测误差除以转动惯量。实际调试中k1最小值大致可以按最大可能的负载转矩变化幅值除以J来估算。比如J0.001kg·m²负载转矩可能突变5Nmk1至少取5000。留出1.5到2倍裕量取8000-10000比较稳妥。k1太小系统进不了滑模面观测器退化成普通PI性质的观测器鲁棒性优势就没了k1太大抖振幅度会进一步加大后端滤波器压力很大。再说k2。它决定负载转矩观测的跟踪速度k2越大收敛越快但也越容易把噪声放大。我个人的调试习惯是先把k1固定k2从较小值逐渐增大观察负载转矩阶跃响应曲线直到上升时间在可接受范围内且没有明显振荡为止。一个比较常用的经验配比是k2 (0.5~2)·J·k1但最终要以仿真波形为准。这里有一个初学者容易忽略的点SMO的负载转矩观测收敛是一个级联过程——必须先让转速观测收敛滑模面建立负载转矩观测才开始有效收敛。如果k1和k2的取值差距不合理比如k2比k1还大很多负载转矩观测会在转速观测还没稳定时就被迫快速修正整个环路容易振荡。我的做法是k1和k2至少差一个数量级让时间尺度分开。3. Matlab/Simulink模型搭建全流程3.1 整体架构设计模型的核心是双闭环FOC矢量控制框架外环速度环、内环电流环在这个基础上叠加负载转矩观测器。SMO的输入取机械角速度ωm、q轴电流iq或电磁转矩Te输出是观测负载转矩TL_hat。观测出来的TL_hat有两种接法一是接回iq电流给定做前馈补偿即iq_ref iq_speed_out 2·TL_hat/(3·p·ψf)二是只做监视不参与控制用于调试确认观测器本身工作正常。第一次做强烈建议先只用第二种方式确认观测器收敛了再接入控制回路。Simulink模型整体结构可以拆成这么几块PMSM本体用Simscape Electrical里的Permanent Magnet Synchronous Motor模块配置好极对数、定子电阻、d/q轴电感、磁链、转动惯量、粘滞摩擦系数逆变器与SVPWM用Universal Bridge SVPWM生成六路PWM直流母线电压按实际系统设定电流采样与坐标变换Clarke变换、Park变换采样频率与PWM频率一致电流内环PI调节器d轴和q轴各一个输出vd/vq经反Park变换送入SVPWM速度外环PI调节器输出iq参考SMO负载转矩观测器核心子系统我下面会专门讲负载转矩输入模块用一个Step信号模拟负载突变方便观测动态响应3.2 SMO观测器子系统的Simulink实现SMO的实现方式有两种第一种直接用积分器、增益、符号函数等基础模块搭通俗直观也方便你观察中间信号第二种用MATLAB Function写更简洁适合后期移植到代码生成。我先讲基础模块搭法。进入SMO子系统的输入有三个转速ωm、电磁转矩Te、以及使能信号。子系统内部按前面推导的状态方程来搭第一个积分器积分dωm_hat/dt输出ωm_hat第二个积分器积分dTL_hat/dt输出TL_hat对dωm_hat/dt的求和项Te/J - TL_hat/J - B·ωm_hat/J k1·sign(ωm - ωm_hat)对dTL_hat/dt的求和项k2·sign(ωm - ωm_hat)符号函数用Sign模块即可ωm和ωm_hat的差值在进Sign之前先经过一个很小的死区或饱和处理避免数值仿真时在零点附近频繁抖振导致仿真步长缩得很小。我实际用的是饱和模块实测值不超过±1效果比纯Sign更稳。如果采用MATLAB Function核心代码很紧凑function [wm_hat, TL_hat] smo_observer(wm, Te, Ts, J, B, k1, k2) % 滑模观测器同时观测机械角速度与负载转矩 persistent wm_prev TL_prev; if isempty(wm_prev) wm_prev wm; TL_prev 0; end e_w wm - wm_prev; sign_e sign(e_w); % 若误差接近零用连续函数代替符号函数抑制抖振 if abs(e_w) 0.01 sign_e e_w / 0.01; end dwm (Te - TL_prev - B*wm_prev) / J k1 * sign_e; dTL k2 * sign_e; wm_hat wm_prev dwm * Ts; TL_hat TL_prev dTL * Ts; wm_prev wm_hat; TL_prev TL_hat; end这里说明一下写成离散形式是为了和实际MCU代码风格一致Simulink里也可以直接拿MATLAB Function作为S-Function的替代。代码中加入了误差死区线性化处理实际效果比纯sign函数的抖振小很多这个方法在工程界被称为边界层滑模用线性区替代理想切换代价是观测精度有极小的损失换来了抖振的大幅抑制非常划算。3.3 电机与控制器参数配置参考仿真参数我按一套典型小功率PMSM参数来设定这个参数可以直接在Simulink里跑通参数数值说明直流母线电压311V三相220V整流极对数4定子电阻Rs0.958Ωd轴电感Ld5.25mHq轴电感Lq12mH内嵌式转子结构永磁体磁链ψf0.1827Wb转动惯量J0.003kg·m²含负载折算粘滞摩擦系数B0.0005 N·m·s/rad较小轴承阻力额定转速2000rpm开关频率10kHz仿真步长1e-6s控制系统参数速度环PI的Kp取0.15Ki取2.0q轴电流环Kp取15Ki取800d轴电流环参数同q轴。速度环带宽大概在20-30Hz电流环带宽在1kHz左右仿真按固定步长1e-6s跑ode3算法就行。SMO增益k1 15000k2 0.8。之所以k1取这么大是因为最大负载突变可以达到10Nm除以J0.003后是3333按3倍裕量取再留余量15000合适。4. 仿真结果解读与调试从波形判断观测器状态4.1 仿真工况设置我做仿真验证的工况是这样的电机空载启动速度指令给1500rpm在1秒时刻突加负载转矩5Nm持续到2秒随后撤去负载。这个工况能同时检验启动阶段的收敛特性和负载突变时的动态响应比较有代表性。如果你关心的场景是周期性波动负载也可以换成正弦负载同样能观测SMO的跟踪能力。仿真跑完后重点看三组波形转速响应曲线实际转速和观测转速是否贴合负载突变时转速跌落幅度iq电流曲线负载突变后iq的阶跃响应以及是否出现明显的振荡或毛刺负载转矩观测曲线TL_hat从初始值收敛到真实值的过程突变时刻的跟踪延时4.2 三条曲线的读法转速波形是最直观的。正常情况是0秒启动后转速在0.3秒内接近1500rpm有轻微超调1秒时刻突加负载转速往下掉在带SMO前馈补偿如果接了的情况下峰值速降只有几十转观测转速ωm_hat和实际转速ωm基本重叠说明转速观测收敛良好。如果ωm_hat和ωm有明显偏差先检查k1是不是太小或者转动惯量J参数和电机实际值差太多。iq波形看两点。第一点空载启动时iq有一个启动电流尖峰然后回落到接近零的水平如果不带摩擦补偿iq会趋近转矩电流分量。第二点在1秒时刻iq会迅速上升以提供额外转矩抵消负载上升过程的斜率反映电流环响应速度。如果iq波形出现高频振荡大概率是k1过大或者边界层死区设置过窄。负载转矩观测曲线是最关键的。正常情况应该是启动阶段TL_hat从0快速收敛到0附近可能有短暂的小幅度抖振1秒时刻TL_hat在十几毫秒内从0上升到5Nm附近上升过程可能有一些超调或抖动但随后稳定在5Nm±3%以内。如果TL_hat收敛到错误值比如稳定在4.5Nm那不是SMO的频率响应问题而是模型参数J或者B与实际系统差了太多——转动惯量偏差会直接影响转矩观测的比例关系。4.3 参数灵敏度转动惯量的坑这里我要重点说一个容易被忽视的问题SMO的负载转矩观测结果对转动惯量J的变化非常敏感。看公式TL_hat的收敛方程里面积分环节的比例项包含1/J。如果模型里的J比实际值大20%负载转矩突变时观测值的动态响应就会变慢稳定值倒是准确的因为稳态时不依赖J但动态跟踪精度会打折比如5Nm的阶跃负载超调可能达到20%。更麻烦的是J偏差过大时观测转速的收敛环路可能变成弱阻尼甚至振荡整个观测器自激。解决J偏差有两条路。第一条是离线辨识做加减速实验记录Te和dωm/dt用最小二乘拟合出J和B。这个方法在工业交流调速系统里很常见代价是需要一次标准测试过程。第二条是用自适应律在线调整J估计但这会引入额外的参数耦合复杂度上升很多不是必须就不建议。我在调试中还发现把B设为0和设为实际值对稳态观测精度影响不大因为B·ωm相对Te和TL通常是小量但把B设得离谱大比如按减速机的等效值算时启动阶段TL_hat会有一个明显的假收敛——观测器把一部分摩擦转矩当成负载转矩了。如果系统里有大减速比齿轮箱B的等效折算值可能很大这个偏差就很要命。5. 抖振处理、滤波滞后和控制闭环接入5.1 抖振的根源与三重抑制手段SMO的抖振是个绕不开的话题。抖振的根源是sign函数的不连续切换理想滑模是无限频率切换实际离散系统里切换频率受采样周期限制切换动作必然表现为高频分量叠加在观测信号上。这些高频分量如果直接参与控制会把电流环搅乱造成可听噪声和机械振动。抑制抖振我按三个层次来做 第一层是边界层替代也就是前面代码里写的用饱和线性区代替理想sign。边界层宽度ε的选择有讲究ε太宽趋近理想PI观测器鲁棒性变差负载突变时响应变慢ε太窄抑制效果有限。我的经验是ε取转速基值的0.1%-0.5%。1500rpm对应157rad/sε取0.2-0.5rad/s效果不错。 第二层是后端一阶低通滤波。对TL_hat输出加一个截止频率为50-200Hz的低通滤波器把切换残骸磨掉。注意滤波截止频率不能太低否则动态响应变迟钝前馈补偿的意义就打了折扣。我一般取100Hz兼顾响应速度和平滑度。 第三层是控制接入时只接前馈分量。如果怕滤波滞后影响动态可以不做纯低通而是把TL_hat分成趋势分量波动分量波动分量通过高通滤波后仅用于动态补偿稳态分量通过低通滤波后用于前馈偏置。这个思路在工程里叫前馈补偿扰动抑制的组合比单一低通接入稳妥得多。5.2 观测器输出接入控制回路的正确方式TL_hat接入控制有两个常见错误。第一个错误是直接把观测值除以转矩常数加到iq给定不做任何滤波。SMO输出在高频段有抖振残留电流环带宽1kHz这些高频分量进到iq给定后电流环会如实执行电机就会嗡嗡响。正确做法是中间加低通滤波或者用前面说的分层接入法。第二个错误是接入位置选错。负载转矩前馈不应该加到速度环PI的输出端之后再进电流环而是应该和速度环输出叠加后一起作为iq给定。两者的区别在于加到PI输入端会重新进入积分器形成不必要的滞后叠加在PI输出端则是纯粹的前馈通道不改变速度环的闭环特性只会加快扰动的抑制速度。还有个细节是补偿限幅。TL_hat前馈对应的iq补偿分量不能单独限幅要和速度环输出的iq相加之后统一限幅否则可能出现补偿值本身很大、叠加后超出电流极限而限幅逻辑还没生效的情况。我在模型里做一个饱和模块放在iq_ref最终输出处上下限按峰值电流设定。5.3 采样时间与模型初始化的工程细节Simulink里仿真步长设多大直接影响SMO抖振的呈现程度。我建议主电路和PWM环节用1e-6s固定步长控制环节电流环、速度环、SMO用1e-4s的多比率采样这样更贴近实际控制器的离散化时间。有些教程用连续时间Simulink一股脑跑也能看到波形但连续域和离散域的SMO性质差异很大——连续域SMO切换频率理论上无限离散域存在固有的极限环振荡。直接按离散系统建模更接近你最终烧进芯片的行为。模型初始化也要注意。SMO内部的两个积分器初始值转速观测初值设0实际电机启动前转速为0负载转矩观测初值设0假设空载启动。如果你加载了预置负载启动初始状态要记得把TL_hat初值设成预置负载大小否则启动阶段观测器要花较长时间从0追到真实负载。还有一个容易让初学者懵的问题是Simulink的代数环。如果在SMO子系统里直接用速度误差经过Sign模块输出再反馈到转速观测积分器这个结构没有引入单位延迟或Memory模块Simulink会报代数环错误。我的处理方法是在Sign模块后面加一个Unit Delay或者整个SMO子系统用MATLAB Function写强制赋值为离散状态更新彻底绕开代数环问题。6. 基于实测经验的调参顺序与验证清单代码跑通、波形出来了但离真正好用还差一步——系统的调参方法和验证流程。下面这些内容来自我实际调试多套PMSM驱动系统的经验每一步都有它的道理。调参顺序建议这样走先把SMO从控制回路中断开只观察TL_hat波形确认观测器本身收敛。这一步相当于给观测器做单元测试不要一上来就闭环接入。空载启动观察启动阶段TL_hat的收敛过程看是否在0.5秒内稳定在0附近超调量小于10%额定转矩。突加稳态负载比如50%额定转矩观察TL_hat的稳态误差应该在3%以内。如果稳态误差偏大优先怀疑J参数偏差其次是B设置过大。做负载突变动态测试观察TL_hat的上升时间和超调。上升时间超过50ms说明k2偏小或过滤器截止频率太低超调超过30%说明k2偏大或k1不足。接入前馈回路重复第3、4步对比转速动态速降是否明显改善。这个对比是验证SMO价值的最终依据——这里看不到改善说明前面的调试有问题。关于验证清单我习惯在模型里做成自动化用脚本跑三组工况阶跃负载、斜坡负载、正弦负载自动采集转速动态速降、恢复时间、TL_hat跟踪误差这几项指标和基准配置不带SMO前馈对比生成报告。这样做的好处是参数改动后能快速回归测试避免调好一个工况坏了另一个工况。另外提一句这套方法从Simulink模型移植到实际MCU代码时最需要注意的是固定点化和数据类型。TI的专用电机控制库、或者其他厂商的浮点MCU问题不大但如果用低成本定点MCUsign函数、乘法、积分器都要注意溢出——TL_hat的积分值有可能会累加到比较大的范围预留足够的变量宽度。最后的实测体会从我调试过的系统来看SMO负载转矩观测器做前馈补偿最明显的改善场景是低速大负载突变——这个时候速度环PI的调节能力最弱前馈价值最大而在高速轻载场景PI本身就能扛住SMO的贡献不那么突出。所以如果你的应用恰好是低速重载、频繁加减载的工况这个方案很值得做。至于观测精度我想给出一个务实预期SMO负载转矩观测的稳态精度能做到3%-5%动态跟踪带宽做到几十到一百赫兹这对绝大多数前馈补偿需求完全够用了。它不能替代转矩传感器做精密测量但在够用就好的工程权衡下这个方案性能和成本之间的平衡点非常好。最后分享一个小技巧调好的参数组建议保存成配置脚本连同Simulink模型一起放进同一个项目目录。因为SMO的参数和电机参数强相关换一台电机重新仿真时花几分钟更新参数脚本比在模型界面里一个个改要可靠得多。我就是因为吃了改参数忘了同步的亏结果仿真结果对不上白白排查了一下午。