双闭环这三个字凡是碰过电机控制的人应该都不陌生。但奇怪的是我见过太多人——包括不少已经工作几年的工程师——在MATLAB里搭一个能跑的直流电机双闭环调速系统仿真时依然卡壳。要么模型刚搭完一点运行就报错要么电流波形直冲上万安培要么转速震荡得跟心电图一样还有的直接在对话框里看到一行刺眼的“发散”提示。这篇文章就把直流电机双闭环调速系统MATLAB仿真从建模、搭模型到调参、排错完整过一遍适合刚接触电机控制仿真的人也适合那些模型能跑但波形始终不对、想弄明白“到底哪儿出了问题”的人。1. 为什么双闭环会成为调速系统的标配1.1 单闭环调速的硬伤启动电流爆表先回忆一个物理常识直流电机启动瞬间转速为零反电动势也为零。这时候如果直接把电压加到额定值电枢电流就等于电压除以电枢电阻。电枢电阻一般很小比如额定220V、额定电流十几安的电机电枢电阻通常不到1Ω你想想启动瞬间电流会是什么量级几十倍额定电流都不奇怪。那有朋友会说了我在转速环上限制电压输出不就行了比如限幅到50%慢慢加上去。这个思路没错但问题是限制输出电压本质上是在限制“电流”可这个限制是盲目的、开环的。你根本不知道当前电流到底有多大、超没超过设备允许值更没法让电流始终贴着一个“安全上限”去跑。这就好比你开车上坡只知道油门踩到一半却不知道发动机转速和扭矩是多少全凭感觉来。所以工程上需要有一个专门的“电流环”用闭环控制去精确约束电流。这就是双闭环出现的最直接原因。1.2 双闭环的分工电流环管“快”转速环管“准”双闭环的结构是一个典型的串级控制转速环是外环它的输出是电流给定电流环是内环它的输出直接控制变流器/PWM。这俩环的分工非常明确电流环内环负责快速跟踪电流给定让电枢电流始终等于转速环要求的数值。启动瞬间转速环会输出一个限幅后的最大允许电流给电流环电流环就顶着这个电流跑让电机以最大允许转矩加速。转速环外环负责转速的稳态精度和动态响应它的输出本质上是“要多少电流才能达到目标转速”。转速没到给定它就加大电流转速超过了它就减小电流。这俩环嵌套起来效果就是启动时电流恒流限幅、转速近乎线性上升快速又安全稳态时转速无静差、电流等于负载电流。这个“恒流升速”的启动过程是双闭环系统最漂亮的动态特性也是后面调参时判断仿真波形对不对的核心依据。我习惯用一个比喻电流环像汽车的刹车和油门负责控制“动力释放的幅度”转速环像驾驶员负责判断“目标车速还差多少”。驾驶员给出油门深度刹车和油门系统负责精确执行不让发动机瞬间爆转。2. 从电机铭牌到仿真参数模型怎么建2.1 四组方程直流电机模型的物理内核很多人一上来就在Simulink里拖模块这没错但如果连电机模型的物理方程都不知道后面出了问题根本没法排查。直流电机动态模型一共四组方程电枢回路电压方程Ua La·dia/dt Ra·ia E其中E是反电动势E Ke·ω电磁转矩方程Te Kt·iaKt是转矩系数在SI单位制里Kt等于Ke机械运动方程J·dω/dt Te - TLJ是转动惯量TL是负载转矩忽略粘滞摩擦时转速与反电动势的关系E Ke·ω从控制框图角度看这四组方程可以组织成电枢电流ia (Ua - E) / (La·s Ra)转速ω (Te - TL) / (J·s)然后把E Ke·ω反馈回到电枢回路入口。这个结构就是Simulink里搭电机模块的蓝图。注意电枢回路和机械运动方程是通过反电动势耦合起来的这就是为什么不能把电机看成两个完全独立的传递函数而必须保留E反馈。2.2 用铭牌数据估算仿真参数几乎所有人都没有精确的电机参数但起码有铭牌。从铭牌就能估出能用的仿真参数。比如一台额定220V直流电机额定电流13.2A额定转速1500rpm。电枢电阻Ra可以用额定点的电压方程估算额定运行时反电动势约等于额定电压减去额定电流在电阻上的压降这个压降通常占额定电压的10%~30%。取中间偏上一点Ra≈0.8Ω是合理的。反电动势系数Ce (U_N - I_N·Ra) / n_N代入就是(220 - 13.2×0.8) / 1500 ≈ 0.14 V/rpm。换算成SI单位制Ke Ce×60/(2π) ≈ 1.34 V·s/rad转矩系数Kt取同样的数值。电枢电感La可以实测如果没有数据可以按经验公式估算La ≈ (10~20)mH这个量级对小功率直流电机基本够用。转动惯量J从电机手册或经验取值比如0.05 kg·m²。电磁时间常数Ta La/Ra ≈ 0.019s这个参数对电流环整定极其重要后面讲PI参数时会用到。2.3 变流器与反馈滤波两个最容易“随便填”的环节控制电压并不是直接加到电机上的中间要经过PWM变流器或者晶闸管整流器。这个功率环节在仿真里通常简化成一阶惯性环节1/(Tpwm·s1)。Tpwm跟开关频率有关如果PWM是10kHzTpwm取0.0001s左右。但工程上经常把电流反馈滤波时间常数也合并到这个等效小时间常数里一般取0.001s量级。这里的取值会影响内环带宽的上限。电流反馈和转速反馈在实际系统里都有滤波仿真里同样要在反馈通道上加一阶惯性环节。我见过不少人在Simulink里转速反馈直接从电机输出拉一根线就到比较器完全忽略了测速机的滤波延迟。这对整个系统的稳定性影响其实挺大特别是后面调转速环PI参数时反馈延迟会让系统更容易振荡。下面是一组完整的初始仿真参数后续调参都基于这组数据参数名称符号数值说明额定电压U_N220V铭牌数据额定电流I_N13.2A铭牌数据额定转速n_N1500rpm铭牌数据电枢电阻Ra0.8Ω估算电枢电感La15mH估算/实测转动惯量J0.05 kg·m²估算反电动势系数Ke1.34 V·s/rad由铭牌计算转矩系数Kt1.34 N·m/ASI单位下等于Ke电磁时间常数Ta0.019sLa/Ra变流器时间常数Tpwm0.001s与开关频率相关3. Simulink模型搭建分环节搭别一把梭3.1 电机本体先开环跑通Simulink里搭模型最忌讳的就是把所有环节一下全拖出来连上就点运行。我的做法是分环节搭每搭完一个环节就测试一个环节。第一步先搭电机本体按那四组方程用积分器、增益、加法器搭或者用传递函数块搭两种方式都行。基础模块搭的好处是物理意义直观传递函数搭的好处是简洁不容易出代数环。电机本体的输入是电枢电压Ua和负载转矩TL输出是转速ω和电枢电流ia。内部结构就是前面说的反电动势反馈结构电枢回路用1/(La·sRa)机械运动用1/(J·s)中间通过Ke和Kt衔接。搭完先开环测试一下给定一个50V的阶跃电压负载转矩给0看转速曲线是不是近似线性上升然后稳定在一个值电流是不是先冲高再回落到一个较小值。如果开环就不符合物理规律后面闭环也白搭。3.2 电流内环带上限幅器的PI电机本体跑通之后加电流内环。电流给定用一个Step信号比如5A电流反馈从电机电枢电流处引出做差后进PI控制器PI输出经过限幅作为变流器环节的输入再接电机电枢电压入口。PI控制器我用的是带限幅的输出结构比例和积分支路先相加然后经过一个饱和限幅模块再送给变流器。限幅在这里特别关键。电流环输出的控制电压限幅要对应实际PWM占空比的上下限。如果仿真里控制电压在0~10V之间限幅就设0和10或者对称就设±10。很多人忽略这个限幅结果PI输出在启动瞬间飙到几百伏电机电压也一路飙仿真自然离谱。另外PI控制器的积分器也需要考虑限幅问题不然积分饱和会让你看到奇怪的超调现象这个后面专门讲。电流环单独测试的标准是给一个阶跃电流给定电流反馈能快速跟踪、没有超调或超调很小、稳态无静差。这里先不追求完美只要电流能稳定跟踪就说明电流环工作了。3.3 转速外环闭环嵌套的注意事项电流环调通之后把Step信号从电流给定处断开改成由转速环PI的输出作为电流给定转速反馈从电机转速输出端引出和转速给定比如1500rpm的Step信号做差进入转速环PI。这里我要特别提醒一个极易犯的错误转速环PI的输出限幅必须设为电流允许的最大值比如1.5倍额定电流对应到我们的电机就是约20A。这个限幅值决定了启动时的恒流升速电流有多大如果设太小电机加速慢如果设太大电流环的“安全阀”就形同虚设。接好之后别急着给完整1500rpm阶跃先给个小的比如100rpm。看系统能不能稳定。能稳定再逐步加大给定值。这种闭环嵌套系统最怕的就是第一次直接怼大阶跃一旦发散你根本分不清是外环问题还是内环问题。3.4 连续仿真与离散仿真的选择双闭环仿真通常有两种做法一种是用连续时间PI控制器和被控对象一起做连续仿真这种方式简单适合验证控制结构另一种是用离散PI控制器采样周期跟真实的DSP/单片机控制周期一致比如10kHz采样T_s0.0001s这种方式更贴近工程实际因为真实的控制器一定是离散采样的。我个人的建议是如果你只是课程设计或者初学验证用连续仿真就够如果你是做项目预研或者要移植到实物上果断用离散PI控制器把采样时间设成目标控制器的控制周期。离散化的选择会直接影响PI参数的整定结果——同样的参数在连续和离散系统里的表现会有差异离散情况下采样时间越大相位滞后越大系统越容易振荡。从Simulink的Discrete库拖一个Discrete PI Controller2DOF把采样时间填进去比连续PI更直观地模拟数字控制。4. PI参数整定先内环后外环的工程惯例4.1 电流环整定断开转速环单独调整定双闭环PI参数永远遵循一个铁律先内环后外环。电流环是转速环的被控对象之一如果内环响应慢或者不稳定外环怎么调都是白费劲。所以先把转速环断开让电流环面对一个单独的阶跃给定用试凑法调电流环PI。具体操作先把积分系数Ki_i设为零只留比例系数Kp_i从很小的值开始加。给一个阶跃电流给定观察电流反馈波形。当Kp_i太小时电流响应慢像一条爬行的虫子逐渐加大Kp_i响应变快直到波形开始出现超调或者轻微振荡此时把Kp_i退回刚才那个值的60%~70%左右作为Kp_i的初值。然后加入Ki_i从大往小调其实是从小往大加看稳态误差消除情况和超调。一个很有用的判断标准是电流环的阶跃响应应该做到“快而不超”也就是上升时间尽量短但超调尽量控制在5%以内。因为电流环一旦超调过大在启动时会瞬时超过限幅值这对功率器件来说是致命的。对控制理论有基础的朋友也可以用零极点对消的思路快速估算初值选择PI的积分时间常数Ti等于电磁时间常数Ta约0.019s让PI的零点去对消电枢回路的大极点然后再用典型I型系统的整定方法去配Kp_i。设TΣ0.001s变流器等效小时间常熟按工程上电流环阻尼比0.707来算Kp_i大致估算出来后在附近微调即可。试凑法和估算公式结合效率会高很多。4.2 转速环整定把电流环当成“快子环”电流环调好后把转速环接上。此时电流环已经是一个响应很快的内环在转速环眼里它就像一个增益为1的快子环。转速环的整定还是一个套路先调Kp_n再调Ki_n。转速环试凑时的现象和电流环不一样它的被控对象带有积分特性转速由转矩积分而来所以更容易出现振荡。Kp_n从小往大加观察转速阶跃响应。Kp_n太小转速上升慢像一个行动迟缓的大象Kp_n大到一定程度转速开始剧烈振荡这时候退回60%作为初值。加入Ki_n之后重点看稳态误差能不能消除、超调会不会增加。这里要特别强调“小阶跃起步”的整定策略。接通转速环后给定先给额定转速的10%比如150rpm。系统能稳定之后再看额定1500rpm阶跃下的表现。很多资料直接给额定阶跃的调试波形但现实中这么做容易让系统饱和很难分辨是PI参数问题还是限幅问题。从小给定入手让系统工作在线性区调出的参数更有参考价值。4.3 会看波形启动过程的三个关键阶段调完之后给一个额定转速阶跃观察整个启动过程的波形。一个合格的双闭环启动波形有三个标志性阶段第一阶段电流快速上升到限幅值并保持住恒流升速转速近似直线上升。这个阶段说明转速环饱和输出最大电流给定电流环跟踪良好“安全阀”起作用了。如果启动时电流没顶到限幅说明转速环PI输出不够大或者限幅值设置得太小。第二阶段转速接近给定值转速环的PI输出退出饱和电流给定开始回落电流反馈跟着回落转速上升速度变缓。这个阶段是整个动态过程最微妙的部分电流的回落是否平缓直接反映出转速环PI参数是否合适。第三阶段稳态。转速等于给定无静差电流等于负载电流对应的稳态值。如果转速稳态有静差说明转速环积分作用不足如果稳态附近有等幅振荡说明Kp_n或者Ki_n偏大或者反馈滤波时间常数太大导致相位裕度不足。在Scope里同时观察转速给定、转速反馈、电流给定、电流反馈四个信号你就能像心电图医生一样一眼判断出系统的“健康状况”。我每次调试都把这四个信号放在一个Scope里哪个信号异常就优先排查哪个环节。5. 仿真发散、震荡、超调大的排查链路5.1 仿真发散的四个常见原因仿真发散是最让人头疼的问题辛辛苦苦搭的模型一运行就飘。根据我的经验发散原因通常集中在四个方面第一PI参数过大。比例系数太大或者积分时间常数太小都会让闭环系统失稳波形呈指数发散或者等幅震荡。这个排查最简单把PI参数调小试试就知道。第二反馈极性接反。负反馈变成正反馈系统必发散。这个错误在Simulink里极容易犯因为模块多了以后信号的加减号很容易点反。第三限幅缺失或限幅值设置不合理。电流环输出没有限幅PI输出一旦饱和控制电压可能达到数百伏甚至上千伏远超过电机的物理承受范围。第四仿真步长过大或求解器不合适。模型是刚性系统时用默认的ode45可能步长被压得很小甚至数值发散。这种情况需要更换求解器或者手动限制最大步长。5.2 排查的第一步先开环再拆环我的排查思路从来都是把系统拆回一环一环去测。双闭环是一个串级系统它的优势是可以“外科手术式”地隔离故障。具体排查链路如下第一步开环测试电机本体。给定一个固定电压看电枢电流和转速是否在物理合理范围内。如果开环就不对先别碰任何PI去检查电机模型本身。第二步断开转速环给电流环一个阶跃给定看电流环是否稳定。如果电流环发散问题范围缩小到电流环的PI参数、电流反馈极性、变流器模型这三个点上。第三步电流环稳定后接上转速环但给一个很小的转速给定。此时如果发散说明问题多半在转速环的PI参数或者转速反馈极性上。每一步都使用Scope观察多个中间信号比如转速环输出电流给定、电流环输出控制电压、电流反馈、转速反馈。这四个信号哪个先爆掉问题就在哪一段回路。这种“二分法”的排查思路能让你少走很多弯路。我见过太多人一发散就整个人懵了觉得哪都有问题其实就是没有把系统拆开去逐环隔离。5.3 一场真实的发散排查记录说个具体的例子。有次我给一台电机做仿真搭完模型一点运行电流波形直接飙到几万安接着Simulink报NaN错误。我打开Scope一看控制电压在启动瞬间已经冲到了几千伏——这显然是电流环输出限幅没生效。检查发现我在PI控制器后面接的饱和模块上下限设的是±0.1而不是±10等于几乎没有限幅。这是个低得不能再低的低级错误但恰恰是最常见的错误。另一次发散情况是开环正常、电流环正常接上转速环以后转速振荡发散。我把Scope切到转速环的输出看发现转速环输出电流给定在一瞬间跳变到几百安——原来转速反馈的信号极性取反了转速反馈变成了正反馈。把减法器的正负号倒过来系统立刻收敛。还有一次波形“看似稳定但总有高频抖动”排查了PI参数、限幅都没发现问题最后发现是求解器最大步长设得太大导致关键高速信号采样点太稀。把最大步长从默认值改到1e-4s波形立刻干净了。这个案例说明了有时候不是模型错是求解器配置问题。5.4 求解器与步长被忽略的“背锅侠”Simulink默认的变步长求解器是ode45适合大多数非刚性系统。但双闭环调速系统里电流环的响应很快电机机械系统的响应相对慢这个时间尺度上的巨大差异会让系统呈现一定的刚性特征。如果你发现仿真特别慢或者结果出现奇怪的振荡试着换成ode15s或ode23tb这类刚性求解器通常会有惊喜。另外变步长模式下最大步长Max step size默认是仿真时长的1/50这个值往往太大了。比如你的PWM变流器时间常数是0.001s而仿真总时长是2s的话默认最大步长是0.04s远大于系统最小时间常数。这种步长下电流环的动态完全无法正确表现。我习惯把最大步长设为系统最小时间常数的1/5左右比如1e-4s甚至更小。别担心仿真速度变慢双闭环模型的规模根本不大牺牲一点速度换来数值稳定性非常划算。如果使用的是定步长求解器步长最好取离散控制器采样周期的整数分之一比如采样周期是0.0001s定步长就设为1e-5s保证控制周期内积分点足够密。6. 从仿真到实物别忘了这些细节6.1 限幅必须和设备参数匹配仿真里限幅想设多少设多少但映射到实物时限幅值必须跟实际硬件参数严格对应。转速环输出的电流限幅不能超过逆变器或整流器的峰值电流能力也不能超过电机的过载能力。电流环输出的控制电压限幅对应PWM占空比0~100%或者DA输出范围。很多仿真工程师在仿真里把限幅设得“很合理”到了实物上一跑才发现限幅值对应的实际物理量完全对不上。最好的做法是在Simulink模型里就把各个环节的量纲统一比如控制电压直接用0~10V电流用A转速用rpm这样限幅值的物理意义一目了然。6.2 积分饱和的工程处理仿真和实物都会遇到积分饱和问题但实物上的后果更严重。一个典型的场景启动瞬间转速给定是1500rpm转速环PI拼命积分输出电流给定一路顶到限幅值转速到了1500rpm后PI输出需要降下来但因为积分器已经充满需要先把积累的“余电”放掉结果就是转速超调很大很久才回落。最简单的抗积分饱和方法是在PI控制器输出限幅后把“限幅后的值”和“限幅前的值”做差再反馈回积分器输入端back-calculation抗饱和结构。这样当输出被限幅时积分器会停止继续积分防止过度饱和。Simulink里自己搭这个结构很简单但很多人用的是内置PI模块这时可以给积分器单独加一个输出限幅或者用带抗饱和参数的离散PI模块。调试时观察电流给定信号如果它在限幅值上“趴住”很久不回落就要怀疑积分饱和了。6.3 采样延迟与滤波让仿真更接近实物实物的电流采样不是瞬时的ADC需要转换时间传感器有响应延迟反馈信号上还有不可避免的噪声。仿真模型如果完全忽略这些调出来的PI参数到了实物上大概率要重新调。一个折中的做法是在电流反馈和转速反馈通道上分别加一个小时间常数的惯性环节比如0.0005s模拟传感器的延迟在电流反馈信号上加一个白噪声源模拟采样噪声。这样调出来的PI参数数量级上更接近实物能用的范围。但也有一个坑反馈滤波加得越多相位滞后越大系统稳定裕度越小。很多人发现加了滤波之后原本稳定的系统开始振荡就是这个原因。这时候不要盲目降低PI参数可以先看看滤波时间常数是否选得过大。6.4 参数漂移为什么实物不能直接照搬仿真参数电机运行起来会发热电枢电阻随温度升高而增大电枢电感随饱和度变化而变化带负载后总转动惯量也会增大。这意味着你在仿真里精心调出来的PI参数到了实物上只具备“参考意义”不能盲目照搬。我的习惯是仿真阶段确认控制结构和参数的数量级实物调试时先把PI参数缩到仿真值的50%左右然后根据实际波形逐步加大每加一步观察一次响应直到满意为止。另外仿真里认为恒定的直流母线电压在实物上会有波动尤其是大负载突变时母线电压会瞬间跌落。这种情况下电流环的动态响应会受到显著影响。如果仿真想更真实可以把母线电压也建进模型里让它随负载电流变化。这一步对做伺服驱动器或电机控制器产品的人尤其重要。调完整个系统我习惯再做一次“突变负载”测试仿真跑稳态后在某个时刻给电机突加一个负载转矩观察转速跌落后的恢复曲线。一个设计良好的双闭环系统转速跌幅应该很小恢复时间应该很短电流能快速响应负载变化。如果这个测试过不了说明你前面的PI参数还需要继续打磨。这步测试在实物调试中是必做的在仿真里提前做一遍等于给自己打个预防针。