
做永磁同步电机PMSM电流内环控制很多项目都有个共性卡点电机的模型参数一变控制器性能就大打折扣。传统PI需要老老实实整定碰上一台参数抖动厉害的电机波形就没了脾气换成传统模型预测电流控制动态响应确实快可它把希望全押在电感、磁链的精确值上一旦与实际偏离预测就变成“瞎猜”。最近几年自抗扰控制ADRC里的扩张状态观测器ESO和“无模型”思路的预测电流控制MPCC被越来越多地放在一起做仿真研究这套组合我实际推过几轮确实值得单独拆开讲讲。下面这篇文章会把整套方案从“为什么要用ESO”讲到“仿真里具体怎么搭”最后附上我个人踩过的一些坑。适合正在做PMSM电流环控制、想换掉传统PI、或者准备做无模型预测电流控制仿真的读者不管你是刚接触还是已经试过几版都能找到对得上号的环节。1. 方案定位与控制架构设计1.1 为什么我建议把ESO和无模型MPCC组合在一起先说结论这套方案解决的核心问题是“模型参数不可信”和“扰动补偿不及时”。传统模型预测电流控制MPCC依赖电机dq轴方程用Rs、Ld、Lq、ψf去推算电压矢量作用后的电流值。可实际电机运行中电阻会随温度漂移电感会随磁路饱和变化永磁磁链也会受到温度影响。仿真里这些都还好因为参数是写死的可一旦把控制算法拿去跑真实台架参数匹配就成了大问题。自抗扰控制里的ESO恰好能把这个麻烦“吞掉”——它把模型参数误差、交叉耦合、反电动势变化、外部负载扰动全都归并成一个“总扰动”然后在控制算法里实时估计并补偿。而“无模型预测电流控制MPCC”也不是说完全丢掉模型而是把电机模型简化成一个不需要精确参数的超局部模型把需要用到的“未知部分”交给观测器去估计。这么一来预测环节只用标称增益和观测值不需要知道精确的L、ψf到底是多少。两个技术拼到一起等于把“预测快”和“抗扰动强”两件事同时做了。我实际调试中的体会是单纯加ESO电流内环会变稳但动态性能还是受限于线性反馈的设计单纯做无模型MPCC动态确实快但一碰上负载突变或参数漂移误差会迅速积累。只有把两个合起来ESO提供扰动估计MPCC提供快速寻优两者的短板才能互相补上。1.2 整体双闭环控制架构怎么搭这套仿真的控制架构仍然是典型的双闭环外环是转速环内环是电流环。区别在于内环不再用PI调节器加SVPWM而是用“ESOMPCC”直接输出开关矢量。信号流向大致是三相电流先做Clark变换得到αβ轴分量再做Park变换得到dq轴电流id、iq转速外环输出q轴电流给定iq_refd轴电流给定id_ref一般给0id_ref、iq_ref进入MPCC部分MPCC同时接收ESO给出的扰动估计值最终选出最优电压矢量驱动三相逆变器开关管。这里有个容易被忽略的点ESO虽然产生自ADRC理论但在架构上它不是单独挂在外面的“补偿器”而是和MPCC形成闭环。ESO接收dq轴电压和电流输出的是d轴和q轴的扰动估计值这个值要参与MPCC的预测计算。如果你只是把ESO的输出加在电压上MPCC本身不做改变那效果会打折扣。正确做法是让扰动估计值直接进入预测方程让MPCC每一步都基于“修正后的预测模型”做寻优。转速环可以用PI也可以用简单的一阶自抗扰这个不强求。我建议先把转速环用普通PI跑通后续再替换成更高级的转速自抗扰否则同时调两个“抗扰”环节出来的问题不好定位。1.3 这个方案到底是在“无模型”什么很多初看这个方案的人都会问既然用了ESO甚至ESO本身也要基于一部分标称模型那“无模型”三个字怎么成立我理解这里的关键点是MPCC的预测环节不再依赖电机的详细物理参数。传统MPC要预测电流必须输入Ld、Lq、Rs、ψf并且这些参数直接影响预测精度而无模型MPCC把预测写成“电流变化≈控制增益×电压总扰动”的形式控制增益可以取一个不要求十分精确的标称值剩下所有说不清、算不准的部分统一塞进“总扰动”里由ESO在线估计。所以“无模型”是相对传统模型预测控制来说的指的是不依赖精确电机模型。ESO里头还是会用到L0这样的标称值但它不需要是真实值。实际调试中即使把控制器里的标称电感设成真实值的80%或120%只要ESO带宽合适仿真波形依然能稳定。这一点我反复验证过是这套方案抗参数漂移的本质原因。2. 自抗扰控制核心拆解TD、ESO与线性反馈2.1 ADRC三个组件各干什么自抗扰控制的标准结构有三个环节跟踪微分器TD、扩张状态观测器ESO、状态误差反馈控制律通常叫NLSEF或线性PD。TD的作用是给参考输入安排一个过渡过程避免阶跃给定直接冲击电流环。比如转速给定从0直接跳到1000rpmTD会把它变成一条平滑上升的轨迹。这在仿真里不会出大问题但在实机上能明显减少电流冲击和超调。做纯电流环仿真时id_ref0不存在跳变问题iq_ref跟随转速环输出TD可有可无但如果做完整电机调速系统我建议保留。ESO是整个ADRC的心脏。它把系统中的“内部模型不确定性”和“外部扰动”合并成一个扩张状态然后通过观测器实时重构出来。反馈控制律只用这个观测值就能把扰动抵消掉这就是自抗扰“抗扰”二字的来源。NLSEF或者说线性反馈是把参考信号和状态估计值做误差反馈。做仿真时很多人喜欢用非线性函数fal()但我觉得第一版先用线性反馈最稳妥。线性反馈参数少、物理意义清楚调通了再往非线性改也不迟。2.2 扩张状态观测器怎么把扰动“看”出来我们以永磁同步电机在dq旋转坐标系下的电气方程为基础。理想情况下Ld did/dt -Rs id ωe Lq iq udLq diq/dt -Rs iq - ωe Ld id - ωe ψf uq如果真实参数和模型参数不一致或者存在未建模的交叉耦合我可以在控制器里重新写成did/dt (1/Ld0)·ud fddiq/dt (1/Lq0)·uq fq这里Ld0、Lq0是控制器采用的标称电感fd、fq是“总扰动”里面包含了实际电阻、电感、磁链偏离标称值所产生的所有影响也包含了反电动势和d轴、q轴之间的耦合项。ESO要做的就是把fd和fq实时估计出来。拿d轴举例。把状态变量设为x1 idx2 fd则观测器可以写成ẑ1 (1/Ld0)·ud (1/Ld0)·ẑ2 β1·(id - ẑ1)ẑ2 β2·(id - ẑ1)其中β1、β2是观测器增益ẑ1是对id的估计ẑ2就是对fd的估计。q轴同理。这个结构看起来简单但仿真实现时有一个关键点ESO的输入电压必须是实际施加到电机绕组的电压而不是控制器输出后没经过限幅的理想电压。很多初学者直接把逆变器输出前的参考电压给ESO一旦电压饱和估计扰动就会偏差。2.3 ESO参数整定和标称模型的关系线性ESO的增益一般按“带宽法”整定。如果希望观测器带宽为ω0可以取β1 2ω0β2 ω0²。这个公式来自经典观测器极点配置好处是只有一个整定参数容易理解。但ω0不能随便取。太低的带宽观测器跟踪不上扰动的快速变化太高的带宽又会被测量噪声放大导致电流纹波明显变大甚至引发高频振荡。我实际试下来的经验是对仿真模型ω0可以取300~1000 rad/s具体要看开关频率和控制周期。比如控制周期50μs采样频率20kHzω0取500左右比较安全如果把采样频率降到10kHzω0再取800以上就容易出数字振荡。还有一个容易踩的坑ESO输出的是总扰动如果把它直接加到控制电压上必须注意正负号。我在仿真里曾经因为符号反了系统直接正反馈发散电流冲到限幅值。检查方法很简单在静止工况下给一个阶跃电压看扰动估计方向是否与模型偏差方向一致。先把ESO单独开环跑再接入整个控制回路。3. 无模型预测电流控制MPCC的设计3.1 传统模型预测和无模型的本质差异传统模型预测电流控制的基本套路是枚举逆变器可以输出的所有电压矢量对每个矢量用电机方程预测下一拍电流然后用代价函数选出最优矢量。问题是预测方程里的Rs、Ld、Lq、ψf一旦不准预测电流和实际电流就对不上选出来的“最优矢量”也就名不副实。无模型预测电流控制的做法则是把预测方程改写成不依赖精确参数的形式。目前工程里常见的有两种实现路线一种是查表法提前采集数据建立电压与电流变化量的映射表在线查表预测另一种是超局部模型法把电流变化率写成“控制输入增益×电压扰动项”。第二种更常见也更容易和ESO搭配。我在这套仿真里推荐第二种。原因很简单查表法需要大量离线数据而且对工作点覆盖要求高电机转速一变表就得重新标定超局部模型法只需要一个不精确的标称增益配上ESO的扰动估计就可以直接在线工作。3.2 基于超局部模型的离散预测方程把上一节的状态方程离散化可以得到MPCC用的预测公式id(k1) id(k) Ts·[ud(k)/Ld0 fd_hat(k)]iq(k1) iq(k) Ts·[uq(k)/Lq0 fq_hat(k)]其中Ts是控制周期fd_hat、fq_hat是ESO当前拍给出的扰动估计值。预测时枚举逆变器8种开关状态对应的电压矢量ud、uq代入公式算出下一拍电流再把所有结果拿去比较代价函数。这里要注意我给出的公式是“单步预测”。实际数字实现中由于计算本身要耗掉一拍时间很多教程建议做“两步预测”也就是用当前拍的电压作用结果先推一拍再从k1拍推到k2拍。如果控制周期足够长、计算时间占比明显两步预测能显著消除一拍延时的影响。仿真里如果发现电流波形整体滞后一拍优先怀疑这里。8个电压矢量分别是000、100、110、010、011、001、101、111其中000和111都对应零矢量实际寻优时可以让两者统一参与比较。每个矢量在dq坐标系下的投影需要根据当前电角度把αβ轴分量做Park变换。这个环节建议写成子函数复用的形式不要在每个候选矢量里重复写一遍坐标变换代码会清爽很多。3.3 代价函数设计与电压矢量寻优代价函数是整个MPCC里“最像控制器灵魂”的地方。最基础的形式是J (id_ref - id(k1))² (iq_ref - iq(k1))²它的含义很直白谁的预测电流更接近给定谁就胜出。实际仿真里我强烈建议再加两项电流限幅项和开关切换惩罚项。电流限幅项可以用“如果预测电流绝对值超过Imax就在J上追加一个很大的惩罚值”来实现。不加这个的话启动瞬间可能出现预测电流明明超限但因为误差平方不大最终仍被选中导致仿真电流波形出现尖刺。开关切换惩罚项的做法是统计候选矢量相对上一拍矢量的开关变化次数乘以权重λsw再加到J上。λsw取太小开关频率很高电流纹波小但逆变器负担重λsw取太大开关次数少但电流谐波变大。我的起始建议是λsw0.01到0.05具体结合纹波要求折中。整个寻优流程可以写成读取当前id、iq、电角度θe、ESO输出的fd_hat、fq_hat。根据逆变器8种开关状态计算当前电角度下的ud、uq。对每个候选矢量用离散预测方程算出id(k1)、iq(k1)。计算代价函数J判断是否超过电流限幅。选出J最小的矢量输出对应开关状态。很多人在仿真里会用一个“for循环”遍历8个矢量这没问题。如果追求代码可读性也可以把8个矢量的dq分量预先做成表格运行时查表加坐标旋转。4. 仿真搭建的实际步骤4.1 仿真参数与模型配置要做这套仿真必须先有一组能跑通、能复现的电机参数。我以前验证过的典型参数如下参数值说明额定功率2kW常见小功率伺服级别极对数44对极定子电阻Rs0.958Ω标称值d轴电感Ld5.25mH表贴式可设Ld≈Lqq轴电感Lq5.25mH永磁磁链ψf0.1827Wb直流母线电压311V三相220V整流常见值额定转速1500rpm转动惯量J0.003kg·m²控制周期Ts50μs即20kHz仿真步长建议设成固定步长比如1μs。电机模型如果用理想开关器件步长过大会出现明显的数字振荡如果直接用平均模型可以放宽到5μs。MPCC部分不要使用变步长预测控制天然适合固定步长离散化。4.2 总体仿真模型结构与信号流向在仿真平台里搭模型时我习惯把系统拆成几个独立封装模块PMSM本体、逆变器、坐标变换、转速外环、ESO、MPCC。这样每一块都能单独调试。PMSM本体用现成的电机模型模块也可以但我更推荐自己搭dq轴模型因为这样方便“故意改参数”来测试鲁棒性。自己搭的话输入是ud、uq输出是id、iq和电磁转矩Te再加上一个机械运动方程得到转速。逆变器可以用理想开关模型也可以直接用受控电压源代替关键在于MPCC输出的是离散开关状态还是连续电压。信号流向要特别注意一个顺序问题MPCC在当前控制周期输出的开关状态要等到下一个控制周期才实际作用于电机。仿真里如果直接让当前电压立即参与ESO计算就和真实系统不一致。处理办法是在MPCC输出端加一个单位延迟模块模拟一拍延时。这种细节往往决定仿真结果和实际台架的吻合度。4.3 ESO和MPCC关键模块的实现细节ESO在仿真里最好用MATLAB Function或者S-Function实现不要用一堆积分模块拼否则参数修改特别麻烦。我的实现习惯是写一个函数输入当前ud、uq、id、iq输出fd_hat、fq_hat内部做欧拉离散化。例如d轴ESO的离散形式可以写成z1_d z1_d Ts·(ud/Ld0 z2_d/Ld0 β1·(id - z1_d))z2_d z2_d Ts·β2·(id - z1_d)这里有个细节输出扰动z2_d到底要不要除以Ld0取决于状态方程的形式。我前面的公式里扰动项在方程中是“直接以电流变化率形式出现”所以z2_d本身就可以直接当作扰动估计值。如果你按其他文献的写法扰动是“电压形式”那就要注意换算。仿真结果出现几倍偏差时多半是这里没统一。MPCC部分更简单就是把枚举、预测、代价函数三件事写进去。所有波形数据建议用Scope加To Workspace的方式保存便于后处理。电流波形加一个滤波显示和原始显示分开看因为MPCC的开关纹波本来就比SVPWM大滤波后看不出真实控制质量。4.4 需要用到的测试工况一套方案有没有效不是只看阶跃响应。我设计测试工况时至少会跑三组。第一组是空载启动到1000rpm观察启动超调、稳定时间和电流冲击。如果电流响应拖沓先检查ESO带宽和MPCC的代价函数权重。第二组是在0.3s时突加10Nm负载观察转速跌落和恢复时间。这组能直接检验ESO对负载扰动的补偿能力。如果转速波动大问题多半在转速环而不是电流环。第三组是参数扰动测试把电机模型里的电感和磁链改成标称值的1.5倍但控制器里的标称值保持不变。这种工况是传统MPCC最容易崩盘的测试。如果这套方案在参数偏差50%时还能稳定说明设计目标达到了。5. 常见问题速查和调参避坑5.1 常见问题速查表现象可能原因处理办法电流发散、直接冲到限幅ESO反馈符号反、增益过大或电压饱和单独验证ESO符号先降带宽电流波形滞后一拍没有考虑计算延时改成两步预测静止时q轴有脉动ESO初值或反电动势补偿符号错误将fq_hat在零速下置零观察电流纹波很大λsw太小、控制周期过长增大开关惩罚或减小Ts启动阶段超调大TD缺失或转速环PI过强增加过渡过程或降转速环增益MPCC选择电压矢量频率不规律没有加开关惩罚项在代价函数里加λsw参数偏差稍大就振荡ESO带宽不足提高ω0但不要超过采样频率的1/105.2 关于调参价值的几条想法我调试这套方案最大的感悟是不要一上来就同时调ESO和MPCC。先把ESO单独接上阶跃电压观察扰动估计是否收敛再把MPCC里的扰动项先置零跑一套基础预测控制确认基础版没问题后才把扰动估计接进预测方程。这样每一步的问题都有明确归属。参数选择上电流预测里的Ld0、Lq0可以先用电机铭牌参数但不要花太多时间精修。ESO带宽才是关键因素。带宽太低参数鲁棒性提升不明显带宽太高系统对噪声敏感。我习惯先用500 rad/s起步看电流跟踪情况再逐步往上加。还有一点如果你在仿真里看到转速环和电流环互相牵制先调电流环。电流环是内环它的动态响应必须比外环快否则整个系统会出现“外环使劲催内环跟不上”的奇怪振荡。MPCC本身动态很快电流环通常能在几个控制周期内跟上给定这时候转速环反而要放慢一些。6. 结果评估方向与参考文献6.1 仿真结果的评估重点做完仿真不要只看“波形好看”。我评估这套方案时会重点关注三个维度。第一动态品质。电流环的阶跃响应是否能在1~2个控制周期内完成启动超调是否控制在允许范围这里要注意MPCC在不同电压矢量下的响应速度不一样波形可能不像PI那样“平滑”但只要电流能快速进入目标范围就是合格。第二鲁棒性。把电机参数改变20%、50%、甚至100%去跑看输出是否仍然稳定。这个测试结果通常是你向别人介绍这套方案的底气所在。如果参数偏大之后电流纹波明显增加先检查ESO是否真实补偿了参数偏差而不是只看最终转速稳不稳。第三开关频率和电流纹波的平衡。MPCC的电流纹波一般比规则SVPWM大这是它的固有特点。如果你需要在纹波和动态之间取折中可以调整λsw也可以考虑把MPCC扩展成“多矢量MPC”在一个控制周期里组合两个或多个矢量那样复杂度会上升但波形质量会明显改善。6.2 参考文献做这套方案可以重点查阅以下方向经典ADRC相关文献从PID到自抗扰控制的原始思路理解为什么要把系统动态和扰动合并观测。扩张状态观测器参数整定相关文献重点看带宽法在电机控制系统中的应用。无模型预测电流控制相关文献重点关注PMSM中基于超局部模型的离散实现以及与传统模型预测控制的对比。多矢量MPCC相关文献如果后续想降低电流纹波这部分内容可以直接扩展当前仿真。PMSM矢量控制与SVPWM实现细节用于对照整体控制架构和坐标变换的正确性。这些方向足够撑起一个毕业设计或者工程项目的技术底座。动手做之前先把基础原理过一遍再对照仿真边调边看效率会高很多。最后再分享一个小技巧我做这套仿真时习惯在电流内环模块里预留“参数偏差注入”开关比如一个增益模块放在电机模型的电感前面。有了这个开关每次调试想测鲁棒性拨一下就行不用反复改模型。这套方案后续往内置式PMSM扩展、或者加转矩角控制改动路径也清晰。先跑通这套基础仿真后面每一步都有据可依。