最开始接触直流电机双闭环控制,我是被一个很现实的问题逼出来的:给一个小型直流电机做转速控制时,单环调速怎么调都别扭——启动电流忽大忽小,转速还没稳住,电流已经冲到额定好几倍,换一组负载参数后又得重新调一遍。后来我在 Simulink 里把完整的直流电机双闭环控制系统搭起来,反复做了几十次仿真,才真正理解电流环和转速环的分工逻辑,也把工程上那套“先内环后外环”的整定方法理顺了。这篇文章就把整个探索过程写清楚:从电机模型、Simulink 建模、逐环调参到波形解读,最后提几个我在仿真里踩过的坑。适合正在做电机控制课设、入门伺服驱动,或者想系统理解串级控制的人参考。
1. 双闭环到底比单闭环强在哪
1.1 单闭环调速的结构性缺陷
先复盘一下单闭环的问题。传统转速单闭环是把转速反馈丢给一个 PI 调节器,PI 直接输出电压给电枢。表面上这种结构很简单,但电枢回路里有一个绕不开的动态环节——电感。电感决定了电流不能突变,所以从“改变电压”到“改变电流”再到“改变转速”,是一条很长的信息链。转速 PI 为了同时兼顾稳态精度和启动冲击,往往只能把比例增益压得很低,结果就是动态响应慢。
更麻烦的是反电动势。转速一旦起来,反电动势就作为一个扰动源出现在电枢回路里,它会反向抵消外加电压。单闭环系统中,反电动势扰动要等到“转速先变化 → 转速偏差变化 → PI 再调整”这一整个回路走完才能被修正,天然就慢了半拍。负载突变时也一样,电流无法快速跟上转矩需求,转速先狠狠跌一下,PI 才开始动作。
那个阶段我做了不少试验:加大 Kp 就能让启动电流冲到离谱,减小 Kp 又让转速恢复慢。当时我还没想明白,问题根本不在参数,而在控制结构——同一个调节器同时承担“快”和“稳”两件事,它照顾不过来。
1.2 电流环与转速环的分工逻辑
双闭环控制的思路是把电枢电流单独拿出来,做成一个内环。这样系统就变成了两层结构:
- 外环是转速环,它接收转速给定和转速反馈,输出一个“电流给定信号”;
- 内环是电流环,它接收转速环给出的电流给定,再对比实际电流,输出电枢电压。
换句话说,转速环只回答一个问题:“现在我需要多大转矩,折算成电流是多少?”它不再直接关心电压怎么算。电流环则负责执行:“我不管你为什么要这个电流,我负责快速把电流顶到这个值,并且不让它超调太多。”电压怎么给、反电动势怎么补偿、电感延迟怎么克服,都是电流环自己的事。
一个日常类比就是团队分工:转速环是负责人,定目标、看结果;电流环是一线执行者,它管着最底层的资源调度,反应必须快。负责人不需要天天纠结每一步怎么做,而一线执行者也不需要天天操心战略目标。把一件事拆成两个环节各自优化,控制效果才能上去。
1.3 为什么电流环必须是内环
有人可能会问:既然要控制电流,为什么不把电流反馈和转速反馈放到同一个 PI 里,非要拆成两个?这里有几个关键原因。
第一,电机的转矩和电流成正比关系,至少在磁场恒定时可以这么看。控制转矩最直接的手段就是控制电流,所以电流环本质上就是转矩环。转矩是驱动机械运动的“力量来源”,越靠近力量来源的控制环,越应该放在底层。
第二,反电动势位于电枢回路内部。电流环把电枢电流闭环之后,反电动势就变成了电流环的一个内部扰动。内环带宽高,增益大,能很快把这个扰动抑制掉。而转速环只看到“系统已经变成电流源”的干净模型,不需要再处理电机内部的电磁耦合。
第三,电流环天然就是过流保护。把电流限幅值设成电机或驱动器允许的最大值,任何异常情况下电流都不会超过这个门槛,这在实物调试中特别重要,仿真里则能让启动阶段的行为更接近真实设备。
最后还有一点工程经验:内外环带宽必须拉开。一般外环带宽取内环的 1/5 到 1/10。如果转速环比电流环还快,电流环还没来得及把电流执行到位,转速环已经疯狂改指令,两个环互相较劲,出现低频振荡甚至发散,这是很多新手仿真翻车的主要原因。
2. 仿真前的数学准备:电枢方程与一套能用的电机参数
2.1 三个不能绕开的方程
直流电机电枢回路的电压方程是:
Ua = Ra·Ia + La·(dIa/dt) + Ke·ω
这里 Ua 是施加在电枢两端的电压,Ra 是电枢电阻,La 是电枢电感,Ke·ω 是反电动势,Ke 是反电动势常数,ω 是转子角速度。这个方程说明了电压不只是用来克服电阻,还要去克服电感产生的电流惯性,以及转速带来的反电动势。
转矩方程更简单:
Te = Kt·Ia
Kt 是转矩常数,在 SI 单位制下近似等于 Ke。所以控制电流,就是在控制电磁转矩,这也是电流闭环能当“转矩环”用的根本原因。
机械运动方程则是:
J·(dω/dt) = Te - TL - B·ω
J 是转子转动惯量,TL 是负载转矩,B 是粘滞摩擦系数。对多数小型电机,B 很小,仿真初期可以直接忽略,等后期分析稳态误差再补回来也不迟。
从传递函数角度看,电枢回路的输入是“Ua - Ke·ω”,输出是电流 Ia,对象是一个典型一阶惯性环节 1/(La·s + Ra)。电时间常数就是 La/Ra。这个数值直接决定了电流环能调到多快,所以建模前务必先把 La 和 Ra 定准。
2.2 一套能直接用的示例参数
仿真最忌讳用一堆拍脑袋的抽象变量。我通常以一个 24V、额定 2A、额定转速 3000rpm 的小型有刷直流电机为基准来设置参数。这里写一套可以直接抄的:
| 符号 | 含义 | 数值 |
|---|---|---|
| Ra | 电枢电阻 | 0.5 Ω |
| La | 电枢电感 | 1.5 mH |
| Ke | 反电动势常数 | 0.073 V/(rad/s) |
| Kt | 转矩常数 | 0.073 N·m/A |
| J | 转子转动惯量 | 1e-4 kg·m² |
| B | 粘滞摩擦系数 | 约 0,可忽略 |
| U_max | 母线电压 | 24 V |
| I_max | 允许最大电流 | 4 A |
| n_N | 额定转速 | 3000 rpm ≈ 314 rad/s |
这套参数怎么来的?额定转速 3000rpm 约等于 314rad/s。额定工况下,24V 电压扣除电阻压降 Ra·Irated = 1V,剩下约 23V 就是反电动势,所以 Ke ≈ 23 / 314 ≈ 0.073V/(rad/s)。永磁直流电机在磁场不饱和时,Kt 在数值上近似等于 Ke。最大电流取 4A 是为了启动时能给出约 2 倍的额定转矩,这也是多数驱动器的常见设计。
2.3 建模时允许做哪些近似
仿真不等于物理,合理的近似能让模型更聚焦控制问题。这里说几个常用的处理方式。
电枢电感不能忽略,因为电流环就是为对付电感动态而存在的。忽略电感就等于把电流环变成了比例环节,整定出来的参数在实物上会废掉。
粘滞摩擦 B 初期可以忽略。小型电机空载损耗很小,B 对动态过程影响有限,加上之后反而让整定多一个干扰因素。
反电动势不能扔。建模时一定要把 Ke·ω 反馈到电枢回路,否则电流环看到的是一个错误的被控对象。只是从控制带宽角度看,反电动势相对于电流环是个慢扰动,电流环足够快就能把它自动抑制掉。
PWM 脉冲用平均模型处理。真实驱动器靠 PWM 调节电压,但开关频率往往有 10kHz 甚至更高,仿真中没必要逐周期模拟开关纹波。用一阶惯性近似 PWM 的零阶保持特性就够了,延迟时间大约取半个 PWM 周期。10kHz 下只有 0.05ms,基本可以忽略,这一点后面踩坑部分会再展开。
3. 从零搭 Simulink 模型:按信号流一步步来
3.1 先搭电机本体,别急着接控制器
很多新手喜欢先把 PID 控制器拖出来,再想怎么接电机,结果一接就乱。我的做法是先把电机本体的信号流走通,这一步通过一个传感器探针都看一遍,确认无误后再套控制环。
在 Simulink 里可以这样搭电机本体:用一个 Transfer Fcn 模块表示电枢回路,分子是 [1],分母是 [La, Ra];它的输入是“Ua - Ke·ω”,输出是电流 Ia。电流 Ia 乘以转矩常数 Kt 得到电磁转矩 Te;用 Sum 模块做 Te - TL - B·ω;结果经过一个 Gain 模块,增益为 1/J,再经过一个积分器 Integrator,就得到转速 ω。转速 ω 再通过一个增益 Ke 反馈回第一个求和点,构成反电动势回路。
这套结构里,积分器是机械侧的记忆元件,传递函数环节是电磁侧的记忆元件。所有物理量的单位统一为 V、A、N·m、rad/s,不会出现单位换算混乱。
如果你用 Simscape Electrical 的 DC Machine 模块也行,但很多时候它多出不少电气细节,反而干扰控制逻辑调试。用最基本模块搭出来的模型,所有变量自己可控,排查问题也直观。
3.2 电流环和转速环怎么接
电机模型确认无误后,开始套控制器。整个信号流是:
转速给定 Step → 与转速反馈求和做偏差 → 进入转速环 PI(ASR)→ 输出经过 Saturation 限幅,作为电流给定 → 与电流反馈求偏差 → 进入电流环 PI(ACR)→ 输出经过 Saturation 限幅,作为电枢电压 Ua → 电机本体。
电流反馈从哪里取?直接从电机模型里电流信号线上引出分支,接一个一阶低通滤波器,时间常数我习惯取 0.2ms 到 0.5ms,然后再接到电流环 PI 的负输入端。转速反馈同样从 ω 信号分支引出,滤波时间常数可以大一些,比如 2ms 到 5ms,因为转速动态本来就慢,不需要保留高频信息。
这里必须强调两个限幅的物理含义:ASR 的限幅就是允许最大电流,按 4A 设;ACR 的限幅就是母线电压,按 24V 设。如果限幅设得比物理值大很多,仿真波形会看起来“很完美”,但拿到实物上根本复现不了。
控制器我建议直接用 Simulink 自带的 PID Controller 模块,把 Time domain 选成 Discrete,采样周期设 1e-4s。需要注意 “P” 和 “I” 都要填成实际参数,不要只填 P 项就跑,那样电流环会有稳态误差。
3.3 单位制、滤波器和求解器设置
单位制这块,我强烈建议全程使用国际单位:电流用 A,转速用 rad/s,电压用 V,转矩用 N·m。如果你只想看 rpm,可以在示波器前加一个增益 60/(2π),约等于 9.55,而不是把控制器内部的计算单位也改成 rpm,否则公式里的 Ke 和 Kt 很容易出错。
求解器方面,第一次做系统验证时可以用变步长 ode45,因为连续域模型比较“宽容”,响应波形也平滑。但正式调试参数时,我会切到定步长离散求解器,步长取 1e-5s 到 1e-4s。离散控制器采样周期固定为 1e-4s,这样仿真结果更接近实物,后续转代码也容易些。
别忘了给系统加一个负载转矩输入口。用一个常量为 0 的 Step 模块,在 0.4s 左右跳到某个定值,用来测抗扰动能力。这个细节一开始可能觉得多余,但等你调完参数想测试系统“承压”能力时,会发现这个口太重要了。
4. 参数整定:先内后外的工程顺序
4.1 为什么不能两个环一起调
这是新手翻车率最高的操作:把双闭环接起来,随便给一组 PI 参数,然后看到波形振荡,就盲目调其中某个参数,调了半天也不知道是哪个环惹的祸。
原因很简单:电流环参数主要影响高频行为,转速环参数主要影响低频行为。波形一混合,你很难从时域分辨振动来源。工程上正确的做法永远是“先内部后外部,逐环独立整定”。
剥开电流环时,把转速环去掉,用常量模块直接给电流环一个电流指令,比如 1A。这时候你看到的是一个纯粹的电流跟踪系统,参数少了,问题自然隐藏不住。电流环确认健康了,再接回转速环,把电流环当成一个已经调试好的“快速执行器”来用。
4.2 电流环整定的具体步骤(可复现)
电流环的对象是电枢回路,传递函数近似为 1/(La·s + Ra),其中 La/Ra = 3ms。
第一步,把 Ti_i 设成 La/Ra,也就是 0.003s。这样 PI 的零点能抵消电枢回路的极点,系统变成一阶惯性结构。
第二步,决定你希望的电流环响应时间。如果希望 2ms 内跟上指令,Kp_i ≈ La / 期望时间常数 ≈ 0.0015 / 0.002 ≈ 0.75。你可以从 0.5 起步,逐步增加。
第三步,给定 i_ref = 1A 的阶跃,观察电流波形。理想情况下,电流应在几毫秒内上升并稳定在 1A,不出现明显振荡。如果上升太慢,加大 Kp_i;如果出现高频振铃,说明 Kp_i 过大或反馈滤波太弱,降一点即可。
为什么这个方法是可行的?因为 PI 零点与电枢极点对消后,闭环传递函数近似为 1/((La/Kp_i)·s + 1),时间常数直接由 La/Kp_i 决定。整定电流环就是把 Kp_i 当成“带宽旋钮”来用。Ti_i 则不要随便改,它通常就是 La/Ra 附近的值。
4.3 转速环整定步骤
电流环整定完成后,把转速环接回去,给定目标转速 314rad/s。
此时被控对象从转速环的角度看,已经近似为一个积分环节 Kt/(J·s),因为电流环很快,反电动势扰动也被电流环压制了。对象从一阶惯性变成了积分,控制起来会稳很多。
初始参数可以从 Kp_n = 0.05、Ti_n = 0.1s 开始。跑一次 0.5s 仿真,看转速和电流两条曲线。如果启动阶段转速爬升太慢,逐步增加 Kp_n;如果启动超调大,先检查 ASR 的抗饱和设置,再考虑减小 Ti_n。如果转速出现持续低频振荡,大概率是转速环带宽太接近电流环了,要么降低 Kp_n,要么回头把电流环带宽再拉高一点。
理想的空载启动波形是:电流在极短时间内顶到限幅 4A,转速近乎线性上升,接近给定值后电流很快回落,转速以轻微超调(5% 以内)稳定在 314rad/s。整个过程在 0.5s 内完成就算合格。
4.4 限幅、抗饱和和初始条件
调参过程中最容易忽略的是积分饱和。ASR 输出一旦顶到电流限幅,它的积分项仍然在累积。如果不做抗饱和处理,转速到达给定后,积分项还没退出来,电流会继续维持在限幅值,转速就会猛冲过冲一大截,然后才慢吞吞回落。
Simulink 的 PID Controller 模块里打开 Limit output,并把 Anti-windup method 选成 back-calculation,Kb 可以先用默认值 1。ACR 同样开限幅,只是限幅值设成 24V。更土一点的办法是手动搭建积分器并加限幅,但用自带模块省事得多。
仿真初始条件也要检查:电机转速初值默认 0,状态是对的;但负载转矩如果一开始就设成非零值,启动阶段会更像带载启动,波形解读会更复杂。建议第一轮调试从零载开始,等基本指标满足后再加负载扰动。
5. 仿真结果怎么读:从波形判断系统健不健康
5.1 空载起动三阶段波形
双闭环空载启动的示波器波形通常分三个阶段,这是判断系统结构是否正确的黄金标准。
第一阶段,ASR 饱和输出,电流给定顶到 4A,电流环全力执行。因为电磁转矩远大于空载损耗,电机以接近恒定的加速度加速,转速曲线近似一条直线。
第二阶段,转速越来越接近给定值,ASR 开始退饱和,电流从 4A 逐渐下降。此刻转速还在上升,但加速度在减小,系统正在“收油门”。
第三阶段,转速到达给定值附近,电流降到空载损耗电流,然后进入稳态。转速可能有很小的超调,但最终稳定在 314rad/s,稳态误差接近 0。
如果你看到的曲线是三阶段分明的,说明双闭环结构基本是对的,剩下只是参数微调。如果电流从头到尾都稳在限幅值、转速一直往上窜,先查 ASR 抗饱和;如果电流没有顶到限幅就开始慢慢爬,说明 Kp_n 初始值给得太小,系统只用了很小比例的电流在执行启停。
5.2 突加负载扰动测试
空载起步打得再漂亮,也不代表抗扰动能力好。我会在 0.4s 时让负载转矩从 0 跳到 0.15N·m,相当于接近额定负载,再观察波形。
正常的响应应该是:电流几乎瞬间增加约 2A(0.15 / 0.073 ≈ 2.05A),转速出现很小幅度的跌落(几 rad/s 以内),然后很快恢复。这个过程中,电流环“扛”住了电磁扰动,转速环只需要处理慢悠悠的转速偏差。
如果转速跌落非常大,或者恢复时间明显拉长,说明转速环带宽偏低。可以适当增大 Kp_n,或者减小 Ti_n,但要小心不要把超调调回来。如果转速开始振荡,问题往往不是转速环本身,而是内外环带宽比例失调。
5.3 一组“问题波形”快速对照
| 波形现象 | 最可能的原因 | 处理方向 |
|---|---|---|
| 电流高频振铃,噪声感明显 | Kp_i 过大,或电流反馈滤波太弱 | 降 Kp_i,增大滤波时间常数 |
| 启动转速超调很大,电流退饱和慢 | ASR 积分饱和未处理,或 Ki_n 偏大 | 开启抗饱和,减小 Ti_n |
| 负载突变后转速恢复慢 | 转速环带宽不足 | 增大 Kp_n,减小 Ti_n |
| 全程低频等幅振荡 | 内外环带宽冲突 | 降低转速环带宽或提升电流环带宽 |
| 稳态转速恒定但存在较小静差 | 积分项不够,或负载过大 | 检查 PI 积分是否生效,增大 Ki_n |
| 启动电流上升太慢 | Kp_i 太小 | 增大 Kp_i 到预期响应时间 |
这份对照表是我调试时一直放在旁边的“速查手册”。大多数情况下,波形异常不是系统结构错了,而是参数踩到了上述某个区间。用一个表把症状和药方对应起来,比反复试错高效得多。
6. 我在仿真调试中踩过的几个坑
6.1 代数环:Simulink 不会提醒你“这会很慢”
最早我把电流反馈直接连到连续域 PI 的负输入端,得到的结果是仿真无比缓慢,而且波形出现莫名的抖动。Simulink 虽然没有直接报错,但构建模型时会提示存在代数环。这是因为连续域 PI 的输入和输出之间没有状态量做隔离,求解器只能用迭代方法解一个瞬时方程,数值上非常脆弱。
解决办法很简单:在电流反馈通道上加一阶低通滤波器。这不仅是规避代数环的技巧,也更接近真实电流传感器的动态特性。滤波时间常数我一般取 0.2ms 到 0.5ms,和电流环响应时间拉开 10 倍左右,不会明显影响带宽。如果不想加滤波,也可以把控制器改成离散 PID,离散系统天然避免连续代数环。
这个坑给我的心法就是:Simulink 里的每个反馈回路,尽量都要有一个“状态”,不管它是滤波器、积分器还是采样延迟。没有状态的闭环在连续域很危险。
6.2 PWM 平均模型别乱加延迟
很多人为了模拟 PWM 效果,喜欢在电压输出端加一个大步长的 Delay 或 Transport Delay。有一次我把延迟设成 1ms,结果电流环怎么调都是振荡,转速也在抽风。我以为是 PI 参数问题,折腾了大半天才意识到是那个延迟模块慢了一拍。
PWM 平均模型确实可以加一阶惯性来近似零阶保持,但时间常数应该取半个 PWM 周期。如果 PWM 频率 10kHz,那就是 0.05ms;5kHz 也就是 0.1ms。这个延迟相对于 3ms 的电时间常数完全可以忽略,加不加都行。如果你加了一个比对象时间常数还大的延迟,电流环的相位裕量会急剧下降,整定出来的参数会严重偏离真实情况。
6.3 反电动势与转速单位:一个隐蔽的量纲错误
我在某次整定 Ke 时,把额定转速 3000rpm 直接当成了 3000rad/s 用,结果 Ke 小了将近 10 倍。参数一填进去,电流环看起来飞快,实际反电动势反馈却几乎不起作用,电机的“自然限速”消失了,仿真里转速就一直朝天上冲。
这个坑在山寨调试中特别容易踩。检查办法很土:在 314rad/s 的稳定工况下,反电动势大约是 23V,减去电阻压降后和母线电压对得上,就是对的。只要能算出“额定转速时反电动势约等于母线电压减去电阻压降”,说明 Ke 基本没错。Kt 则在数值上等于 Ke,但这只在 SI 单位下成立,如果你把单位换成 rpm 或者 g·cm,又要重新换算。
6.4 仿真到实物之间永远差一步
把双闭环仿真调顺之后,我以为换到实物就能直接抄参数,结果并不理想。实物有电流采样噪声、驱动器死区、电流保护延时,还有机械摩擦和负载不确定,同样一套 PI 到实物上之后,响应会比仿真慢很多,甚至出现仿真里没有的振荡。
我的习惯是:仿真阶段重点验证控制结构和参数区间,实物阶段再以仿真结果为起点,按“先电流环后转速环”的顺序重新细调。仿真帮我把“哪个环应该先动、哪个环应该更慢”这个底层逻辑搞明白了,实物调试虽然还要花时间,但方向对了,试错成本大幅下降。
如果你也想从仿真走向实物,建议在仿真里提前加入一个白噪声扰动源到电流反馈通道,看看系统的抗干扰底子如何。那一步跑完你就知道,内环滤波不是可有可无的附属品,而是整个控制系统能不能落地的前提。