这段时间一直在折腾永磁同步电机PMSM的转速环控制。双闭环PI在空载、额定工况下表现确实很稳定但一旦加上负载扰动、把转动惯量调大或者让定子电阻漂移一点转速曲线就开始拖泥带水。于是我把目光转向了滑模控制又进一步试了超螺旋滑模Super-Twisting Sliding Mode Control。这篇文章就围绕这个仿真过程展开把我从原理推导到建模仿真再到调参踩坑的全过程记录下来给正在做电机控制仿真的同行一个现成的参考。先说结论在PMSM转速环里用超螺旋滑模替代PI动态响应和抗扰能力确实有明显改善尤其是在参数摄动和负载突变的场景下转速跌落更小、恢复更快而且比普通滑模的抖振小得多。具体怎么做、为什么这样做、仿真里会遇到哪些坑下面我一条一条展开。1. 为什么转速环不继续用PI偏要换滑模1.1 双闭环PI的“舒适区”边界在哪PMSM矢量控制最常见的架构就是转速外环加电流内环。转速环输出的是q轴电流指令电流环负责快速跟踪让实际电流跟上然后通过SVPWM给逆变器生成电压。这样的双闭环结构在工况平稳、电机参数接近标称值时PI控制的表现完全够用。问题出在三处。第一是转动惯量J的变化J变大意味着系统的惯性变大同样的PI参数下相位裕度下降转速容易震荡J变小则系统过于灵敏同样的增益会导致过冲。第二是负载扭矩突变比如从空载直接跳到额定负载转速会先掉下来然后靠积分项慢慢拉回去这个恢复时间通常需要几百毫秒对某些工艺场景来说太慢。第三是电机参数随温度变化比如永磁体磁链在高温下会下降定子电阻随温度升高而变大这会让PI整定时的对象模型逐渐失准。PI控制本质上是一个线性控制器它的调节能力依赖被控对象的线性化模型。PMSM是一个强耦合、多变量、非线性系统虽然id0解耦后可以近似成线性模型但那是建立在“参数不变、扰动可忽略”的假设上的。一旦工况偏离这个假设线性控制器的性能就会打折。这是我认为换控制策略的根本理由。1.2 滑模控制的本质是“用不连续换鲁棒性”滑模控制的核心思想不是去精确建模扰动而是用一路高增益的切换项直接把扰动“顶”回去。控制量的形式大致是u u_eq M * sign(s)其中s是滑模面u_eq是基于标称模型算出来的等效控制项M * sign(s)则是让系统状态往滑模面上压的切换项。只要M的取值大于系统扰动的上界系统状态就会被强行推上滑模面然后在滑模面上滑向平衡点。这个过程的优点是扰动的影响被切换项彻底压制控制性能对参数摄动不敏感。代价就是抖振。sign(s)在理想数学里是阶跃跳变但实际离散系统中状态不可能精确停在滑模面上而是会在面附近来回穿越。每次穿越都会触发一次控制量的正负跳变反映到物理量上就是q轴电流的高频波动、电磁转矩脉动、转速曲线上的毛刺严重时甚至会让机械系统共振。我第一次用普通滑模做转速环的时候仿真倒是能跑但转矩波形上的抖振让人没法看控制器输出一直在高频振荡这种状态没法直接往硬件上搬。所以我又把注意力放到了二阶滑模尤其是超螺旋算法上。1.3 为什么偏偏是超螺旋滑模滑模控制的改进方向很多比如用饱和函数替代符号函数、加模糊边界层、用扰动观测器补偿等等但这些方案大多有一个通病为了消除抖振牺牲了鲁棒性或者换来了更复杂的结构。超螺旋滑模的思路不太一样。它把切换作用拆成两条通道一条通道对滑模面误差的平方根做连续化处理另一条通道把切换信号放到积分环节里。最终的控制量是这两部分的和等效来看高频切换被积分器“软化”了而系统依然拥有有限时间收敛的性质也不需要知道扰动的导数——这两个特性让它很适合用在电机控制这种对实时性和可靠性要求都高的场景。我当时选择它的另一个原因是参数少、结构相对固定。转速环控制器的核心参数只有两个增益试凑空间小比那些需要同时调节七八个参数的自抗扰方案更好上手。对于我这种希望快速在仿真里验证效果的人来说这个特性非常关键。2. 超螺旋滑模控制器的推导与设计2.1 PMSM转速环的数学模型在id0的矢量控制下PMSM的机械运动方程可以写成J * dω/dt 1.5 * pn * ψf * iq - TL - B * ω其中J是转动惯量pn是极对数ψf是永磁体磁链iq是q轴电流TL是负载转矩B是阻尼系数。这个式子忽略了电流环的动态因为电流环带宽通常远高于转速环可以近似认为iq能瞬间跟上指令值。把和iq无关的项全部看成扰动定义扰动项D -(TL B*ω)/J那么dω/dt a * iq D其中a 1.5 * pn * ψf / J。转速环的任务是给定转速指令ω*让实际转速ω快速跟随同时抑制扰动D的影响。2.2 定义滑模面和控制律取转速误差e ω* - ω滑模面定义为s e也就是让转速误差直接作为滑模面这个选择的优点是结构最简、物理意义清楚控制器设计目标就是让s收敛到0。之所以不用PID型滑模面s e c * ∫e dt是因为超螺旋算法本身已经带有积分通道再加一个外部的积分滑模面反而会让参数调节变复杂我在初期尝试时明显感觉到两者叠加容易产生积分饱和问题。超螺旋滑模控制律的形式是iq* (1/a) * [dω*/dt k1 * |s|^0.5 * sign(s) ∫ k2 * sign(s) dt]其中k1和k2是两个待整定的正增益。这个式子的结构可以拆成三部分理解dω*/dt是前馈项让控制器对速度指令的变化有更好的跟踪能力k1 * |s|^0.5 * sign(s)是比例类切换项它的力度随误差的减小而减小当距离滑模面较远时用力猛烈拉回接近滑模面时介入变得柔和∫ k2 * sign(s) dt是一个“缓慢累积”的项它专门用来对付常值扰动和慢变扰动。滑模面附近的高频切换都被这个积分器吸收最终送到q轴的参考电流反而比较光滑。把上面的iq*代回运动方程得到的误差动力学方程可以分析出只要k1、k2取得合适s会在有限时间内到达0系统状态被约束在滑模面上从而对扰动D不敏感。2.3 增益整定的实用准则增益k1和k2的具体取值理论上需要满足不等式约束约束条件涉及扰动上界的估计。但在工程实践中扰动上界很难精确知道所以我的做法是先按经验初选再在仿真里微调。给出一个可直接使用的起点k1取500到2000k2取5000到20000。单位取决于仿真里转速是rad/s还是rpm如果是rpm增益要相应放大几十倍。我仿真时转速用rad/s电机额定转速1500rpm大概对应157rad/s取k1800、k28000效果已经不错。调参的经验是先调k2再调k1。k2太小系统会在稳速时出现静态误差或者低频振荡因为积分通道没有足够力度去抵消常值负载k2太大转速会出现周期性振荡显得“发飘”。k1管的是动态响应速度增大k1启动响应更快但过大会让q轴电流出现明显尖峰。关于扰动的假设也要说清楚。超螺旋滑模要求扰动项的导数有界而不是扰动本身有界。这比普通滑模的约束更宽松也是对“为什么它能用更缓和的控制实现同等鲁棒性”这个问题的最直观解释。我之前用扩张状态观测器来估计这个扰动并做前馈补偿和超螺旋算法配合得也很好后面会再提。3. 在仿真平台里搭建完整的PMSM矢量控制系统3.1 系统整体的拓扑结构我搭的系统结构是典型的转速-电流双闭环只是转速环控制器从PI换成了超螺旋滑模。整体链路如下速度指令ω进入超螺旋滑模控制器输出q轴电流指令iqd轴电流指令id直接设0两个电流指令分别和反馈电流id、iq做差送入两个PI控制器PI输出得到dq轴电压指令ud、uq*经过反Park变换得到αβ轴电压送入SVPWM模块生成开关信号开关信号驱动三相逆变器逆变器给PMSM供电电机的机械输出转速反馈回转速环相电流经Clarke和Park变换反馈给电流环。这套结构最关键的改动就是转速环那一个模块。为了跟原来的PI方案公平对比我把搭建好的超螺旋滑模控制器设计成独立的可切换模块仿真里通过一个开关就能在PI和滑模之间切换这样能保证其他环节完全一致对比结果有说服力。3.2 电机参数和仿真环境的设置我用的是一组典型的小功率PMSM参数具体数值如下表。参数数值定子电阻Rs2.875 Ωd轴电感Ld0.0085 Hq轴电感Lq0.0085 H永磁体磁链ψf0.175 Wb极对数pn4转动惯量J0.001 kg·m²阻尼系数B0.0001 N·m·s直流母线电压311 V额定转速1500 rpm额定负载5 N·m仿真环境选择上我用的是某主流仿真平台和它的模型库求解器选变步长的ode23tb因为这种带高频开关的系统比较“硬”ode45经常跑得很慢。最大步长限制在1e-5秒仿真时长设为1.5秒采样时间固定在1e-5秒。这里有个重要细节控制器的采样时间要尽量接近求解器的最大步长如果步长过大sign函数切换的频率会受限抖振会以另一种方式重新出现。3.3 超螺旋滑模控制器的模块化实现我强烈建议把超螺旋滑模控制器封装成一个M函数模块而不是用基础元件搭。原因有两个一是控制律里有|s|^0.5和积分两项用基础元件搭很容易出错且难以调试二是封装之后改增益参数只需要改一个模块配合批处理脚本扫参数非常方便。核心逻辑的示意代码如下你在自定义函数模块里改成对应语言版本即可# 输入u(1)为转速指令omega_refu(2)为实际转速omega # 输出iq_ref即q轴电流指令 # 参数k1, k2, a 1.5 * pn * psi_f / J s omega_ref - omega sign_s sign(s) # 符号函数s0取1s0取-1 term1 k1 * sqrt(abs(s)) * sign_s term2 integral # 积分器状态初值设0注意限幅 iq_ref (d_omega_ref term1 term2) / a dq_omega_ref/dt 0 # 转速指令为阶跃时该项为0斜坡指令时需计算导数这里最需要注意的就是对s特别小或者为零的处理。sqrt(abs(s))在s0附近导数很大实际离散仿真里容易算出异常大的term1值导致iq_ref瞬间冲到限幅值。我通常在sqrt里面加一个很小的常数eps比如1e-6来避免数值尖峰。这个细节不处理好你会发现转速曲线在到达稳态的瞬间出现一个莫名其妙的尖刺。3.4 电流环PI参数的整定电流环我用的是传统PI参数按零极点对消法整定。电流环的传递函数近似为开环增益K * (Ls R) / LPI的零点应设计在电机电气极点附近也就是Ti L / R。带宽取得适中800到1200 rad/s比较合适太高了容易和SVPWM的开关频率互相干扰。我最后用的参数是Kp 12Ki 420。注意这里的单位体系必须和模型里的单位保持一致我做的是标幺值还是实际值自始至终都要统一。电流环整定的时候可以先让转速环开环用恒定的iq*强制电流跟踪观察电流阶跃响应超调控制在5%以内响应时间在几个毫秒级别就可以算整定完毕。电流环整不好转速环再高级也会被内环拖累这一点千万不要跳过去。4. 三组仿真对比实验从启动到突变再到参数摄动4.1 空载启动先看动态响应的底子第一组实验是空载启动转速指令从0阶跃到157rad/sPI方案和超螺旋滑模方案分别记录转速曲线。PI方案的参数是我认真调过的不是随便拿一组数据凑数。结果转速从0爬升到稳态大约用了0.45秒最大超调约4%进入5%误差带的调节时间约0.6秒。这个表现其实已经算不错了但转速曲线在接近稳态时有一个明显的“慢半拍”过程这正是积分项慢慢消差造成的。超螺旋滑模方案同等条件下转速爬升到稳态用了0.2秒左右超调几乎为零调节时间在0.25秒以内。转速爬升段的速度更快原因是切换项从起点就给了系统较大的加速力度而PI在误差大的时候主要靠比例项力度增长是线性的超螺旋滑模的|s|^0.5项在误差较大时带来的等效增益更大所以加速阶段更有劲。4.2 突加额定负载最见真章的一组第二组实验模拟运行中突加负载分别在0.6秒时从空载突加5N·m负载观察转速的跌落量和恢复时间。PI控制下转速跌落了约12rad/s恢复时间约0.5秒且转速曲线上有明显的小幅振荡才会慢慢回到给定值。这个振荡是PI参数在负载变化后重新平衡的过程不是纯积分延迟导致的。超螺旋滑模控制下同样突加5N·m转速跌落只有5rad/s左右恢复时间约0.2秒回落过程很平滑。原因也很直接负载突变引起的扰动项D的导数是脉冲式的超螺旋滑模的积分通道立刻响应把负载增量补偿掉了而PI的积分项需要时间积累动作用会偏慢。这就是两种算法在“先天结构”上的差距不是一味增大PI参数就能弥补的。这里我需要说明一下转速跌落的绝对值大小受电流环带宽和直流母线电压限制。如果负载突变太大电流输出到达限幅转速跌落该多大还是多大。超螺旋滑模的贡献是缩短恢复时间、减小持续偏差而不是突破物理极限。4.3 参数摄动直接挑战系统的未知变化第三组实验是令转动惯量J翻倍从0.001kg·m²变成0.002kg·m²其他所有参数不变重复第一组空载启动实验。PI控制在J翻倍后转速曲线出现了两者明显变化启动变慢大约用0.7秒才稳而且到达稳态后出现了约2rad/s低频振荡需要手动重新调参才能消除。这说明PI参数的鲁棒性有限对系统惯性变化非常敏感。超螺旋滑模控制的表现则稳健得多。J翻倍后启动时间从0.2秒变成了0.28秒超调依然很小稳态时没有振荡。整个响应形态只是略微变慢并没有因为参数变化而紊乱。这一点的原因可以追溯到超螺旋算法的结构扰动项D的变化幅度变大只要D的导数仍然有界积分通道就能应对系统不具备发散的路径。基于这三组对比我对这组超螺旋滑模参数在不同工况下都做了验证结论是可复现的。如果你自己搭仿真建议也按这个顺序来先空载看动态响应再突加负载看抗扰性最后改参数看鲁棒性。三个维度的结果都满意方案才算站得住。5. 仿真过程中踩过的坑以及对应的处理办法5.1 积分饱和和初值问题超螺旋滑模里有积分通道积分器的状态初值必须为0并且一定要加限幅。我一开始没限幅转速指令从0阶跃到额定值时积分项在误差持续为正的阶段疯狂累积等到转速接近指令值时积分器已经远超实际需要的补偿量结果转速直接冲出目标一大截再被修正回来形成大幅超调。这个现象其实和PI的积分饱和很像但超螺旋的积分增益k2有时取得很大超调会更剧烈。我的处理办法如下。将所有积分器初值设0并配置外部复位信号。转速指令每次跳变时如果系统希望“重来一次”可以用复位信号清零积分项。积分限幅按q轴电流限幅的60-80%来设。比如iq限幅20A积分项输出限幅设为15A因为积分项只是控制量的一部分还需要给比例项和切换项留出调节余量。在S函数里实现积分器时采用“抗饱和积分”方法先算当前步积分增量如果积分项已达到限幅且增量方向与限幅方向一致则丢弃该增量如果方向相反则正常累加。这样可以缩小积分器在限幅处“卡住”的时间。5.2 s0附近数值处理的细节这是我在调试中印象最深的一个坑。超螺旋控制律里有个|s|^0.5项一开始我按数学原式写结果仿真在转速到达稳态的瞬间电流波形上出现了一个宽度极窄的高幅值尖峰转速曲线有毛刺。原因很容易理解s趋近0时|s|^0.5趋近0但它的导数趋向无穷大离散求解器在s过零点附近会取到极小但非零的s值计算出的term1要么接近0要么突然很大数值上出现不连续。好在解决办法也不复杂term1 k1 * sqrt(abs(s) 1e-6) * sign(s)这里加1e-6是让sqrt函数在s0附近变为光滑函数。1e-6这个数值本身对控制精度的影响可以忽略但它消除了数值尖峰。类似的问题在符号函数上也会出现如果把符号函数换成tanh(s/δ)也能在一定程度上进一步压低抖振代价是系统的有限时间收敛性质被近似化。我个人偏好保持sign和sqrt的形式只做防数值异常处理毕竟我们做的是仿真真实应用里还有更多硬件层面的问题要面对。5.3 求解器和步长选择不当导致“假抖振”有一次我换了解算器配置用ode45搭配最大步长1e-3结果超螺旋滑模的转速波形出现严重的锯齿状波动电流波形几乎是噪声。我一度以为是增益没调好花了不少时间去扫参数最后发现是步长设置的问题。超螺旋滑模里sign函数的开关切换发生在滑模面邻域内如果求解步长太大系统在单个步长内就会穿越滑模面很远控制量按当前步长的状态计算下一个步长又被反向推回这个往复运动的频率完全由步长决定而不是由控制器动力学决定体现出来的就是剧烈的“数值抖振”。我的建议是使用变步长隐式求解器比如ode23tb最大步长不要超过1e-4秒。如果使用定步长求解器步长建议设在1e-5到1e-6秒之间。系统里还有SVPWM和逆变器开关开关频率通常在10kHz级别左右时间尺度上和1e-5秒匹配步长过大也会引入开关谐波混叠。这一点在仿真设置里就要提前想清楚不要等波形异常了再去排查。5.4 对比实验必须保证“同条件”做PI和超螺旋滑模的对比时容易忽略“其他环节完全一致”这个前提。比如电流环PI参数、SVPWM实现方式、求解器步长、甚至PMSM模型内部的初始化方式都会直接影响对比结果。我自己最开始也犯过一个错误对比的时候给PI方案用的是定步长1e-6给滑模方案用的是变步长结果两组曲线差别巨大根本分不清是算法差异还是仿真设置差异。保证同条件的具体做法是在工程文件里设计一个“基准配置脚本”统一设置电机参数、电流环PI、求解器、仿真时长、采样时间。对比时只切换转速环控制器这一个模块一切变量保持不动。这样做出来的结果才能算数不然那些对比结论很容易把自己误导。6. 从仿真出发下一步还能往哪个方向扩展6.1 转速环与扩展状态观测器的联合设计我在调试中注意到转速环的q轴电流指令中有相当大一部分是在补偿负载转矩和摩擦力矩等“慢扰动”这部分工作如果全交给超螺旋滑模的积分通道k2就得取较大值系统对测量噪声的敏感度也随之上升。一个可行的改造方向是引入扩展状态观测器ESO把负载转矩和低速摩擦作为扩张状态实时估计出来并在控制器里前馈补偿。这样超螺旋滑模只需要对付估计残差这一小部分扰动k2可以显著下调系统对噪声的鲁棒性更好。我在仿真里做过这个组合方案效果是突加负载转速跌落进一步缩小同时测得的电流纹波略有下降。6.2 增益的自适应调整k1和k2是固定的而系统的运行工况是变化的。启动阶段误差大且希望快速趋近k1要求较高进入精调阶段后过大的k1会引发微观层面的抖振。通过模糊规则或简单的分段调节逻辑让k1和k2随|s|的大小和误差变化率自动调整可以在不影响鲁棒性的前提下让稳态精度更好。这个方向适合那些希望把算法进一步产品化的朋友。6.3 低速和零速工况的特别关注PMSM在零速和低速时反电动势很小电流环的调节能力变弱超螺旋滑模在滑模面附近的收敛行为也会受到影响。对此需要叠加高频注入方法或者改用其他观测策略单纯靠转速环控制器本身解决不了。仿真验证时一定要加一段低速工况的测试不然很容易被“额定转速下表现良好”的结论迷惑。做了一圈仿真下来我个人的体会是超螺旋滑模并不是一种“神化”的算法它的优势建立在清晰的结构分析之上两条互补的控制通道一个管动态收敛一个管稳态补偿。仿真阶段它相对容易实现实际硬件部署时还有很多环节需要处理比如电流采样延迟、逆变器非线性、机械谐振等这些在仿真里看不出来。但至少对于控制器结构的选型来说它的抗扰能力和对参数变化的鲁棒性确实值得你在下一个PMSM控制项目里认真试一回。最后分享一个小技巧当你拿到一组现成的超螺旋滑模仿真参数时别急着直接跑工况图。先冷态运行一下把空载启动曲线的斜率、稳态电流纹波幅度、转速过冲量记下来然后手动改成只有k1没有k2的状态再看同一组曲线——通过这样的“剥离对比”你能很快建立起每个参数的直觉之后遇到异常波形判断起来会快很多。
阅读完成 · 觉得有帮助?