基于ADRC的PMSM调速系统Simulink仿真模型搭建与参数整定
做电机控制仿真这行当久了会发现一个规律PID虽然经典但碰上负载突变、参数摄动这类情况调来调去总有点力不从心。尤其做永磁同步电机PMSM调速系统的时候PI参数刚在一台电机上整定好换一台电机或者工况一变又得重新试。后来我把控制器换成自抗扰控制ADRC很多问题迎刃而解。这篇文章就把我搭建基于ADRC的PMSM仿真模型的过程、踩过的坑、参数整定的经验完整写出来。不管是正在做毕业设计还是做伺服驱动项目选型这套Simulink仿真方案都值得参考它能把“扰动估计补偿”这套思路直接落到能跑通的模型上。1. 为什么PMSM控制选择ADRC从“对抗误差”到“对抗扰动”的思路转变1.1 传统PID在PMSM控制里的固有短板在聊ADRC之前先把传统PID放在PMSM双闭环控制里的问题说透。PMSM的数学模型本身就是一个强耦合、非线性的系统d轴和q轴之间存在交叉耦合项反电动势还跟转速成正比。传统矢量控制用PI调节器本质上是在“对抗误差”——误差大了就加大比例持续存在就靠积分去消除。这个思路在工程上很成熟但有两个绕不开的痛点。第一个痛点是积分饱和。转速环PI控制器在电机启动或者负载突加的时候积分项很容易积累过头导致转速超调大、恢复时间长。我见过不少同学把积分限幅调到最大值结果电机一启动就猛冲接着振荡好几拍才稳定下来。第二个痛点是参数鲁棒性差。PI参数是按某一组电机参数电感、磁链、转动惯量整定的一旦电机温度升高导致磁链变化或者带载转动惯量变大实际系统的动态特性就变了原本那组PI参数就不再是最优的。I-PD结构的控制器能缓解超调问题但本质上还是依赖精确的数学模型去“预测”系统行为。而ADRC的核心思想完全不同它不纠结于误差有多大而是把系统模型不确定性和外部负载扰动统一成一个“总扰动”项用扩张状态观测器ESO把它实时估出来然后在前馈通道里把这个估计值主动抵消掉。说白了PID是在被扰动打了一拳之后才被动反应ADRC是提前把这一拳的力度看穿并架住。1.2 ADRC的三个核心部件和工程语言解释ADRC由跟踪微分器TD、扩张状态观测器ESO、非线性状态误差反馈NLSEF三部分组成。用一句大白话说它们的职责TD先把你要的速度目标做个“平滑处理”别让阶跃信号直接砸进系统同时给出过渡过程的微分信号。ESO系统的眼睛和侦察兵实时估计当前转速和那个看不见的“总扰动”。NLSEF拿着TD给的理想轨迹、ESO给的实测状态做误差反馈再加上ESO估计的扰动补偿值形成最终控制量。把这三部分放在PMSM转速环里具体解释一下。TD那边我给定一个目标转速1000rpmTD不会让控制器立刻去追1000rpm这个阶跃目标而是生成一条平滑的过渡曲线这样从根本上避免了超调——不是靠减小增益压出来的而是目标本身就变平滑了。ESO则是把“负载转矩变化”、“摩擦变动”、“参数辨识误差”这些乱七八糟的东西统统归结成一项总扰动f(x,t)用一个扩张状态去观测它再在控制律里减去这个观测值。NLSEF则是一个非线性组合通常用fal函数实现小误差大增益、大误差小增益兼顾响应速度和稳态精度。这三个部分配合起来对PMSM来说意义很大因为PMSM的模型里dq轴电流耦合项电感变化、磁链温度漂移、负载突变全都可以当作总扰动的一部分被ESO吃进去并补偿掉。这样控制器设计就不再依赖精确的电机动静态模型鲁棒性上了一个台阶。1.3 ADRC和PI控制在仿真阶段的直观对比我用Simulink做过一个对比同样一台PMSM给定转速从500rpm阶跃到1000rpm并在0.5秒时突加2倍额定负载。PI控制下转速先冲高到1080rpm大约0.6秒才稳下来换成ADRC之后转速最大超调被压在20rpm以内恢复时间缩短到0.2秒左右。更明显的是突加负载的瞬间PI要塌下去大约80rpmADRC则只有不到20rpm的波动。这个对比不是偶然。ADRC把“负载突变”当成总扰动的一部分ESO在几百微秒内就能把它观测出来并前馈补偿掉PI只能靠积分项慢慢把静差消掉。做仿真模型的时候这两者的差异在示波器上看一眼就非常直观也很适合放进论文或者汇报PPT里作为亮点。2. 搭建前的准备PMSM数学模型和ADRC离散化设计纸上谈兵到此为止真要在Simulink里搭模型第一步得先把PMSM的数学模型在头脑里理清楚。有人喜欢直接用Simulink库里的PMSM模块但我更推荐先自己搭一遍数学方程一方面能深入理解电机运行机理另一方面ESO的设计需要知道模型的结构形式特别是控制增益b0的取值跟电机参数直接挂钩。2.1 PMSM在dq旋转坐标系下的数学模型标准表贴式PMSMSPMSM在dq坐标系下电压方程和转矩方程如下电压方程ud Rs * id Ld * did/dt - ωe * Lq * iquq Rs * iq Lq * diq/dt ωe * (Ld * id ψf)其中Rs是定子电阻Ld和Lq是dq轴电感ωe是电角速度ψf是永磁体磁链。对表贴式电机LdLqL。转矩方程 Te 1.5 * p * ψf * iq机械运动方程 J * dωm/dt Te - TL - B * ωm其中p是极对数J是转动惯量TL是负载转矩B是阻尼系数。做id0矢量控制时d轴电流给定为0此时转矩只跟iq成正比。也就是说PMSM的速度控制问题在外环看来就变成了一个一阶被控对象控制量是iq输出是转速ωm中间夹着电流环的跟踪延迟和机械积分环节。ADRC的ESO设计本质上就是针对这个一阶系统的总扰动估计问题。2.2 ADRC各环节的离散化公式和Simulink实现选择ADRC在Simulink里实现有两种路径一种是用现成的第三方ADRC库另一种是自己用S-Function或者MATLAB Function写离散化算法。我强烈建议自己写因为现成库封装得太黑盒参数出了问题你完全不知道是哪个环节在作怪。自己写就几行代码调试起来明明白白。转速环ADRC的离散化设计常用的是一阶ADRC。下面给出核心公式。跟踪微分器TD安排过渡过程 x1(k1) x1(k) h * x2(k) x2(k1) x2(k) h * fhan(x1(k) - v_ref, x2(k), r, h0)其中v_ref是给定转速r是跟踪速度因子控制过渡过程快慢h0是滤波因子fhan是最速控制综合函数它的表达式比较长网上可以搜到标准形式这里不展开核心作用是既保证快速又避免超调。扩张状态观测器ESO e z1(k) - y(k) z1(k1) z1(k) h * (z2(k) - β1 * e) z2(k1) z2(k) h * (z3(k) - β2 * fal(e, α1, δ) b0 * u(k)) z3(k1) z3(k) - h * β3 * fal(e, α2, δ)其中z1观测转速z2观测转速变化率z3观测总扰动u是控制量iq给定b0是控制增益。β1、β2、β3是观测器增益α1、α2是fal函数的幂次δ是线性区间宽度。非线性状态误差反馈NLSEF e1 x1(k) - z1(k) e2 x2(k) - z2(k) u0 kp * fal(e1, α1, δ) kd * fal(e2, α2, δ) u(k) u0 - z3(k) / b0这里的核心逻辑是u0是非线性PD形式的反馈控制量然后减去ESO估计的总扰动除以b0这个补偿项把系统拉回纯积分串联型结构让NLSEF面对的是一个“干净的”积分对象。在Simulink里实现时把上面这些公式写在一个MATLAB Function或者S-Function里面输入是目标转速、实际转速输出是q轴电流给定。采样周期h一定要和模型的固定步长一致否则离散化误差会重到让你怀疑算法是不是写错了。2.3 控制增益b0的物理含义和取值方法ADRC里有个参数b0很多初学者不理解它到底怎么取。b0是控制量的增益估计值代表控制量对系统状态的直接影响程度。在转速环里b0的物理量纲是“控制量iq变化引起的转速加速度的增益”大致估算公式b0 ≈ 1.5 * p * ψf / J注意这里不考虑电流环的延迟。如果电流环动态足够快带宽是速度环的5-10倍直接按这个公式估算就行如果电流环比较慢要适当把b0调小因为电流跟踪延迟会让实际等效增益下降。我在做仿真的时候把J0.001kg·m²p4ψf0.2Wb代入算出来b0大约等于1200。ESO性能对b0的误差有一定的容忍度一般估算偏差在±30%以内ESO都能通过z3把这个增益误差当作扰动的一部分估计并补偿掉。这一点正是ADRC的强大之处——它不要求模型精确只要求b0的数量级大致正确。3. Simulink仿真模型搭建从整体架构到核心模块详解整个PMSM矢量控制系统的Simulink模型自底向上分为五层电机本体层、逆变器与SVPWM层、坐标变换层、电流环层、转速环ADRC层。下面拆开讲每一层的搭建要点。3.1 整体模型架构和信号流设计打开Simulink新建一个模型设置为定步长步长我习惯取1e-5秒10微秒。这个步长对SVPWM调制频率通常10kHz-20kHz来说足够还能保证数值稳定性。模型层级的信号流这样走给定转速v_ref时序信号进入ADRC转速环控制器输出q轴电流给定iq_ref。iq_ref和id_ref恒为0分别和实际反馈电流id_fb、iq_fb做差送入两个电流环PI调节器输出d轴和q轴电压给定ud_ref、uq_ref。ud_ref、uq_ref经过反Park变换需要转子位置角θe得到αβ坐标系下的电压uα、uβ。uα、uβ送入SVPWM模块输出六路PWM信号驱动三相逆变器。三相逆变器输出电压加载到PMSM定子绕组上电机输出三相电流ia、ib、ic和机械转速、转子位置。三相电流经过Clark变换和Park变换得到同步旋转坐标系下的id_fb、iq_fb反馈给电流环和ADRC。这个结构是最标准的id0矢量控制框架。ADRC代替了传统速度环PI其他部分保持不变。3.2 电机本体建模推荐用数学方程模块自己搭我建议用Simulink标准库里的“PMSM”模块也行但更推荐自己搭dq模型。自己搭的好处是可以随时改参数、暴露中间变量、插入故障注入口调试效率高很多。搭建方法用一个MATLAB Function实现PMSM的dq电流微分方程和机械方程输入是ud、uq、负载转矩TL输出是id、iq、转速ωm、转子位置θe。内部逻辑大致是did/dt (ud - Rsid ωeLiq) / L diq/dt (uq - Rsiq - ωe*(Lid ψf)) / L Te 1.5pψfiq dωm/dt (Te - TL - Bωm) / J dθe/dt pωm写MATLAB Function的时候注意状态变量要用persistent变量保存配合定步长求解器做离散积分。也可以用连续积分模块但我更习惯在函数内部用欧拉法做积分这样和ADRC的离散化风格统一。3.3 SVPWM模块的实现细节SVPWM是矢量控制系统里的关键环节。我推荐用基于“参考电压矢量合成”的标准七段式SVPWM实现步骤根据uα、uβ判断参考电压所在扇区。计算两个相邻基本电压矢量的作用时间T1、T2。根据扇区确定A相、B相、C相的开关切换时刻。生成周期为PWM周期的三角载波比较值输出六路PWM。具体公式不在这里全列网上现成的SVPWM计算函数很多。我提几个容易出错的地方扇区判断要严谨用uα、uβ的符号和大小关系判断别用atan2算角度再查表浮点运算量大还容易在边界出问题。T1、T2超过PWM周期一半时要限幅否则逆变器会过调制波形失真。死区时间要在Simulink里用“Transport Delay”或者门极逻辑模拟死区设置过小会导致桥臂直通过大则电流波形畸变加剧。仿真里我一般加2微秒死区刚好能看出死区效应又不至于太夸张。3.4 电流环PI和ADRC转速环的接口匹配电流环PI参数按经典工程设计方法整定电流环带宽取2000rad/s左右PI参数按“零极点对消”原则计算Kp LωcKi Rsωc。这样配对理由很直接电流环的传递函数是一个一阶惯性环节用PI的零点把被控对象的极点对消掉剩下的闭环就是一阶低通。转速环ADRC的输出是iq_ref输入是v_ref和转速反馈。这里有一个轻量级的限制问题iq_ref必须经过限幅处理防止电流过大烧毁逆变器和电机。在ADRC结构里限幅可以放在NLSEF输出之后、控制量施加之前。要注意限幅别把ESO的扰动补偿量也砍了否则补偿效果会大打折扣。所以实现上我把u0和扰动补偿分开处理iq_ref_saturated saturate(u0) - z3/b0这样即使u0饱和ESO的扰动补偿仍然全量生效。不过实际测试下来如果把扰动补偿放外面在重载启动工况下补偿项很大会让限幅失效所以更稳妥的做法是iq_ref_raw u0 - z3/b0然后整体限幅。代价是突变工况下补偿会被截断但总比超流安全。3.5 转子位置和速度测量的仿真模拟实际系统里转子位置来自编码器转速由位置微分或M/T法计算。仿真模型里可以直接用电机模型的真实θe、ωm也可以为了贴近实际在反馈通道上加一个一阶低通滤波器模拟测量延迟甚至加一个量化模块模拟编码器分辨率。我建议至少加一个低通滤波带宽设1000rad/s左右模拟实际测速环的滞后。不加的话仿真模型会过于理想ADRC参数整定得再好搬到实物上也会因为反馈噪声、延迟而表现打折。4. ADRC核心算法实现参数设计方法和整定流程4.1 经典的“带宽法”参数整定ADRC参数确实比PI多但整定路径是有章法的核心方法就是“带宽法”。先看ESO部分的三个增益β1、β2、β3它们跟观测器带宽ωo直接相关。当选好ωo之后按如下规则配置β1 3ωo β2 3ωo² β3 ωo³这就是典型的“带宽配置法”把ESO特征方程配置成——说起来就是让观测器跟踪速度由ωo决定ωo越大ESO跟踪和估计越快但放大噪声越严重。工程经验上ωo取转速环闭环带宽ωc的3到5倍。NLSEF部分的kp、kd则和控制器带宽ωc直接挂钩。对一阶ADRC理想配置是kp ωc² kd 2*ωc这也是和二阶系统标准形式对等出来的。不过NLSEF里的fal函数会让等效增益在小误差区域变大所以实际整定时kp可以比公式值略小个10%到20%。4.2 用极点配置理解ESO参数选择我换个角度解释一下为什么β1、β2、β3这么配。把ESO的动态方程线性化扰动的跟踪误差方程特征多项式是s³ β1s² β2s β3 0如果想让特征根都落在离原点ωo远的地方那就令特征多项式等于(sωo)³展开后就是s³ 3ωos² 3ωo²s ωo³所以β13ωoβ23ωo²β3ωo³。这个配置方法的好处只有一个参数ωo要调调观测器带宽就相当于同时调了三个参数避免了手动瞎试。实践证明用带宽法先把ESO调稳定再单独调TD和NLSEF比无头苍蝇一样乱调快得多。4.3 极点配置原理应用下面给一套实际能跑的ADRC转速环参数值。假设仿真电机参数额定电压310V额定电流4.5A额定转速3000rpm极对数4定子电阻2.5Ωdq电感8.5mH磁链0.175Wb转动惯量0.0008kg·m²阻尼系数0.0001N·m·s。b0估算1.540.175/0.0008 1312.5取整1300。转速环控制器带宽ωc取100rad/s观测器带宽ωo取500rad/s。那么kp 10000kd 200 β1 1500β2 750000β3 125000000TD部分跟踪速度因子r取2000滤波因子h0取0.001。fal函数的α1取0.5α2取0.25δ取0.01。这套参数在仿真里表现阶跃响应无明显超调0.2秒内进入稳态突加额定负载转速跌落30rpm以内0.1秒内恢复。拿这套参数做基准再根据自己电机的差异微调b0和ωc通常几次就能收敛到满意效果。4.4 仿真结果的分析维度调好之后从几个维度观察仿真结果是否健康第一个维度是ESO的观测精度。把z3总扰动估计值和实际的负载转矩折算值同时拉出来看如果ESO正常工作两条曲线应该基本重合。如果偏差大要么ωo太低导致观测滞后太多要么b0估得不准让补偿量失真。这个检查项特别重要因为不管NLSEF调得多精致只要ESO观察失真整个ADRC性能就无从谈起。第二个维度是控制量iq_ref的品质。看它是否平滑、是否频繁震荡、有没有长时间顶在限幅值上。如果iq_ref带高频毛刺说明ESO把测量噪声放大得太厉害适当调低ωo。如果iq_ref长时间饱和说明加负载超出了电机的物理极限或者TD安排的过渡时间太短可以增加过渡时间。第三个维度是转速波动的频谱特别是稳态是否出现固定频率的周期振荡这往往是ESO和NLSEF参数不匹配导致的极限环振荡。遇到这种情况优先减小kp或增大δ值让NLSEF的增益曲线更平坦振荡通常能压下去。5. Simulink仿真模型实施过程中的常见故障与排查仿真模型搭好之后开始跑几乎不可能一把过。我把调试过程中遇到频率最高的几类问题列出来附带排查思路方便各位直接对照处理。5.1 模型发散、数据溢出第一优先检查采样步长和代数环仿真报错“Inputs to outputs are not properly connected”或者数值飞掉十有八九是步长设置或者代数环的问题。定步长求解器如果步长大于PWM周期的四分之一SVPWM的三角波比较就会出现严重混叠电流波形乱成一团。步长一定要小于PWM周期的十分之一用10kHz的开关频率步长至少要1e-6到5e-6秒我通常用1e-5秒配合15kHz开关频率基本稳。代数环问题则出现在你用了直接馈通的数据通路比如电流反馈信号和PI输出之间没有经过任何状态。解决方法是把PWM比较值和电流反馈之间的通路加上Memory模块或Unit Delay切断代数环。这是Simulink建模最常见的新手坑。还有一种情况ESO的β3取得太大导致数值刚性步长又不够小积分直接爆炸。遇到这种把ωo调低一个数量级试试基本能稳住或者把求解器换成ode15s先跑一次验证逻辑再换回定步长。5.2 ESO观测值发散但系统稳定b0偏离真实值太多我遇到过非常迷惑的情况电机转速输出正常但z3越跑越大逐渐飘走。排查下来是b0设得严重偏大ESO为了拟合实际响应不得不估算出一个很大的负扰动来抵消控制量增益过高的问题。这种b0偏差超过真实值2倍以上z3就会有缓慢漂移。解决方法是把b0的估算公式重新算一遍注意转动惯量J必须包含电机转子惯量和负载折算惯量的总和。如果负载通过减速器连接折算惯量要乘以减速比的平方很多人在这里算错导致b0偏好几倍。5.3 稳态转速存在固定误差检查ESO的δ参数和fal函数线性区转速环在稳态时如果始终差那么几十转不回来常规PI会靠积分项把静差吃掉但ADRC的NLSEF里fal函数在线性区间δ内等效增益是有限的单纯靠比例型反馈不一定能把静差完全消除。解决办法有三个方向一是把δ调小让fal函数在小误差区域的等效增益更高二是把NLSEF里加一点误差积分项但注意别破坏ADRC的抗扰性三是检查ESO的z3是否真正补偿了负载转矩。实际排查下来最常出现的问题是z3补偿方向反了——控制量u的补偿项前有个“减号”你要是代码里写成加号ESO不但不消扰动反而放大扰动转速就会带上固定正偏差或者负偏差。5.4 电流环响应慢导致转速环振荡带宽匹配问题ADRC把转速环设计得很快但电流环带宽只要跟不上整个系统的相位裕度就不够。症状是转速波形出现中频振荡幅度逐渐加大最后系统保护性停转。用带宽法设计时电流环带宽至少要达到转速环ADRC带宽的5倍以上。也就是说转速环带宽100rad/s电流环带宽至少要500rad/s。如果电流环PI整定得偏保守转速环ADRC再激进也是白搭。一个实用的检查方法单独给电流环加一个阶跃看iq的实际跟踪时间常数是否符合预期。如果电流环响应时间超過10ms转速环带宽就别设太高先loop shaping再谈算法先进性。6. 仿真到实物移植的几个关键提醒6.1 离散化采样周期的匹配仿真里ADRC的采样周期h可以随便定因为整个模型同步推进。但到实物MCU上转速环和电流环的执行频率通常是不同的——电流环跑20kHz转速环只能跑1-2kHz受限于编码器分辨率和测速计算周期。这时候ADRC在仿真里用的h要改成实际转速环执行周期。ESO的离散化系数β1、β2、β3跟h强相关直接搬运仿真参数会导致观测器离散化后不稳定。有个经验法则离散化后的ESO稳定性要求ωo*h小于1。比如转速环执行周期0.0005秒ωo就不能超过2000rad/s。仿真里可以轻松设到5000rad/s到实物上就得降下来。6.2 反馈信号噪声对ESO的影响实物的转速反馈噪声远大于仿真里的理想信号。ESO的z3会把高频噪声放大传到控制量上这是高频扰动通道不可不防。仿真的最后阶段一定在转速反馈通道上加上带限白噪声模块看系统的噪声鲁棒性。如果噪声穿透过强调低ωo是最直接手段其次是加大TD的滤波因子h0。我之前做过一个测试不加噪声仿真非常完美加了±1rpm的测量噪声后iq_ref上出现了明显的高频抖振。把ωo从500rad/s降到300rad/s抖振幅度降了一半以上转速响应仅轻微变慢。这个权衡在工程上很值得。6.3 控制周期延迟的数字实现问题最后提一下控制延迟的问题。ADRC的ESO和控制律计算都需要时间从采样到输出PWM更新天然存在一拍延迟。仿真模型里如果不模拟这个延迟跑到实物上会发现相位裕度比仿真的差——差多少就看你的采样执行方式。建议在仿真模型的ADRC输出和电流环给定之间加一个Unit Delay模块模拟“当前周期采样、下个周期输出”的数字控制延迟。加上这一拍后如果ADRC还稳实物基本稳如果不稳那就回头调参数别到调实物的时候才发现问题。这一节的内容是我反复折腾之后得出的教训特别是ESO参数跨平台迁移这么点事说大不大但能把它处理好的工程师基本都能把ADRC从Simulink顺利搬到DSP或者MCU上。