基于MPC与非线性终端滑模的PMSM调速仿真设计
前阵子做永磁同步电机PMSM调速仿真绕了不少弯路。一开始用“PIPI”的经典双环转速响应、稳态精度都还行但总觉得“调参试错”的味道太重启动大范围超调、负载突变掉速恢复慢、电机参数一变鲁棒性就露馅。换成模型预测控制MPC做电流环之后动态确实利索了不少电流跟踪又快又硬可速度环还是PI遇到负载扰动依然不够稳。后来我把速度环换成非线性终端滑模控制NTSM和MPC电流内环组合起来整个闭环才算真正立住了。这篇内容不是教材复述而是我把自己实际搭建这套仿真链路的过程、推导要点、参数整定逻辑和踩过的坑全部摊开来讲。适合三类人看正在做PMSM仿真但被PI调参折磨的同学想把MPC和滑模控制结合但不知道从哪里入手的研究者以及准备把复合控制算法落到Simulink里验证的工程师。下面直接进入正题。1. 为什么把MPC和终端滑模“叠”在一起三个控制方案的真实取舍先亮明结论这套系统采用的是“速度外环NTSM 电流内环MPC”的双闭环结构。NTSM负责速度和抗扰MPC负责电流跟踪与约束处理。很多文章喜欢在标题里堆一堆算法名词但如果你不清楚每个算法到底在解决哪个具体痛点仿真做出来也只会是一堆波形遇到问题根本不知道从哪下手。1.1 PI控制做速度环卡在哪儿PI速度环的特点是“线性”。只要工作点离调参点不远它的表现非常体面但PMSM调速是大范围工况启动时转速从0冲到额定值负载可能在某个瞬间突加、突卸电机温升还会导致定子电阻和磁链变化。线性控制器的增益一旦固定就只能在“快速响应”和“小超调”之间选一个折中你调大了Kp启动超调就上来调大了Ki负载突变恢复是快了但容易振荡。更麻烦的是PI没有显式的收敛时间概念。它保证的是“渐近收敛”也就是理论上看转速误差要无穷长时间才归零。工程上我们当然不会等那么久但大负载扰动下那一段“慢慢爬回去”的恢复过程就是PI速度环最露怯的时候。1.2 MPC做电流环优势和不省心的地方模型预测控制在一拍采样周期内用电机离散模型把所有可能的电压矢量的电流响应都算一遍然后挑一个让价值函数最小的矢量打出去。它的第一个好处是动态响应快它不是在“调增益”而是在“选最优动作”天然适合电流这种需要快速跟踪的物理量。第二个好处是约束嵌入直观。电流不能超过逆变器容量、直流母线电压有限这些都可以直接写进价值函数或者体现在候选电压矢量的集合里。传统PI要加抗饱和、加限幅、加解耦补偿MPC把这些统一成了一个优化问题。但MPC不是万能的。它对模型参数敏感定子电阻和磁链不准时预测出来的电流就会偏离实际它还有一个默认前提是“系统状态变化足够平滑”如果速度环不给力负载突变时iq指令像过山车一样MPC内环再快也追得很辛苦。说白了MPC解决的是“电流怎么快速跟踪指令”但解决不了“指令本身该怎么抗扰”。1.3 终端滑模补上的那块拼图滑模控制的核心思想很直白设计一个滑模面s用控制律把系统状态强行推到s0这个流形上之后系统沿滑模面运动对匹配不确定性完全不敏感。普通线性滑模面sceė只能保证指数收敛终端滑模在滑模面里加入非线性项e^(p/q)让误差的收敛时间是有限的而不是“理论上无穷”。把终端滑模放在速度环等于给MPC电流环前级加了一个“抗扰指挥官”负载突变时速度误差会通过非线性项被快速压缩它输出的iq指令变化更果断电流内环只需要做好自己“快且准”的本职工作。两者各干各擅长的正是整套方案的逻辑基础。下表是我梳理的三种方案对比方便你明确这套组合到底改进了什么控制方案动态响应参数鲁棒性约束处理主要短板传统PI双环调参依赖性强动态一般弱参数一变性能下降需另加限幅、抗饱和非线性工况下折中困难PI速度环MPC电流环电流动态好速度响应仍受限电流环对模型敏感MPC内环天然带约束速度环抗扰不足NTSM速度环MPC电流环速度有限时间收敛电流快滑模项补偿匹配扰动MPC内环天然带约束滑模抖振需处理看完这张表你就明白标题里的“基于模型预测控制”和“非线性终端滑模控制”不是算法堆砌而是一个互补的复合结构。2. 被控对象模型从dq方程到可仿真的离散形式仿真第一步不是写控制器而是把被控对象数学化。很多初学者一上来就拖一个Simulink的PMSM模块完事后面控制器里的公式却和模块内部模型对不上结果调半天不知道谁在捣乱。所以模型这块必须自己推一遍。2.1 dq坐标系下的PMSM方程我按最常见的表贴式PMSM来写转子磁场定向d轴电流控制为0。电压方程ud Rs·id Ld·(did/dt) - ωe·Lq·iq uq Rs·iq Lq·(diq/dt) ωe·Ld·id ωe·ψf其中Rs是定子电阻Ld、Lq是dq轴电感表贴式通常LdLqLsψf是永磁体磁链ωe是电角速度。电磁转矩方程Te 1.5·np·ψf·iq这里np是极对数。因为表贴式没有磁阻转矩项iq直接和转矩线性挂钩这让控制设计干净很多。如果是内置式PMSM转矩方程还要加上1.5·np·(Ld-Lq)·id·iq这一项整个控制器推导会更复杂本文所有公式都按表贴式展开。机械运动方程J·(dωm/dt) Te - Tl - B·ωmωm是机械角速度J是转动惯量Tl是负载转矩B是黏滞摩擦系数。电角速度和机械角速度的关系是ωe np·ωm。整套控制器的所有推导本质上就是在和上面这几个方程打交道。2.2 仿真电机参数怎么选我不建议一开始就用厂商的精确参数。做算法验证阶段选一组“参数分布合理”的典型值更重要因为你要的是验证控制律的逻辑而不是复刻某一台真实电机的所有非线性。我用的参数如下你可以直接抄去当初始值参数数值单位直流母线电压Udc311V额定转速1500rpm极对数np4-定子电阻Rs0.958Ωd轴电感Ld5.25mHq轴电感Lq5.25mH永磁体磁链ψf0.1827Wb转动惯量J0.003kg·m²额定负载转矩5N·m黏滞摩擦系数B0.001N·m·s这套参数的好处是额定转速1500rpm对应电角速度约628rad/s开关频率取10kHz时速度和电流两个环路的带宽预期比较分明方便后续观察控制效果。2.3 离散化与采样时间的确定逻辑控制器最终要跑在数字处理器上仿真是离散控制连续对象所以必须把模型和控制律拆开处理。电流环MPC的预测模型直接用一阶欧拉离散id(k1) id(k) (Ts/Ld)·[ud(k) - Rs·id(k) ωe(k)·Lq·iq(k)] iq(k1) iq(k) (Ts/Lq)·[uq(k) - Rs·iq(k) - ωe(k)·Ld·id(k) - ωe(k)·ψf]这里的Ts就是电流环采样周期。我选Ts1e-4也就是10kHz控制频率。为什么是10kHz因为两电平逆变器的开关频率如果设到20kHz以上仿真里逆变器损耗和计算压力都上来了控制效果在这个阶段不会有本质提升10kHz对FCS-MPC来说计算量适中开关频率也低于采样频率符合工程直觉。速度环采样周期可以直接沿用Ts因为PMSM速度环带宽远低于电流环不存在冲突。注意一个容易犯的错Simulink里仿真步长和控制周期是两回事。我习惯把求解器设成定步长1e-5控制器子系统里用Ts1e-4的触发采样这样一个控制周期内会有10个仿真微步逆变器和电机的连续动态才能被看清楚MPC的离散逻辑也不会和数值积分混淆。3. 速度环设计积分型非奇异终端滑模控制器的完整推导速度环是整个复合控制的“大脑”设计质量直接决定抗扰能力。很多同学一看到“终端滑模”就套二阶系统的非奇异终端滑模面seβ·ė^(p/q)结果推导到一半发现PMSM速度环是一阶系统根本套不进去然后卡住。这里我直接给出一个更符合一阶系统的设计思路。3.1 滑模面为什么这样取先定义速度误差e ω_ref - ωm速度环控制目标是让e快速收敛到0。把控制量设为iq指令。PMSM速度动态是一阶的控制量只出现在误差的一阶导数里如果照搬二阶非线性终端滑模面会在求导后丢失控制量导致整个推导断裂。所以我采用积分型终端滑模面s e β·∫e^(p/q)dt其中β0p和q取正奇数且p/q在0到1之间我常用p3、q5也就是e^(3/5)。为什么必须取正奇数因为误差e可正可负分数次幂要求底数不能为负但奇数分母的实值幂可以自然处理负数比如(-8)^(1/3)-2这在仿真里不会出NaN。p/q小于1意味着误差绝对值大的时候非线性项贡献大收敛速度更快越接近零非线性项越平滑避免终端的“抖着进”现象。当s0时e -β·∫e^(p/q)dt两边对时间求导ė -β·e^(p/q)这是一个有限时间收敛的微分方程。直观理解误差e会以一个与“自身大小的高于线性次幂”成正比的速率压缩误差越大压得越狠不像线性收敛那样后半程越来越慢。3.2 控制律推导与扰动补偿取滑模面对时间的导数ṡ ė β·e^(p/q)把PMSM运动方程代入ė ω_ref_dot - ωm_dot。令iq_ref为速度环输出忽略电流环过渡过程默认内环MPC跟踪足够快iq≈iq_ref这是一个在后续参数整定中要记住的假设ė ω_ref_dot - (1/J)·(Kt·iq_ref - Tl - B·ωm)其中Kt 1.5·np·ψf。为了让ṡ朝0收敛采用等速趋近律加饱和函数ṡ -k·sat(s/φ)其中k0φ是边界层厚度。合并得到控制律iq_ref (J/Kt)·[ω_ref_dot β·e^(p/q) k·sat(s/φ)] (Tl B·ωm)/Kt但这里面Tl是未知负载直接放进控制律无法实现。常规做法是把它替换成扰动观测器的估计值Tl_hat于是实际控制律变为iq_ref (J/Kt)·[ω_ref_dot β·e^(p/q) k·sat(s/φ)] (Tl_hat B·ωm)/Kt这个公式就是整个速度环的核心。第一项提供有限时间收敛的非线性控制力第二项补偿已知摩擦和估计负载。只要扰动观测器给出的Tl_hat足够准滑模切换增益k就可以选得比较小抖振也随之减小。3.3 稳定性证明的通俗化理解严格证明要构造Lyapunov函数V 0.5·s²对其求导V̇ s·ṡ -k·s·sat(s/φ)当|s|φ时饱和函数退化为符号函数V̇ -k|s| 0滑模面可以到达当|s|≤φ时控制工作在边界层内误差被限制在φ的邻域称为实际有限时间收敛。通俗讲只要控制力方向对能量函数一直在下降系统状态就会被拉到滑模面附近之后沿滑模面收敛。仿真中关键是把β、k、φ三者的配合关系想清楚β决定滑模面本身的收敛特性k决定把状态压回滑模面的力度φ决定抖振幅值与稳态精度的折中。我通常先定φ0.01k从小到大试β取5~20之间具体整定心得放到第7节。4. 电流环设计受限价值函数的模型预测控制实现速度环输出的iq_ref只解决“指令该怎么变”的问题真正让实际电流跟上去的是MPC。我用的MPC是有限控制集模型预测电流控制即FCS-MPC。它不经过调制器直接选择逆变器的开关状态适合验证算法逻辑也符合当前工业上对低开关次数、快速动态的追求。4.1 电流预测方程与一拍延时两电平逆变器有8个基本电压矢量6个有效矢量和2个零矢量。每个矢量对应一组三相桥臂开关状态[Sa, Sb, Sc]经过坐标变换可以得到对应的dq轴电压ud、uq。接着用2.3节的一阶欧拉离散方程做预测。只预测一拍够不够不够。数字控制从采样到施加开关状态存在一拍延时如果你在k时刻算出最优矢量到k1时刻才作用那么实际上系统状态已经是k1了。更严谨的做法是两步预测第一步用当前采样值预测k1时刻电流 第二步基于k1预测值针对每个候选电压矢量预测k2时刻电流 最终用k2时刻的预测值做价值函数评估。仿真中我会专门用一个变量保存“上一拍选中的矢量”做补偿不会嘴上说说代码里也一定要实现否则启动阶段电流波形会出现明显的畸变和振荡。4.2 价值函数设计价值函数是FCS-MPC的“品味”所在J λd·[id_ref - id_pre(k2)]² λq·[iq_ref - iq_pre(k2)]² λsw·Nsw其中id_ref0iq_ref来自速度环NTSM的输出id_pre和iq_pre是两步预测后的电流。λd和λq分别代表d轴电流误差和q轴电流误差的权重。我一般把λd取得比λq大一些比如λd1.5、λq1原因是d轴电流关系到磁场定向的准确性id偏离0会产生不必要的磁阻转矩和效率损失对d轴的“纪律性”要求更高。第三项Nsw是开关切换次数表示下一个候选矢量和当前开关状态之间改变的桥臂数λsw是开关动作权重。这一项的作用是降低平均开关频率但如果λsw太大电流动态会被拖慢波形出现明显滞后。实际仿真里我建议先把λsw设成0观察电流跟踪和THD再逐步加上去加的过程你就会看见开关次数降下来的同时电流畸变在增加找到平衡点。4.3 MPC实现里的计算细节FCS-MPC看起来只是“遍历价值函数取最小”但实现上有几个细节决定成败。电压矢量集合的优化两个零矢量在价值函数里的效果几乎一样区别只在Nsw项。我一般保留8个矢量做遍历这样价值函数能真实反映开关切换代价。电流限幅速度环NTSM在启动时输出的iq_ref很容易冲到几十安培如果不限幅MPC预测出来的电流都会落在不可行区域控制直接乱掉。我建议在速度环输出处加一个iq_max限幅通常取额定电流的2倍左右并且把限幅前的数据反馈给滑模面的积分项做抗饱和处理否则滑模面积分会越积越深恢复时出现长时间过冲。直流母线电压约束价值函数本身不显式约束电压但因为候选矢量只有8个每一个对应的实际电压都受Udc约束这就是“有限控制集”天然带约束的体现。你不需要在价值函数里额外加电压项这个信息已经编码在候选集合里了。5. 扰动观测器设计终端滑模控制里最容易被忽视的一环我见过不少同学做滑模控制仿真控制律里直接不写Tl仿真波形也能看因为他们仿真里根本没加负载突变。可一旦加上负载变化转速就持续稳态误差调大k又抖振。原因很简单滑模控制律里补偿扰动的那一项缺失切换项k再大也只是在和扰动拉锯。5.1 为什么必须观测扰动负载转矩Tl在控制律里是未知量。如果没有观测器你只能把Tl当0处理那么突加负载后滑模控制会利用切换项k·sat(s/φ)硬扛。k得足够大才能抗住扰动但大k带来的抖振会让电流指令毛刺严重进而通过MPC电流环传播到转矩波形上。正确的做法是让切换项只负责“残余不确定性”把可观测的大扰动用前馈项直接抵消。这就是为什么第3节的最终控制律里Tl换成了Tl_hat。扰动观测器的精度直接决定滑模切换增益k能压到多小。5.2 观测器方程我采用一个标准的降阶扰动观测器形式如下Tl_hat z K_obs·ωm ż -K_obs·(Kt·iq_ref - Tl_hat - B·ωm)/J其中K_obs是观测器增益z是辅助状态。这个观测器的思路是利用可测的角速度ωm构造Tl_hat的代数部分通过z的积分动态去追踪真实负载变化。如果观测器收敛Tl_hat会逼近真实Tl前馈补偿就成立了。在仿真中Tl通常是一个阶跃信号等效为一类缓慢变化扰动这个观测器是够用的。如果你要应对快速变化的扰动比如周期性负载可以把观测器换成扩张状态观测器或者给z的微分方程加入Γ·|e_obs|^(1/2)·sign(e_obs)这样的终端滑模项让观测误差也有限时间收敛。但基础版本先把标准形式跑通再谈升级。5.3 观测器增益整定K_obs不是越大越好。观测器带宽太高会把转速测量噪声放大到Tl_hat里然后通过前馈通道污染iq_ref带宽太低Tl_hat跟踪速度跟不上负载突变瞬间前馈补偿失效转速照样跌落一大截。我的经验是K_obs大约取速度环控制带宽的3到5倍具体先在仿真里给转速信号加一个微量的白噪声然后调K_obs直到观察Tl_hat波形以“跟随阶跃响应快、稳态噪声不明显”为准则。注意转子角速度在仿真里可以直接从PMSM模块的输出读取不用额外加编码器量化噪声但你在心里要清楚真实系统里这里是有测量噪声的所以增益不要压得太激进。6. Simulink仿真搭建从模型分层到结果解读的全流程理论推导再多最后都要落到Simulink里。我这里讲的是“能跑通、结果能解释”的搭建方式不追求花哨的界面。6.1 总体仿真架构整个模型我分成四大块电机与逆变器主电路Simulink的PMSM模块加三桥臂逆变器直流侧用理想电压源。测量与坐标变换采集三相电流、母线电压、电机角度和转速做Clark、Park变换得到id、iq和电角度。控制器子系统内部包含NTSM速度环、MPC电流环、扰动观测器三个MATLAB Function模块。参考给定与负载模块转速阶跃信号、负载转矩阶跃信号发生模块。主电路和控制器之间通过Goto/From或者直接在子系统端口连接不要偷懒把控制逻辑写成一锅粥。后续换参数、查波形都会方便很多。6.2 关键模块与求解器设置控制器子系统的时钟很关键。Simulink的MATLAB Function默认是每个仿真微步执行一次但MPC是按控制周期Ts工作的。我建议在控制器输入端加一个Rate Transition模块采样率设为Ts1e-4同时在MATLAB Function内部用persistent变量记录上次执行时间保证控制律严格按周期更新。逆变器我直接用了理想开关模型开关管导通压降和死区都忽略。这样做的原因是最初阶段要先验证控制律而不是让逆变器寄生效应干扰判断。等你把控制算法跑通了再换成带死区和非理想开关的详细模型对比两次电流波形你会对“控制算法的理论波形真实能实现多少”有更深刻的体会。求解器设置定步长1e-5解法器选ode4四阶龙格库塔。这个设置在中等复杂度的PMSM仿真里速度和精度都很均衡。如果你发现波形有高频毛刺先把步长降到5e-6试试而不是急着动控制器参数。6.3 仿真结果怎么看三个动态场景仿真跑完不能只看转速有没有到1500rpm我习惯固定三个场景做验证场景一是空载启动。给定转速从0阶跃到1500rpm记录调节时间、超调量。NTSMMPC的效果应该是转速一次性到达目标附近没有明显的超调现象整个启动过程在0.1秒级别就能完成稳态。场景二是加载扰动。在0.3秒时突加5N·m负载0.5秒时突卸。这个场景是整套方案的“主考场”重点看两个指标转速跌落最大值一般几十rpm以内算合格、恢复时间通常应当小于0.05秒。同时观察Tl_hat能不能快速跟踪真实负载以及iq_ref是否出现明显抖振。场景三是参数失配。把Simulink电机模块里的Rs改成控制器内参数的1.5倍磁链改成0.9倍重新跑加载场景。MPC和NTSM对参数失配都不是完全免疫的但NTSM的滑模项配合观测器前馈应该能把速度跌落的变化控制在可接受范围内。如果失配后波形恶化严重回头检查扰动观测器的带宽和切换增益k优先加大观测器带宽。7. 仿真中踩过的坑与参数整定心得这一节写的都是我实际碰到的坑有的现在想起来都觉得当时太傻。你提前看到就能少走好几趟夜路。7.1 符号函数的抖振第一版控制律里我用了sign(s)结果iq_ref波形锯齿状严重电流和转矩高频“咔咔”响。后来把sign(s)换成sat(s/φ)边界层取φ0.01抖振立刻柔和很多。这里有个权衡φ太大滑模的鲁棒性会退化转速误差稳态精度变差φ太小饱和函数接近符号函数抖振又回来了。我的实用方法是先把φ设得小一些观察电流波形出现高频抖动再逐步增大φ直到抖动消失且转速稳态误差仍能保持在一个比较小的范围内一般0.005到0.02之间就能找到平衡点。7.2 MPC权重系数怎么调我一开始λd和λq都取1结果id在动态过程中有比较明显的波动。后来把λd加到1.5情况明显改善。记住一个原则权重系数调整的是“优先级”而不是“量纲”。你可以把λq临时设成0观察q轴电流完全失控的表现再慢慢加回来这个过程中你会看到电流和转速之间的耦合是怎么被权重压下去的。7.3 抗积分饱和不好好写启动就过冲速度环的滑模面里有积分项一旦iq_ref被限幅积分项还在持续累积等到误差反向时这个“记忆”会让输出反向超调。这是我踩得最痛的一次。建议在iq_ref限幅触发时冻结积分项的增长或者让积分项跟踪限幅后的误差。写法可以很简单就是if判断加不加但作用非常关键。7.4 采样周期和求解器步长的混淆我第一次做离散控制器时把Simulink求解器直接设成1e-4控制器和逆变器全在同一步长结果波形怎么看怎么别扭电流纹波完全出不来。后来分开设置之后才豁然开朗。记住控制周期的Ts解决的是“多快算一次”仿真步长解决的是“连续对象在多细的时间尺度上被计算”两者不能混为一谈。FCS-MPC的开关动作发生在Ts时刻但逆变器输出电压在一个Ts内的连续效应步长越细才看得越清楚。7.5 一个容易被忽略的变量转速参考值的导数NTSM控制律里有一项ω_ref_dot。阶跃参考信号在0时刻跳变导数理论上是一个冲激仿真里直接当作0处理启动阶段会损失一部分跟随性。更好的做法是对转速参考做一阶低通或斜坡整形让参考信号本身平滑变化。实际上很多论文里不提这一步但真实仿真里加了斜坡参考后启动超调明显降低滑模面的初值力也小了很多。我的个人体会整套方案跑通之后我对“复合控制”的理解不再停留在名词上。MPC和终端滑模并不是竞争关系而是分别守住了“动态快速性”和“扰动鲁棒性”两个维度。你不需要在所有环节都用最复杂的算法关键是把每个算法放在它最能发挥价值的位置。如果你也想复现这套仿真我建议从PI双环开始跑通模型确认主电路和坐标变换没问题之后再一步步把电流环换成MPC接着把速度环换成NTSM最后加入扰动观测器。每一步替换都要保留对比波形不要一步到位否则出了问题你根本不知道是哪个环节引入的。我自己就是靠这种“逐步迁移”的方式定位过好几个隐性错误。最后再分享一个可以继续扩展的方向在MPC的价值函数里加入转速预测项把速度环和电流环合并成单层预测控制同时保留滑模观测器的扰动前馈。我目前的仿真基础已经支持这种改造但那是下一个故事了。这套架构足够你在实际工作或课题里折腾很久希望你也能在波形里看到自己满意的收敛曲线。