做电机控制这几年,直流电机双闭环调速系统是我在Simulink里反复折腾最多的对象之一。实验室的小功率直流电机、现场几十上百千瓦的传动装置,控制思路基本都是同一套骨架:电流内环保证快速响应和限流安全,转速外环保证稳态精度和调速范围。这套系统真正考验人的地方从来不是正常匀速运行时,而是负载突变、电源电压波动这些扰动出现时,转速还能不能抗得住、回得来。这篇文章我不打算复述教材,而是把基于Simulink从零搭建双闭环模型、PI参数整定、抗扰动仿真到参数优化的完整过程,以及实际操作里踩过的坑,原原本本整理出来,给正在做电机控制仿真或者准备做驱动系统设计的同学一个可直接参考的路线。
1. 双闭环调速系统整体设计与建模思路
1.1 为什么必须是“双闭环”
很多初学者会先尝试单转速闭环,结果一跑就发现问题:启动瞬间电流爆表,负载突变后转速恢复特别慢,甚至出现大幅度振荡。我当年第一次用纯速度反馈去控制直流电机模型,启动电流直接冲到额定值的七八倍,虽然转速最后稳住了,但这样的设计在真实系统里要么烧管子,要么触发保护,根本没法用。
双闭环的厉害之处在于把“限制”和“调节”拆开。转速外环只负责让实际转速跟随给定值,它输出的是电流给定信号;电流内环模型把电枢电流作为被控量,紧紧咬住这个给定值。这样有几个明显好处:
- 启动或堵转时,电流内环自动把电流限制在允许范围内,保护功率器件和电机。
- 负载扰动进来时,电流内环先快速应对,转速外环再精调,两者分工明确。
- 电源电压波动这类扰动,主要落在内环作用范围内,内环一两个采样周期就能把电流稳住,对外环影响很小。
用一个类比来理解:转速外环是“指挥官”,只负责看远方目标;电流内环是“前线部队”,负责踩着油门执行命令。如果前线部队没有自我约束,指挥官一喊“加速”,油门就可能踩到底。双闭环就是给前线加了一道“限速阀”,让执行过程又快又安全。
1.2 直流电机的数学模型与Simulink搭建
在Simulink里做仿真,首先得把直流电机用数学语言表达清楚。工程上最常用的他励直流电机模型由两个方程描述:
电枢回路电压方程:
Ua = Ra·ia + La·(dia/dt) + Ce·ω
运动方程:
J·(dω/dt) = Ct·ia − TL
其中Ua为电枢电压,Ra为电枢电阻,La为电枢电感,Ce为反电动势系数,Ct为转矩系数,J为转动惯量,TL为负载转矩。
对上面两个方程做拉普拉斯变换,可以得到两个关键传递函数。电枢电流对电压的响应:
Ia(s) / (Ua(s) − Ce·ω(s)) = 1 / (Ra·(1 + Ta·s))
其中电磁时间常数Ta = La / Ra。转速对电磁转矩的响应:
ω(s) / (Ct·ia(s) − TL(s)) = 1 / (J·s)
在Simulink里搭建时,我一般先用传递函数模块组一个信号流图模型:电压信号减去反电动势,进入一阶惯性环节得到电流;电流乘以转矩系数,减去负载转矩,经过积分环节得到转速;转速再乘以反电动势系数反馈回电压输入端。这套模型结构清晰,每个环节和物理公式一一对应,排查问题最方便。
如果做更深度的验证,可以改用Simscape Electrical里的直流电机物理模型,直接接电阻、电感、惯量等元件。物理模型的优点是更贴近真实器件,能模拟换向、损耗等细节,但建模复杂度高,仿真步长也受限制。我的经验是:参数优化阶段用传递函数模型,快;最终验证阶段用物理模型,稳。
1.3 模型参数准备与仿真步长设置
搭建模型前先把电机参数准备好,放到MATLAB工作区,Simulink模型里的参数直接引用变量名。这样后续做参数优化和批量仿真时,只需修改工作区变量,不用反复打开模型改参数。
我常用的一组典型直流电机参数如下:
| 参数 | 符号 | 数值 | 单位 |
|---|---|---|---|
| 额定电压 | Un | 220 | V |
| 额定电流 | In | 13.6 | A |
| 额定转速 | nN | 1500 | r/min |
| 电枢电阻 | Ra | 1.2 | Ω |
| 电枢电感 | La | 0.015 | H |
| 转动惯量 | J | 0.075 | kg·m² |
| 反电动势系数 | Ce | 1.26 | V·s/rad |
| 转矩系数 | Ct | 1.26 | N·m/A |
| 电磁时间常数 | Ta | 0.0125 | s |
| 机电时间常数 | Tm | 0.0567 | s |
这些参数算出来的电磁时间常数和机电时间常数,直接决定了电流环和转速环的带宽设计范围。如果这两个时间常数和实际偏差太大,后面整定出来的PI参数基本不能用。仿真步长方面,传递函数模型用连续变步长求解器就行,我习惯选ode45,相对误差设为1e-4。如果模型里带PWM开关或电力电子器件,那就要改走定步长路线,这个后面细说。
2. 核心环节:双闭环PI参数整定与抗扰动仿真
2.1 电流内环按“二阶最佳”整定
双闭环整定有一条铁律:先内环,后外环。内环带宽必须明显高于外环,不然内外环会互相打架——外环给一个指令,内环还没跟上,整个系统就会振荡。
电流内环的整定思路是这样的:忽略反电动势的扰动,把电枢回路看作一个一阶惯性环节,用PI调节器的零点去对消被控对象的极点。具体做法是令PI调节器的积分时间常数τi等于电磁时间常数Ta,这样电流环开环传函就变成一个纯积分加小惯性环节的组合,可以按典型I型系统设计。
按典型I型系统取阻尼比0.707(工程上常说的“二阶最佳”)来算,电流调节器Kp和Ki的计算关系为:
Kp = Ra·Ta·ωc
Ki = Kp / Ta
其中ωc由电流环期望的截止频率决定。以我上面的参数为例,Ta=0.0125s,Ra=1.2Ω,如果期望电流环截止频率在500 rad/s附近,那么Kp约等于7.5,Ki约等于600。
我在实际调试中不会直接用计算值。先给Kp取计算值的一半,Ki按比例缩,跑一次电流阶跃响应,观察电流波形有没有超调、有没有振铃,再逐步加I。电流环的阶跃响应应当做到快速且几乎没有超调,超调一旦超过10%,启动时电流冲击就很难看。
对于电流环的采样和PWM频率,这里多说一句:仿真阶段如果不加PWM环节,用连续模型就行。但真实工程中电流环输出给到PWM调制器,开关频率通常在10kHz以上,电流环带宽一般取开关频率的1/10到1/5,也就是1kHz到2kHz以下。仿真时如果加入PWM开关模型,别再指望ode45连续变步长能高效跑完,改成固定步长,步长取PWM周期的1/100左右,波形才干净。
2.2 转速外环按“典型II型”整定
转速外环要慢一些、稳一些。内环等效成一阶惯性环节后,外环的被控对象是“内环惯性 + 电机的积分环节”,这个结构适合按典型II型系统设计,工程上常取中频宽h=5。
中频宽h决定转速环的PI积分时间常数τn与内环等效小时间常数2TΣ的比值:
τn = h·2TΣ
开环增益按典型II型计算公式来取,转速环Kp和Ki的量级通常在零点几到几之间、几十到几百之间。以我的参数为例,内环等效小时间常数如果约2ms,那么τn大概取20ms,转速外环Kp大概在0.5~1.5,Ki大概在30~60这个范围。
转速外环调试时,我重点关注的是阶跃给定下的超调量,以及负载扰动下的转速跌落和恢复时间。有一个很常见的心理要克服:转速环响应调得太快,波形看似“很猛”,但实际上系统相位裕度已经很低了。我一般给转速环留足裕量,让它在负载突变时转速跌落不超过给定值的5%~8%,在0.5s内恢复,这就够用。追求极致响应速度只会让系统变得脆。
2.3 三种抗扰动仿真场景怎么搭
抗扰动仿真不能只跑一条平稳曲线就完事。我通常搭建三个典型场景,分别对应工程中最重要的扰动类型。
场景一:负载突变。这是最核心的场景。在电机负载输入端加一个Step信号,让负载转矩在系统稳定后突然从额定值跃升到1.5倍额定值。操作方法是把负载转矩从常量改成“常量 + Step”,Step的Step Time设在2s,Final Value设为0.5倍的额定转矩。跑完之后看两个指标:转速最大跌落多少,跌落后多长时间恢复。这是评价双闭环抗扰性能的黄金指标。
场景二:电源电压波动。在电枢电压输入端叠加一个扰动源,可以设成阶跃或者正弦。比如在2.5s时让主电源电压下降10%,持续0.5s再恢复。有电流内环的系统,这个扰动会被内环快速吸收,转速波动通常很小。如果发现转速波动依旧明显,说明电流环带宽不够,或者电流环PI参数被外环“拖累”了。
场景三:电机参数摄动。把Ra和J设置成工作区变量,在脚本里循环修改这两个参数,观察系统在电机温升导致电阻变化、负载惯量变化时的鲁棒性。这个场景不追求跑一次仿真,而是做批量扫参。工程上模型算出来的PI参数再理想,到了现场电机可能不是同一台,惯量可能完全不一样,抗参数摄动能力决定了这套参数能不能在实际环境中活下去。
跑完三种场景,把转速跌落量、恢复时间、稳态误差记录在案。下面所有优化工作的目标,就是把这三个数压下去。
3. 参数优化与仿真验证
3.1 为什么手动整定不够
理论整定算出来的PI参数是很好的起点,但远远不是终点。原因有三个:
- 模型中存在限幅、饱和、死区等非线性环节,典型I型/II型设计法基于线性系统理论,非线性一进来结论就得打折。
- 电流环和转速环之间存在动态耦合,分开设计时把对方当成理想环节,实际上内环的动态会通过反电动势回灌到外环。
- 工程上评价指标往往是多目标的:既要超调小,又要恢复快,还要抗参数摄动。手调很难同时满足,需要算法去搜索参数空间。
所以模型能跑之后,我做的第一件事不是继续手调波形,而是把“参数优化”提上日程。
3.2 三种可落地的优化手段
手段一:PID Tuner自动整定。在Simulink模型里双击PI控制器,打开后点Tune,Simulink会自动在工作点对模型做线性化,然后给出推荐参数。你可以拖动响应速度滑块,在“快速”和“鲁棒”之间权衡。这个方法最快,但要求PID控制器周围模型基本可线性化。模型里如果有饱和、死区等强非线性,PID Tuner的线性化结果可能不准,需要配合线性化点设置来使用。
手段二:Simulink Design Optimization的响应优化。这个工具适合做多目标优化。你可以把超调量、调节时间、抗扰动恢复时间等写成约束或目标函数,工具会自动调节PI参数,在满足约束的前提下找最优解。它的底层算法比手动扫参聪明得多,在参数维度较高时效果明显。不过这个工具的使用复杂度也高,需要定义设计要求、设计变量、优化目标,新手要多花点时间吃透。
手段三:MATLAB脚本批量仿真寻优。这是我最常用的一招,透明、可控、逻辑一目了然。把PI参数设为工作区变量,用sim()函数循环跑模型,再计算目标函数值,遍历参数网格或者随机搜索最优参数。下面是一个简单示例:
% 批量仿真寻优:固定内环参数,扫描外环Kp和Ki % 模型名:dc_motor_dual_loop % 输出:仿真时间和转速误差 Kp_i = 7.5; Ki_i = 600; % 内环沿用整定值 results = []; for kp_n = 0.3:0.1:2.0 for ki_n = 10:10:100 Kp_n = kp_n; Ki_n = ki_n; sim('dc_motor_dual_loop'); % 计算ITAE指标:时间乘以绝对误差的积分 ITAE = trapz(tout, tout .* abs(n_ref - n_actual)); results = [results; kp_n, ki_n, ITAE]; end end % 找出ITAE最小的一组参数 [min_val, idx] = min(results(:, 3)); best_params = results(idx, :);这个脚本的运行逻辑是:内环参数先固定,外环Kp、Ki在设定范围内遍历,每次调参后完整跑一遍仿真,用ITAE作为目标函数。ITAE对长期误差和后期振荡都有惩罚,实际使用中选出来参数的综合表现通常比手调好很多。
如果想把内环参数也纳入寻优,也不是不行,但参数维度从2维变成4维,遍历效率骤降。我的做法是分两步走:先用理论整定把内环确定下来,扫外环;外环找到较优解后,再把内环Kp、Ki放到一个小区间里扫描,整体精调。
3.3 优化前后的仿真对比分析
参数优化不是跑出一个好看的ITAE值就完事了,必须回到抗扰动场景里重新做验证。我习惯做一张对比表,把同一套扰动场景下优化前后的关键指标列出来:
| 评价指标 | 手动整定 | ITAE优化后 | 改善幅度 |
|---|---|---|---|
| 转速阶跃超调量 | 12.5% | 4.8% | 明显改善 |
| 调节时间(2%误差带) | 0.42s | 0.28s | 更快 |
| 负载突变转速跌落 | 9.6% | 6.1% | 明显改善 |
| 负载突变恢复时间 | 0.50s | 0.32s | 明显改善 |
| 稳态误差 | 0.1% | 0.05% | 略微改善 |
这里要说明一点:如果没有特别苛刻的要求,5%左右的超调、6%左右的转速跌落、0.3s左右的恢复时间,在大多数工业传动场合已经是拿得出手的水平。优化算法真正帮你做的事情,是在“快速”和“稳定”之间找到一个更合理的平衡点,而不是把所有指标都压到极限。指标满不满意的判断标准,始终来自实际应用需求,而不是仿真曲线本身有多漂亮。
4. 实操中踩过的坑与排查技巧
4.1 代数环问题
用Simulink搭双闭环模型时,最容易遇到的就是Algebraic Loop(代数环)报错。现象是仿真开始时报“Algebraic loop detected”,模型能跑但速度极慢,或者结果明显不对。
代数环的出现原因是转速误差经过PI控制器、电流环、电机模型,又反馈回求和点,整个回路里缺少一个真正的时间延迟环节,形成瞬时依赖。解决办法是在反馈通道上加一个Memory模块或Unit Delay,人为引入一拍延迟。加延迟之后PI参数要稍微回调一点,否则容易多出振荡。更工程化的做法是直接在电流环和转速环的采样通道里加入采样保持逻辑,模拟离散化控制器的行为,这样代数环天然消失,模型也更接近真实嵌入式控制算法。
4.2 仿真步长与数值积分问题
双闭环模型跑出来的波形如果出现莫名其妙的高频振荡,第一反应别怀疑PI参数,先看看仿真步长和求解器配置。连续模型用变步长求解器时,步长过大可能会忽略快速动态,导致仿真波形出现假振荡。我遇到过一种情况:同一套PI参数,用变步长跑出来波形平滑,换到固定步长却振荡不止——最后发现是步长与模型中最快时间常数不匹配。
一个实用经验:模型里包含开关元件或PWM调制时,仿真步长一定要和开关频率对齐。比如PWM频率10kHz,周期0.1ms,步长至少取0.001ms到0.002ms,才能还原出占空比调节的效果。纯传递函数模型没有开关动作,用变步长就能跑得很好,不必无脑上定步长拖慢速度。
4.3 限幅饱和与积分饱和
双闭环系统里PI控制器输出必须限幅。电流环输出限幅是对应PWM占空比的0~100%,转速环输出限幅是对应最大允许电流。限幅加上之后,有个几乎必踩的坑就是积分饱和。现象是:给定突变,输出已经顶到限幅值了,积分还在继续累积,等误差反向时,控制器要花很久才能从“饱和态”退出来,直观表现就是系统超调变大、响应迟钝。
处理积分饱和有两个常用方案。第一种是条件积分法:检测到输出饱和且误差方向与饱和方向一致时,冻结积分。第二种是反馈抗饱和(Back-calculation):把限幅前后的差值乘以一个增益,反馈回积分输入端,当输出进入饱和时自动衰减积分量。在Simulink里,这两种逻辑都建议用S-Function或Subsystem封装成独立的“抗饱和PI”模块,方便在电流环和转速环里复用。关于S-Function,我自己习惯把这类频繁用的控制逻辑整理到自建库中,之后任何模型引用起来都方便,这就是常说的S-Function自建库思路。
4.4 常见问题速查表
| 问题现象 | 可能原因 | 解决方案 |
|---|---|---|
| 仿真报Algebraic Loop错误 | 反馈回路缺少延迟环节 | 反馈通道加Memory/Unit Delay,或改离散控制器 |
| 转速波形高频振荡 | 仿真步长过大、求解器不合适 | 换定步长,步长与最快时间常数/PWM频率对齐 |
| 启动电流超出限幅值 | 电流环带宽过高、给定值阶跃太大 | 降低电流环Kp,给转速环输出加斜坡限幅 |
| 负载突变后转速恢复慢 | 转速环Ki偏小、Kp偏大 | 按ITAE寻优重新整定外环参数 |
| 输出饱和后退不回来 | 积分饱和 | 增加抗积分饱和逻辑,冻结或衰减积分项 |
| 同一个模型别人跑正常,我跑结果不对 | 工作区参数变量未正确加载 | 检查模型里引用的变量名与.m文件是否一致 |
4.5 一个小技巧:从仿真平滑过渡到实物
模型在Simulink里跑通、参数优化做完,并不代表项目结束。如果你后续打算把控制算法部署到MCU或嵌入式平台上,建议从建模之初就保留一个习惯:让PI控制器和PWM输出都走离散化模块,设置好采样时间,这样仿真模型里的算法结构可以直接对应实际C代码逻辑。用Simulink的C代码生成功能把转速环和电流环的控制器生成嵌入式代码,实测下来算法行为与仿真结果差异通常很小,因为双闭环的核心逻辑就是离散PI加限幅,嵌入式实现并不复杂。
我个人在实际操作中的体会是,双闭环调速系统的Simulink仿真,难点从来不在搭模型本身,而在于怎么把“书本上的整定公式”转化成“能扛住真实扰动的参数”。理论给出起点,仿真暴露问题,优化逼近极限,这就是整个项目最核心的三板斧。这套方法不只是直流电机能用,内环电流控制加外环速度或位置控制的架构,放在永磁同步电机、无刷直流电机上思路同样成立。先把一个系统彻底打通,后面迁移到任何“双环”结构,你都会觉得似曾相识。