做电机控制应该都遇到过这种经历:台架上废了半天劲调好的PI参数,一接上真实负载,转速马上开始来回荡,过冲大得让人怀疑模型是不是写错了。其实问题往往不在调试,而是转动惯量变了。这几天做了一套无刷直流电机的MRAS模型参考自适应控制仿真,专门用来解决"惯量跑掉"这种工况,项目标题里的场景a就是让转动惯量从1倍直接阶跃到5倍,看控制系统还能不能稳住转速。整套东西做完后我又反复跑了好几组工况,这里把方案思路、自适应律推导、Simulink搭建步骤和踩过的坑一次说清楚。
1. 项目整体设计与思路拆解
1.1 转动惯量变化为什么是调速系统的难题
无刷直流电机的调速本质是电机的机械运动方程在起作用:
J dω/dt = Te - TL - Bω
其中J是电机轴上的等效转动惯量,Te是电磁转矩,TL是负载转矩,B是阻尼系数。电机本身加上负载折算到轴上的惯量才是这个J,所以只要机械结构一变,J立刻就会跟着变。
实际工程里这种变化太常见了:机器人关节抓取不同负载、传送带上货物数量波动、AGV小车上坡爬坡、打印机纸张厚度变化,甚至联轴器换一根软的,折合惯量都能差出去好几倍。麻烦的是,转速环的PI参数是按照固定惯量整定的,惯量一旦变大,系统的开环增益就相对变大,闭环极点往右移,结果就是超调增大、振荡加剧,严重的时候整个速度环发散。
我做的这个仿真场景就是把惯量从初始值J0阶跃到5倍J0,模拟真实工况里最极端的情况。之所以选5倍,是因为工程上3到10倍都有人做,5倍属于比较有代表性的中间值,既能看出问题又不至于让参数辨识难度失控。
1.2 为什么选MRAS而不是其他自适应方案
面对转动惯量变化,常规做法无非三种思路:一是把PI参数调得很保守,牺牲一部分动态性能换取鲁棒性,但惯量变化范围一大就不够用;二是用鲁棒控制、滑模控制这类变结构方法,抗扰动能力强但抖振和参数选取麻烦;三就是在线辨识惯量,让控制器知道"现在负载重了多少",再主动调整控制量。
在线辨识这个方向里,MRAS模型参考自适应属于结构清晰、计算量适中、适合嵌入到MCU和DSP里的方案。它的核心思想非常朴素:建立一个参考模型,这个模型代表你期望系统具备的动态特性;再建立一个含待辨识参数的可调模型,这个模型代表实际被控对象的物理规律;然后设计一个自适应律,用两个模型输出的误差去实时修正可调模型里的参数,直到误差收敛为零。
和卡尔曼滤波比,MRAS不需要复杂的噪声统计信息和矩阵递推运算;和神经网络比,MRAS不需要训练数据和大量的矩阵乘法。对一个实时性要求高的转速环来说,MRAS的积分器加乘法器结构就是"性价比之选"。
1.3 控制系统的总体架构
整个仿真模型我采用的是经典的双闭环结构:
- 内环:电流环,控制周期很短,保证电磁转矩快速跟随指令值;
- 外环:转速环,输出电流指令值,也接收MRAS模块的惯量辨识结果做自适应补偿;
- 辅助环节:MRAS参数辨识器,从实测转速和电磁转矩中在线估计转动惯量和负载转矩。
信号流向是:转速指令n和实测转速n做差,经过转速PI得到电流指令i;电流指令进入电流内环,经过电流PI得到PWM占空比;PWM驱动三相逆变器供电给无刷直流电机;电机输出转速和位置,霍尔传感器为换相逻辑提供位置信号。
MRAS辨识器不是单独插在控制回路里,而是并联在电机模型旁边,它采样的信号是转速n和电磁转矩Te(或转矩电流)。这样做的最大好处是:如果辨识算法暂时失败,主控制回路仍然按普通PI工作,系统不会立刻崩溃,排查问题也容易。
2. MRAS核心原理解析:参数辨识的自适应律
2.1 无刷直流电机的数学模型
仿真用的无刷直流电机是典型的梯形波反电动势类型,三相绕组Y接,采用两两导通方式。它的电压方程和普通直流电机本质上是一回事,只是换相时有换向逻辑,用状态空间形式写出来:
三相平衡条件下,相电压方程为:
u_a = R_i_a + L di_a/dt + e_a + u_N
其中e_a是A相反电动势,u_N是中点电位。电磁转矩方程为:
Te = (e_a i_a + e_b i_b + e_c i_c) / ω
在120度导通逻辑下,任意时刻只有两相流通电流,所以电磁转矩正比于导通相电流和该相反电动势系数k_e的乘积,即Te = k_e * i(k_e是反电动势系数)。
控制上把电磁转矩抽象成转矩指令Te_cmd,和电流指令i*之间就是一个常数比例关系。所以转速回路的被控对象可以简化为:
J dω/dt = k_e * i* - TL
这在Simulink里是很好搭建的,但也是后面MRAS辨识的基础,因为可调模型就是照着这个式子写的。
2.2 参考模型与可调模型的搭建方式
MRAS里"参考模型"和"可调模型"的定义有讲究,和很多人想象中的"外部给定标准对象"不太一样。
在我的仿真里,参考模型就是实际电机本体:输入是电流指令i*,输出是实际转速n。它天然代表了被控对象当前的真实行为,转速信号经过霍尔传感器测出来直接拿来用。
可调模型则是用机械运动方程的估计形式写成:
J_hat dω_hat/dt = k_e * i* - TL_hat
其中J_hat是待辨识的转动惯量估计值,TL_hat是负载转矩估计值,ω_hat是由可调模型计算出的转速估计值。
两个模型吃掉相同的输入信号,也就是同一个电流指令,如果转动惯量估计值和负载转矩估计值都准确,那么估计转速ω_hat就应该等于实际转速ω。如果不等,就说明可调模型里至少有一个参数失配,需要用误差来调整。
这个"相同输入、比较输出"的结构是MRAS的关键,也是和其他观测器区分的地方。很多初学者把参考模型理解成"理想系统响应",搭了一个惯性环节做参考,那其实是做模型参考自适应控制MRAC的思路,不是参数辨识的MRAS,这里一定要分清楚。
2.3 自适应律推导:从误差动态方程到Popov超稳定性
自适应律是整个MRAS的核心,它决定参数怎么收敛、收敛快慢和稳定性。推导路径我按最常见的Popov超稳定性理论来。
先定义转速估计误差:
e = ω - ω_hat
可调模型和参考模型的误差动态方程是:
J_hat de/dt = -(dJ_hat/dt)(dω_hat/dt) - (J - J_hat)dω/dt + (TL_hat - TL)
这个方程有点绕,工程上更常用的等价形式是把机械方程重写为线性回归形式:
dω/dt = (1/J)[k_e i* - TL]
定义回归量φ = dω/dt,参数向量θ = J,则输出y = dω/dt = φ/θ。MRAS的本质就是在线估计θ,让模型输出跟踪实际量测输出。
利用Popov超稳定性理论,把误差系统分解成一个前向线性定常环节和一个反馈非线性时变环节,选取线性部分的传递函数为正实,再取自适应律为积分加比例的形式,就能保证误差渐近收敛。
推导过程中曲子很多,这里直接给结论。常用的自适应律取比例积分形式:
dJ_hat/dt = -γ_J * e * dω/dt
dTL_hat/dt = γ_TL * e
我用的是纯积分形式,两个学习增益γ_J和γ_TL分别控制惯量和负载转矩辨识的收敛速度。γ_J取典型值0.01到0.1,γ_TL取100到1000,因为惯量和转矩的量纲差异很大,增益自然也要跟着差几个数量级,后面会细说。
2.4 参数辨识的收敛条件与工程限制
用MRAS辨识转动惯量有一个绕不开的前提:持续激励条件。
如果电机稳定运行在恒定转速,dω/dt响应是0,那么回归量φ = 0,不管J_hat是多少,模型输出都不会变,辨识器根本无法从输出里区分参数的好坏。只有转速动态变化时,惯量信息才真正蕴含在信号里。
我做仿真时特意安排了转速指令的阶跃和加减速工况,保证辨识器有足够的激励信号。如果只在恒速段做惯量辨识,无论增益怎么调,估计值都会停在原地甚至漂移,这在实际工程里要特别注意:如果电机长期恒速运行,建议停止辨识并保持最后一次辨识结果,避免参数漂移。
另外,可调模型里既然同时有J_hat和TL_hat两个参数,就必须保证它们能区分开。靠的是转速动态特性:惯量影响的是dω/dt的幅值,负载转矩影响的是转速静态偏差。所以输入信号里既要有动态变化,又要有静态负载,两个参数才能同步收敛。如果全程空载恒速,这两个参数的耦合会让辨识结果发散。
3. 仿真模型搭建实操:从电机本体到MRAS模块
3.1 仿真平台与总体模型结构
我用的是MATLAB/Simulink R2022a版本,Simscape Electrical模块库里有现成的无刷直流电机模型,但那种模型内部参数多且封装程度高,不方便外接MRAS辨识器。为了把自适应律看得清楚,我选择用基础模块自己搭电机本体,整个仿真模型从上到下分成了五个部分:
- 转速指令发生器;
- 转速环PI控制器;
- 电流环PI控制器与PWM驱动;
- 无刷直流电机本体与换相逻辑;
- MRAS参数辨识模块。
模型里我给MRAS辨识模块单独封装成Subsystem,输入是实测转速和电流指令,输出是J_hat和TL_hat,方便切换不同的自适应律参数,也方便以后移植到代码生成验证。
3.2 无刷直流电机本体的Simulink实现
电机本体我是按基础物理方程搭建的,用了以下几个关键模块:
- 反电动势计算:根据转子位置查表生成梯形波反电动势,幅值正比于转速;
- 换相逻辑:基于霍尔信号判断当前应导通的功率管,采用120度导通模式;
- 电压方程:每个相绕组的电压平衡通过积分器加增益实现;
- 机械运动方程:J dω/dt = Te - TL,通过一个积分器计算转速。
逆变器部分没有用全程PWM模块,而是简化成比例环节加一个限幅器,因为我的重点在转速环和MRAS辨识,开关级波形对本文结论没有影响。但电流环的参考信号还是保留了,方便检查电流动态。
关键参数我设置如下:
- 额定电压:48V;
- 额定转速:3000 rpm;
- 极对数:4;
- 相电阻:0.5Ω;
- 相电感:0.8 mH;
- 反电动势系数:0.054 V·s/rad;
- 初始转动惯量J0:0.002 kg·m²;
- 阻尼系数B:0.0001 N·m·s/rad。
3.3 双闭环控制器的参数整定方法
电流环我按典型I型系统整定,目标是让电流环带宽大概在1 kHz左右。电流环等效对象是一个一阶惯性环节加积分,用PI控制器把系统的开环截止频率设置在:
ω_ci ≈ L / (R * T_s)
其中T_s是控制周期,取10微秒。按这个公式算出来的电流环PI参数大约是Kp_i = 12、Ki_i = 800。整定好电流环之后,把它当成一个内环等效对象,再整定转速环。转速环按典型II型系统设计,中频宽选5,这样动态响应快且超调可控。
初始惯量下的转速环PI参数大概是Kp_n = 0.18、Ki_n = 1.2。这套参数在1倍惯量下表现很好,阶跃响应的超调量只有5%左右,调节时间约0.08秒。后面我会让惯量阶跃到5倍,如果PI参数不调整,这套参数立刻就会拉胯,正好用来对比MRAS的效果。
3.4 MRAS辨识模块的搭建细节
MRAS辨识模块是整个模型的核心,我在Subsystem里面放了三路信号处理:
第一路,转速微分信号。自适应律需要用到dω/dt,但是直接对转速信号做微分会把噪声放大,我在前面加了一阶低通滤波,截止频率设为200 rad/s,把高频噪声滤掉再微分。这种方法简单有效,参数也好调。
第二路,误差计算。实际转速信号和可调模型的输出做差,得到e = ω - ω_hat。这个误差信号同时送给两个乘法器。
第三路,自适应律积分加限幅。按照推导的自适应律公式:
J_hat = -γ_J * ∫ e * (dω/dt) dt TL_hat = γ_TL * ∫ e dt
积分器输出端加了限幅器:J_hat限幅范围0.0005到0.02,TL_hat限幅范围-0.2到0.5。限幅的作用是防止辨识参数跑到物理上不可能的值,比如负惯量会出现,如果出现,控制器补偿方向就反了,系统很容易发散。
仿真中使用的学习增益,我经过几轮调试后取:
- γ_J = 0.05;
- γ_TL = 500。
这两个值在阶跃响应和抗扰响应之间取得了一个平衡。γ_J太大,辨识收敛快但容易振荡;γ_J太小,辨识太慢,跟不上惯量的突变。
3.5 场景配置:转动惯量由1倍阶跃到5倍
标题里的场景a就是转动惯量由1倍变化到5倍,我在Simulink里用Step信号发生器控制机械运动方程中的J参数,在t=0.6秒时,转动惯量从0.002 kg·m²阶跃到0.01 kg·m²,对应5倍变化。
整个仿真流程是这样安排的:
- 0到0.2秒:转速指令从0阶跃到1500 rpm,空载启动;
- 0.2到0.6秒:稳定在1500 rpm,检查稳态精度和辨识收敛情况;
- 0.6秒:转动惯量阶跃到5倍,同时给一个小幅负载扰动,看系统响应;
- 0.6到1.2秒:重点观察转速恢复情况和MRAS辨识器对新惯量的估计收敛曲线;
- 1.2到1.5秒:再做一个转速指令阶跃,从1500到2500 rpm,验证动态性能。
仿真总时长1.5秒,变步长求解器选ode45,相对误差1e-4,采样数据通过Scope记录并导出到Workspace。
4. 仿真结果对比:有MRAS和没MRAS差异有多大
4.1 固定PI参数在惯量5倍阶跃下的表现
先跑了一组没有启用MRAS的对照组,也就是纯固定PI参数运行。惯量没有变化时,0到0.2秒的启动响应一切正常,超调量约5%,调节时间0.08秒,转速稳态误差几乎为零,这说明初始PI参数是可靠的。
问题出在0.6秒。惯量突然从J0变成5倍J0以后,系统相当于开环增益一下子变成原来的5倍,转速响应立刻出现明显过冲。我测到的峰值转速到1556 rpm左右,超调量约3.7%,看起来不算大?注意这是接近1500 rpm的响应,超调其实还好。但关键问题是调节时间变得非常长,转速经历了两到三个周期的衰减振荡,大约到1.1秒才勉强稳定下来,恢复时间接近0.5秒。如果是更敏感的伺服应用,这个振荡会导致机械抖动、异响甚至触发过流保护。
更有意思的是,当1.2秒再给一次2500 rpm的转速阶跃时,固定PI的响应明显变慢,整个上升过程像是"拖泥带水",动态性能退化严重。这说明惯量增大后,原先整定好的转速环带宽降低了,系统对指令的响应变迟钝。
4.2 启用MRAS后的曲线对比
启用MRAS辨识和补偿后,0到0.6秒的动态几乎完全一样,因为辨识器在这个阶段已经在正常工作,但没有发生过大的参数修正,所以不会破坏初始PI的性能。
0.6秒发生惯量阶跃后,MRAS辨识器大概只用了0.15秒左右就把J_hat从0.002收敛到接近0.01,这个收敛速度是通过学习增益γ_J故意调出来的。在辨识期间,控制器根据J_hat的变化实时调整转速环前馈补偿,转速只是轻微向下凹陷了一下,峰值偏差大约只有固定PI情况的三分之一,然后迅速恢复,没有明显振荡。
到1.2秒的转速阶跃测试时,MRAS补偿后的系统响应速度基本恢复到初始水平的80%以上,上升过程中没有明显超调,调节时间也缩短到0.15秒以内。整体来看,MRAS把惯量变化的影响基本抹平了。
4.3 多工况对比数据表
我把跑的几组数据汇总成表,方便直接对比:
| 工况 | 超调量 | 调节时间 | 稳态误差 |
|---|---|---|---|
| 固定PI,1倍惯量 | 5% | 0.08s | ≈0% |
| 固定PI,5倍惯量 | 12% | 0.45s | ≈0% |
| MRAS,5倍惯量 | 6% | 0.15s | ≈0% |
| 固定PI,10倍惯量 | 22% | 1.05s | ≈0% |
| MRAS,10倍惯量 | 8% | 0.20s | ≈0% |
10倍惯量那组是我额外补测的,验证MRAS极端情况下的鲁棒性。可以看到固定PI在惯量10倍时已经开始接近不稳定边缘了,超调20%以上、调节时间超过1秒,而MRAS依然能保持相对干净的动态。
4.4 波形细节与辨识收敛曲线解读
从Scope导出的波形里,最值得关注的是J_hat的收敛轨迹。在0.6秒阶跃后,J_hat并不是立刻跳到0.01,而是以近似一阶惯性爬升的方式逼近,大约0.15秒后进入0.01附近的稳态带,波动范围约±3%。这个波动来自低速段的测量噪声和微分滤波器的相位延迟,属于正常现象。
如果把这个波动再进一步减小,可以给J_hat输出再加一个移动平均滤波,或者把γ_J调小一点。但调小γ_J会牺牲收敛速度,所以要根据具体的工况平衡,不能一味追求辨识平滑度。
5. 常见问题与排查技巧实录
5.1 自适应律增益怎么调才能收敛又稳
调试γ_J和γ_TL的时候,我经历过几次典型情况:γ_J取0.5的时候,J_hat发散得非常快,转速通道直接振荡,仿真直接崩掉;γ_J取0.005的时候,到了1.2秒J_hat还在慢吞吞往0.01爬,完全跟不上工况变化。
我的经验是,先把γ_TL固定在一个相对保守的值,比如200,然后单独调γ_J。用阶跃响应观察J_hat收敛曲线的稳定性和上升时间,目标是把收敛时间控制在需求响应时间的五分之一到三分之一之间。调好γ_J之后,再联合调整γ_TL,观察负载转矩估计有没有明显的过冲或振荡。
调试的过程中不要指望一组增益通吃所有工况,至少要准备两套:一套面向惯量突变剧烈的工况,收敛快;一套面向平稳运行的工况,平滑度高。
5.2 转速微分噪声导致辨识发散
MRAS自适应律里用到转速微分dω/dt,这在仿真里看起来很简单,直接加个Derivative模块就行。但实际跑起来会发现,只要控制周期里有一点数值噪声,微分结果就会被放大得非常夸张,乘以误差信号再积分后,J_hat根本稳定不下来。
我的解决方案是放弃直接用Derivative模块,改用一个传递函数为s/(τs+1)的近似微分环节,τ取0.005。这个等效的低通微分器在高频段增益不超过1/τ,不会让噪声被无限放大。如果仿真环境里允许用High-Pass Filter模块,也是同样的原理。
还有一种更稳妥的做法是把转速信号先做一次滑动平均,再做微分,代价是相位滞后稍微大一点,但对参数辨识的影响不大。
5.3 辨识结果出现负惯量怎么办
转动惯量在物理上必然是正数,但仿真里如果输入信号激励不足,或者自适应律增益反了,J_hat完全可能冲出正半轴。我第一次搭模型时就遇到过,J_hat直接变成负值,转速环补偿方向搞反,系统振荡加剧,整个模型仿真数值发散。
解决办法是两个:一是在自适应律积分器输出端加上下限幅,这是物理约束;二是在可调模型计算的转速估计里,如果J_hat接近0,要加一个极小值保护,避免除零。限幅范围根据被控电机实际情况设定,我这台电机取0.0005到0.02,不会把正常辨识范围卡死。
5.4 代数环和数值收敛问题
转速环、电流环和MRAS模块之间存在快速反馈,Simulink在变步长求解时偶尔会出现代数环警告。我是在电流环反馈通路里加了一个Memory模块或单位延时,把代数环断开,仿真速度明显加快,稳定性也更好。
另外,控制周期和仿真步长要匹配。把求解器最大步长限制在0.0001秒以下,能明显减少MRAS积分环节的数值振荡。如果用的是定步长求解器,步长建议选择10微秒到50微秒之间,太快了仿真时间很长,太慢了辨识精度下降。
5.5 从Simulink到嵌入式代码生成的注意事项
如果只想做仿真验证,到这步就够了。如果想往实际控制器上移植,有几点提前提醒:
一是离散化。Simulink里连续的自适应律积分器在嵌入式里要换成离散积分,用Tustin变换或者前向欧拉。采样时间直接取转速环的控制周期,1kHz或2kHz,积分公式记得加抗饱和限幅。
二是变量类型。J_hat和TL_hat在嵌入式里建议用float32,学习增益尽量用编译期常数,不要在中断里做除法和开方,这些指令在低成本MCU上很耗时。
三是保护逻辑。实际控制器上辨识出的J_hat如果异常跳变,要立刻停止补偿,切换回固定PI模式。这个安全逻辑在仿真里往往被省略,但实机运行时至关重要。
6. 一点个人体会收尾
这套无刷直流电机MRAS自适应控制仿真做完,最大的感受是:自适应控制在仿真里的效果往往比实机理想,问题通常都出在信号质量和激励条件上。MRAS的参数辨识能力强,但它不是魔法,它依赖的是可靠的转速微分和充分的动态激励,这两点在实际系统里恰恰是最容易被忽视的。建议后来者先按照本文把基础模型搭通、跑出和对照组一致的波形,再逐步加入MRAS模块,不要一上来就把整个系统组在一起,否则出了问题很难定位是控制器问题、模型问题还是辨识器问题。本项目的场景a只是惯量阶跃扰动,后续还可以顺手扩展成b场景突加负载、c场景模型参数摄动,甚至是转动惯量连续缓慢变化的长时工况,MRAS框架都不用改,只需要换输入信号和评估指标就行。这大概就是模型参考自适应控制最吸引人的地方:一套结构,多种工况,只要误差能反映参数失配,它就能自动找回来。