Appearance
自动控制概论:开环与闭环
概念
前面所有课程都在回答一个问题:怎么让计算机把该算的东西算出来。这一门课问的是另一个问题:怎么让一个物理量稳定地停在你要的那个值上。
一句话说清它是什么:自动控制就是"用测量代替猜测"——测出实际输出与期望值的差,再拿这个差去纠正执行机构。
两种做法高下立判:
| 开环控制 | 闭环控制 | |
|---|---|---|
| 有无测量 | 不测输出 | 测输出并送回 |
| 依据 | 只按给定值干 | 按偏差干 |
| 例子 | 洗衣机定时 30 分钟、步进电机走固定步数 | 恒温箱、数控机床位置环、无人机定高 |
| 精度由谁决定 | 被控对象准不准 | 测量准不准(对象不准也能纠回来) |
| 会不会不稳定 | 不会 | 可能(这是代价) |
这张表的第三行与第四行是同一个道理的两面:开环把"结果对不对"押在被控对象上,闭环把这件事交给了测量与反馈——于是不确定性从"对象"搬到了"传感器",而传感器通常比执行机构容易做准得多。
auto 这一支与主线的唯一实质交汇就是 嵌入式的实时控制 与机器人方向——它不阻塞主线上的任何内容,这一章的定位是"把闭环这件事从直觉变成公式"。
这一层回答了上一层什么问题:上一章的 综合实践 已经把芯片用起来了;这一章回答的是"用起来的那个东西,怎么保证它停在你要的位置上"。它用到的数学全部来自 微积分 与 线性代数。
原理
一、五个基本元件与方块图
任何一套自动控制系统,拆开来都只有五类东西:
| 元件 | 干什么 | 例子 |
|---|---|---|
给定输入 R | 你要的值 | 目标温度 25 ℃ |
| 比较环节 | 求偏差 E = R - B | 减法器 / 软件里一行代码 |
| 控制器 | 把偏差变成控制量 | PID、开关、PLC 程序 |
| 执行机构 | 把控制量变成物理作用 | 加热丝、电机、阀门 |
| 被控对象 | 真正要控制的东西 | 炉子、小车、水箱 |
测量反馈 H | 把输出变成可比量 | 热电偶、编码器 |
再加上一个不请自来的角色:扰动 D。把它画出来就是方块图:
text
R + E +--------+ U +--------+ + Y
--->(+)------>| 控制器 |----->| 执行机构|----->| 对象 |-----+--->
^ - +--------+ +--------+ +------+ |
| |
| +--------+ |
+-----------------| 测量 H |<--------------------------+
+--------+这张图只有三个要点:① 反馈是负的(所以比较点是 R - B);② 扰动从对象处进来,不在回路里(这正是闭环要解决的问题);③ 断掉反馈线就退化成开环。
二、闭环到底改善了什么:一个反直觉的结论
把方块图写成传递函数。前向通路 G = G1 * G2(控制器乘对象),反馈通路 H,单位负反馈反相。闭环传递函数是
看这个式子的两种极端:
- 当
|G1G2H|很小时:T ≈ G1G2,与开环差不多; - 当
|G1G2H|远大于 1 时:T ≈ 1/H。
第二条是整门课的基石。它说的是:只要回路增益足够大,输出就只由反馈通路 H 决定,与前向通路里的对象 G2 几乎无关。
于是"被控对象不准确"这件事被消掉了——而 H 通常是一支电阻分压或一个传感器的标定系数,比一个电机的精确力矩容易确定得多。
三、灵敏度:好处有多大,可以算
把"输出受参数变化的影响"定义为灵敏度:
开环时 S = 1(对象增益变化 10%,输出就变化 10%);闭环时 S ≈ 1/(GH)(回路增益 1000 就降到 1/1000)。
这就是"闭环能纠偏"的定量表达:不是"纠得更好",而是按回路增益的比例把影响缩小。
四、代价:天下没有白拿的精度
闭环不是免费的,它至少带来四笔账:
| 代价 | 原因 |
|---|---|
| 可能不稳定 | 反馈是负的才有用;信号经过对象与传感器有相位滞后,滞后再叠加放大就可能变成正反馈 |
| 需要传感器 | 多一个器件、多一份成本与故障点 |
| 噪声放大 | 传感器噪声在高增益下被同样放大 |
| 结构更复杂 | 回路参数互相牵扯,调一个动全局 |
| 积分环节带来相位滞后 | 消除稳态误差要用积分,但积分同时"拖慢"响应 |
"可能不稳定"是闭环最本质的代价:开环系统永远不会振荡(没有回路就没有自激),而闭环系统必须专门做稳定性设计——这就是后面几章(根轨迹、频域判据)存在的全部理由。
五、稳态误差与系统型别
闭环下输出与给定之间的终值差叫稳态误差,它是"准不准"的指标:
第二个式子是终值定理,它把"时间趋于无穷"变成了"s 趋于 0"。误差大小取决于系统型别(开环传递函数里积分环节 1/s 的个数):
| 系统型别 | 单位阶跃 | 单位斜坡 | 单位加速度 |
|---|---|---|---|
| 0 型(无积分) | 1/(1+Kp) | ∞ | ∞ |
| 1 型(一个 1/s) | 0 | 1/Kv | ∞ |
| 2 型(两个 1/s) | 0 | 0 | 1/Ka |
读法:系统型别每加一,就能把更低一阶的输入"吃干净"——1 型对阶跃零误差,2 型对斜坡零误差。但代价是每加一个积分环节都引入 90° 相位滞后,稳定性变差——"型别不能无限加"是稳定性与精度的直接冲突。
六、三项指标:稳、准、快
控制系统做好了要同时满足三件事,而它们互相拉扯:
| 指标 | 含义 | 数学表现 | 提高它的手段 |
|---|---|---|---|
| 稳 | 能收敛、不振荡 | 闭环极点实部 < 0 | 降增益、加校正 |
| 准 | 稳态误差小 | 型别、回路增益 | 升增益、加积分 |
| 快 | 过渡过程短 | 极点离虚轴远 | 升增益、加微分 |
这三条构成一个不可能三角:升增益同时改善"准"与"快",却损害"稳";加积分改善"准",同时损害"稳"与"快"。控制设计的全部工作就是在这个三角里找一个能满足要求的折中。
七、分类
| 分类依据 | 类型 |
|---|---|
| 给定值变化规律 | 恒值系统(给定不变,抗扰为主)/ 随动系统(给定在变,跟踪为主) |
| 信号形式 | 连续系统 / 离散系统(计算机控制,本质是采样系统) |
| 数学关系 | 线性系统 / 非线性系统(饱和、死区、间隙) |
| 变量数 | 单变量 / 多变量(多入多出,需解耦) |
注意第四行:真实执行机构几乎都有饱和(电压到顶了)与死区(小信号不响应),所以"纯线性"只在小信号范围内成立——这也是为什么考试题目常在小信号下才让你用线性理论分析。
示例
例 1:开环与闭环的精度对照
被控对象是一阶的:G(s) = K/(Ts+1),T = 1 s,名义增益 K = 10。要求输出 r = 1。
| 方案 | 做法 | 稳态输出 | 稳态误差 |
|---|---|---|---|
| 开环 | 按名义增益反算输入 u = r/10 = 0.1 | 10 x 0.1 = 1.000000 | 0 |
| 闭环 | 比例控制器 Kp = 1,反馈 H = 1 | K/(1+K) = 10/11 | 0.090909 |
看起来开环赢了——但这是因为"名义增益正好准"。一旦对象漂移,局面立刻反转:
| 对象增益 | 开环输出 | 开环相对变化 | 闭环输出 | 闭环相对变化 |
|---|---|---|---|---|
K = 10 | 1.000000 | — | 0.909091 | — |
K = 12 | 1.200000 | +20.00% | 0.923077 | +1.54% |
增益漂移 20%,开环输出就跟着漂 20%,闭环只漂 1.54%——差 13 倍。这就是"用测量换精度"的全部含义:闭环不是让输出更接近给定(0 型系统仍有稳态误差),而是让输出更"不理会"对象的漂移。
(灵敏度公式给的是无穷小量下的比值 S = 1/(1+KpK) = 1/11;这里是 ΔK = 2 的有限变化,所以实测倍率是 13 而非 11——两者同向、同量级。)
例 2:稳态误差随系统型别的变化
| 系统 | 单位阶跃 | 单位斜坡 |
|---|---|---|
0 型,Kp = 10 | 1/11 = 0.0909(9.09%) | ∞ |
0 型,Kp = 100 | 1/101 = 0.0099(0.99%) | ∞ |
1 型,Kv = 2 | 0 | 1/2 = 0.5000 |
1 型,Kv = 10 | 0 | 1/10 = 0.1000 |
两条读法:
- 0 型靠"堆增益"降误差,但永远降不到 0(增益 10 倍,误差降 10 倍,仍是 0.99%)。
- 1 型对阶跃是 0 误差——因为它有一个积分环节,积分会把任何恒定的残余偏差一路累积到把偏差消掉为止。
"积分能消掉阶跃误差"这件事值得单独记住:它不是靠"放大",而是靠"累积"。
例 3:扰动抑制
扰动从对象处进来(比如炉子在散热):Y/D = G2/(1 + G1G2H)。取 G1 = 100、G2 = 10、H = 1:
text
闭环:Y/D = 10 / (1 + 1000) = 0.009990
开环:Y/D = G2 = 10
降低倍数 = 1001 倍同样是 1001 倍的改善——扰动抑制与参数灵敏度用的是同一个分母 1 + G1G2H。这不是巧合:在回路增益足够大的地方,"任何从回路里进来的东西"都被同样地压下去,无论它是参数漂移还是外部扰动。
反过来看也成立:传感器 H 的噪声是"从反馈通路进来"的,它不在这个分母的保护范围内(Y/N = -G1G2H/(1+G1G2H) ≈ -1,噪声被完整传给输出)。这就是为什么高精度控制必须配高精度传感器。
例 4:C 实现——开环与闭环的数值对照
用数值积分跑同一个一阶对象,四个组合一次算完。
/* loop.c —— 开环 vs 闭环:同一个一阶对象,增益漂移的影响 */
#include <stdio.h>
#define DT 0.01
#define STEPS 1000 /* 10 s */
#define TAU 1.0
#define KP 1.0 /* 闭环比例增益 */
static const int marks[4] = { 50, 100, 200, 1000 }; /* 0.5 / 1 / 2 / 10 s */
static double sim(const char *tag, double K, int closed, double r)
{
double y = 0.0, u, snap[4] = { 0.0, 0.0, 0.0, 0.0 };
int n, m = 0;
for (n = 0; n < STEPS; n++) {
u = closed ? KP * (r - y) : r / 10.0; /* 开环按名义增益 10 反算输入 */
y += DT * (K * u - y) / TAU;
while (m < 4 && n + 1 >= marks[m]) { snap[m] = y; m++; }
}
printf(" %-19s", tag);
for (m = 0; m < 4; m++) printf("%10.5f", snap[m]);
printf(" err=%+10.6f\n", r - y);
return y;
}
int main(void)
{
double yo1, yo2, yc1, yc2;
printf("plant: G(s) = K/(T*s + 1), T = %.1f s, r = 1.0, dt = %.2f s\n", TAU, DT);
printf("open loop u = r/10 (nominal K = 10); closed loop Kp = %.0f, H = 1\n\n", KP);
printf(" %-19s%10s%10s%10s%10s\n", "case", "0.5s", "1.0s", "2.0s", "10.0s");
yo1 = sim("open loop, K=10", 10.0, 0, 1.0);
yo2 = sim("open loop, K=12", 12.0, 0, 1.0);
yc1 = sim("closed loop,K=10", 10.0, 1, 1.0);
yc2 = sim("closed loop,K=12", 12.0, 1, 1.0);
printf("\n=== gain drift K: 10 -> 12 ===\n");
printf(" open loop : y %.6f -> %.6f, relative change %+.2f%%\n",
yo1, yo2, (yo2 - yo1) / yo1 * 100.0);
printf(" closed loop: y %.6f -> %.6f, relative change %+.2f%%\n",
yc1, yc2, (yc2 - yc1) / yc1 * 100.0);
printf(" sensitivity S = 1/(1 + Kp*K) = %.4f (open loop: 1.0)\n", 1.0 / (1.0 + KP * 10.0));
printf(" steady state error: open(K=12) %+.6f, closed(K=10) %+.6f\n",
1.0 - yo2, 1.0 - yc1);
return 0;
}
c 本站为静态站,不提供在线运行;可复制到本地用 gcc / python 执行
预期输出:
plant: G(s) = K/(T*s + 1), T = 1.0 s, r = 1.0, dt = 0.01 s
open loop u = r/10 (nominal K = 10); closed loop Kp = 1, H = 1
case 0.5s 1.0s 2.0s 10.0s
open loop, K=10 0.39499 0.63397 0.86602 0.99996 err= +0.000043
open loop, K=12 0.47399 0.76076 1.03922 1.19995 err= -0.199948
closed loop,K=10 0.90641 0.90908 0.90909 0.90909 err= +0.090909
closed loop,K=12 0.92220 0.92308 0.92308 0.92308 err= +0.076923
=== gain drift K: 10 -> 12 ===
open loop : y 0.999957 -> 1.199948, relative change +20.00%
closed loop: y 0.909091 -> 0.923077, relative change +1.54%
sensitivity S = 1/(1 + Kp*K) = 0.0909 (open loop: 1.0)
steady state error: open(K=12) -0.199948, closed(K=10) +0.090909三段输出分别对应例 1 的三个结论:前两块是开环(稳定但不抗漂移)、后两块是闭环(稳定但带稳态误差);最后两行把"漂移 20% 对 1.54%"与灵敏度 1/11 一起打印出来。注意开环在 0.5 s 时只有 0.39499、2 s 时才到 0.86602——一阶对象要 3~4 个时间常数(这里 T = 1 s)才接近稳态,这就是"快"那一项指标的来源。
例 5:Python——精度、灵敏度、稳态误差一次算清
# 自动控制概论:精度、灵敏度、稳态误差与扰动抑制
import unicodedata
def wpad(s, n):
"""按显示宽度右补空格:东亚宽字符算 2 列"""
w = sum(2 if unicodedata.east_asian_width(c) in "WF" else 1 for c in s)
return s + " " * max(0, n - w)
print("=== 一、闭环传递函数与增益漂移 ===")
Kp, H = 1.0, 1.0
for K in (10.0, 12.0, 8.0):
T = Kp * K / (1 + Kp * K * H)
print(f" {wpad('K =', 6)}{K:5.1f} -> Y/R = {T:.6f},稳态误差 {1 - T:.6f}")
T10 = Kp * 10 / (1 + Kp * 10 * H)
T12 = Kp * 12 / (1 + Kp * 12 * H)
print(f" 开环:Y/R = K/10 -> 1.000000 / 1.200000,相对变化 +20.00%")
print(f" 闭环相对变化 = {(T12 - T10) / T10 * 100:+.2f}%,比开环小 "
f"{20.0 / ((T12 - T10) / T10 * 100):.1f} 倍")
print("\n=== 二、灵敏度 S = 1/(1 + G*H) ===")
for G in (10.0, 100.0, 1000.0):
S = 1 / (1 + G * H)
print(f" G = {G:6.0f} -> S = {S:.6f}(开环为 1.0,影响缩小 {1 / S:.0f} 倍)")
print("\n=== 三、稳态误差与系统型别 ===")
rows = [("0 型", "1/(1+Kp)", 1 / 11, None), ("0 型", "1/(1+Kp)", 1 / 101, None),
("1 型", "0", 0.0, 1 / 2), ("1 型", "0", 0.0, 1 / 10)]
print(f" {wpad('型别', 6)}{wpad('阶跃误差', 22)}{wpad('斜坡误差', 14)}")
for typ, expr_s, es, er in rows:
s_txt = f"{expr_s} = {es:.4f}"
r_txt = "inf" if er is None else f"{er:.4f}"
print(f" {wpad(typ, 6)}{wpad(s_txt, 22)}{r_txt}")
print("\n=== 四、扰动抑制 ===")
G1, G2 = 100.0, 10.0
closed = G2 / (1 + G1 * G2 * H)
print(f" 闭环 Y/D = G2/(1 + G1*G2*H) = {G2:.0f}/{1 + G1 * G2 * H:.0f} = {closed:.6f}")
print(f" 开环 Y/D = G2 = {G2:.1f},闭环把扰动压低 {G2 / closed:.0f} 倍")
print(f" 注意:传感器噪声走反馈通路,Y/N 约为 -1,不被这个分母保护")
python 本站为静态站,不提供在线运行;可复制到本地用 gcc / python 执行
预期输出:
=== 一、闭环传递函数与增益漂移 ===
K = 10.0 -> Y/R = 0.909091,稳态误差 0.090909
K = 12.0 -> Y/R = 0.923077,稳态误差 0.076923
K = 8.0 -> Y/R = 0.888889,稳态误差 0.111111
开环:Y/R = K/10 -> 1.000000 / 1.200000,相对变化 +20.00%
闭环相对变化 = +1.54%,比开环小 13.0 倍
=== 二、灵敏度 S = 1/(1 + G*H) ===
G = 10 -> S = 0.090909(开环为 1.0,影响缩小 11 倍)
G = 100 -> S = 0.009901(开环为 1.0,影响缩小 101 倍)
G = 1000 -> S = 0.000999(开环为 1.0,影响缩小 1001 倍)
=== 三、稳态误差与系统型别 ===
型别 阶跃误差 斜坡误差
0 型 1/(1+Kp) = 0.0909 inf
0 型 1/(1+Kp) = 0.0099 inf
1 型 0 = 0.0000 0.5000
1 型 0 = 0.0000 0.1000
=== 四、扰动抑制 ===
闭环 Y/D = G2/(1 + G1*G2*H) = 10/1001 = 0.009990
开环 Y/D = G2 = 10.0,闭环把扰动压低 1001 倍
注意:传感器噪声走反馈通路,Y/N 约为 -1,不被这个分母保护考点
- 开环与闭环的本质差别是"有没有测量并送回输出"。开环精度押在对象上,闭环精度押在传感器上。
- 闭环的基石公式:
T = G1G2/(1 + G1G2H);回路增益G1G2H远大于 1 时T ≈ 1/H,输出与对象几乎无关。 - 灵敏度
S = 1/(1+GH):开环为 1,闭环按回路增益缩小。扰动抑制用的是同一个分母,所以改善倍数相同。 - 闭环的四笔代价:可能不稳定(有相位滞后)、需要传感器、放大噪声、结构复杂。"可能不稳定"是本质代价——开环永远不会自激振荡。
- 稳态误差用终值定理:
E = R/(1+GH),e_ss = lim(s→0) sE(s)。 - 系统型别(开环里
1/s的个数):0 型对阶跃有误差、对斜坡无解;1 型对阶跃零误差、对斜坡1/Kv;2 型对斜坡零误差。每加一个积分环节都带来 90° 相位滞后,所以型别不能无限加。 - 三项指标稳、准、快构成不可能三角:升增益改善准与快但损害稳;加积分改善准但损害稳与快。
- 传感器噪声不受回路增益保护(
Y/N ≈ -1),所以高精度控制必须配高精度传感器。这与"扰动被压低 1001 倍"并不矛盾——两者进来的位置不同。 - 易错:把"闭环一定比开环好"当成无条件的结论(0 型闭环仍有稳态误差,只是不随对象漂移);把
e_ss的公式记成"偏差的极限"而忘记乘s;把"0 型加高增益"当成可以消掉误差(只能减小,永远不为 0);把灵敏度公式里的G与闭环传递函数T混用(S = dT/T / dG/G,分子分母是相对量)。
小结
- 控制 = 测偏差 + 用偏差纠正;开环不测输出,闭环测并把结果送回比较环节。
- 闭环的收益全部来自"回路增益足够大":
T ≈ 1/H,输出由反馈通路决定,与对象无关。 - 灵敏度与扰动抑制共用一个分母
1 + GH,所以两者的改善倍数相同。 - 闭环的代价是"可能不稳定",这是后面所有稳定性分析的起点。
- 稳态误差由系统型别与回路增益决定:型别决定"能不能为 0",增益决定"有多小"。
- 稳、准、快三项指标互相拉扯,控制设计就是在这三者之间找折中。
回到主线:这一章把 嵌入式实时控制 里那些"大概调一下参数就动了"的直觉写成了公式;而它后面的三章(模型、时域、频域)会一步步把"回路增益到底能开多大"算清楚——这条路与 计组的时序收敛 如出一辙:先建立模型,再算余量,最后才是调参数。
这一章只答了"闭环为什么有用",还没有"用什么东西把回路写下来"。下一章把电路与机械系统都化成同一个数学对象——传递函数。
下一篇:数学模型:微分方程与传递函数
评论(0)
当前浏览器不允许本地存储,评论无法保存。
还没有评论,来说两句。