7.3 PID控制从手工整定到代码实现


7.3 PID控制:从手工整定到代码实现

本节摘要:PID 控制器以"比例治当下、积分治过去、微分治未来"的三项叠加统治工业控制百年。本节逐项拆解三项的作用与副作用,手写离散 PID 实现并复现积分饱和现象与抗饱和修复,给出 Ziegler-Nichols 整定流程与仿真验证的完整闭环。

一条百年公式

u(t) = Kp·e(t) + Ki·∫e(τ)dτ + Kd·de/dt。误差 e 是设定值与实测值之差,控制量 u 是三项加权和:比例项盯着当下误差,误差越大纠正越猛;积分项累积过去的误差,专治"稳态残留偏差";微分项预判误差的变化趋势,提前刹车抑制超调。1911 年斯佩里陀螺、1939 年泰勒公司的气动控制器用的就是它的雏形,今天它仍占工业回路的大多数——一个三项公式活了一百年,不是因为精致,而是因为不依赖精确模型:只要系统大致单调,PID 靠反馈就能对付。

三项的分与合

先在 7.1 的二阶系统上逐项做拆解实验。只上比例(P):响应快但有余差——增益越高余差越小,但高到某处开始振荡(第 1 章烤箱实验的重演)。加积分(I):余差被慢慢碾平,代价是相位滞后、超调加剧、且带来积分饱和风险。加微分(D):超调被抑制、稳定裕度增加,但它对测量噪声极其敏感(噪声的导数被放大):

import numpy as np def plant_response(Kp, Ki, Kd, T=8.0, dt=0.005, m=1.0, c=1.2, k=9.0): """二阶系统 + PID 的闭环仿真,返回位置轨迹与误差统计""" x, v, integ, e_prev = 0.0, 0.0, 0.0, 1.0 traj = [] for _ in range(int(T / dt)): e = 1.0 - x # 设定值 1 integ += e * dt deriv = (e - e_prev) / dt u = Kp * e + Ki * integ + Kd * deriv e_prev = e a = (u - c * v - k * x) / m v += a * dt x += v * dt traj.append(x) t = np.array(traj) return t.max(), t[-1] print("纯P Kp=5 超调 %.2f 末值 %.3f(余差明显)" % plant_response(5, 0, 0)) print("PI Kp=5,Ki=3 超调 %.2f 末值 %.3f(余差消失但超调增大)" % plant_response(5, 3, 0)) print("PID 全家桶 超调 %.2f 末值 %.3f(微分压住超调)" % plant_response(5, 3, 0.5))

积分饱和:PID 最著名的坑

执行器有物理上限(阀门开度 0 到 100%),误差长期同号时,积分项会累积到远超执行器极限的数值;设定值回摆后,积分项要花很久"放电",导致大幅超调甚至振荡——这就是积分饱和(windup)。复现与修复:

def pid_with_windup(antiwindup=True, Kp=5, Ki=6, T=12.0, dt=0.005, m=1.0, c=1.2, k=9.0, u_max=2.0): x, v, integ, e_prev = 0.0, 0.0, 0.0, 1.0 peak = 0.0 for i in range(int(T / dt)): r = 1.0 if i * dt < 6 else -1.0 # 设定值中途翻转 e = r - x integ_raw = integ + e * dt u_raw = Kp * e + Ki * integ_raw u = np.clip(u_raw, -u_max, u_max) # 抗饱和:只在输出未饱和或积分方向有利于退饱和时才累积 if (not antiwindup) or (abs(u_raw) <= u_max) or (u_raw * e < 0): integ = integ_raw a = (u - c * v - k * x) / m v += a * dt x += v * dt peak = max(peak, abs(x)) return peak print("无抗饱和 峰值偏差 %.2f" % pid_with_windup(False)) print("有抗饱和 峰值偏差 %.2f" % pid_with_windup(True))

抗饱和的手段一脉相承:积分钳位、反算(back-calculation,把超限部分按速率回灌给积分项)、条件积分。逻辑核心都一样——执行器已经顶死时,别让积分继续空转攒债

PID 三项与整定路线

PID 三项与整定路线

整定:从手感到流程

Ziegler-Nichols 临界增益法是百年经典流程:先只上比例并逐步增大增益,直到系统出现等幅振荡,记下临界增益 Ku 与振荡周期 Tu;然后按经验表 Kp = 0.6Ku、Ki = 1.2Ku/Tu、Kd = 0.075Ku·Tu 落地,再微调。它的价值不在参数多准,而在给了可复现的起手式。现代工程更常见的姿势是仿真整定:把 7.1 的模型搭起来,用网格搜索或最优化(把超调、调节时间、稳态误差加权成一个目标函数——对,第 3 章的优化兵器直接可用)扫参数取最优,最后小范围实机验证。理论工具如根轨迹与频域裕度(伯德图上的相位裕度、增益裕度)则回答"离失稳还有多远"的鲁棒性问题,是整定时的安全护栏。

⚠️ 常见坑:微分项直接对测量值求导。测量噪声被导数放大后 injected 进执行器,阀门会高频抖动。标准做法是对测量值做低通滤波,或干脆只用 PI(工业现场大多数回路就是 PI)。

本节要点回顾

  • 三项口诀:比例治当下、积分治过去、微分治未来;副作用分别是振荡、饱和、噪声放大;
  • 积分饱和是 PID 头号坑,钳位/反算/条件积分三招可解,核心是顶死时不攒债;
  • Ziegler-Nichols 给可复现起手式,仿真整定 + 频域裕度护栏是现代标配;
  • PID 长寿靠免模型:对模型精度要求低,靠反馈吃饭;
  • 参数整定本身是优化问题,第 3 章兵器可无缝复用——两条战线在此握手。

反馈的"手工时代"到此为止。下一章让增益从经验变成计算:LQR 用一条二次代价解出最优反馈,卡尔曼滤波从噪声里捞出状态,强化学习把"最优"延伸到模型未知的世界。


作者与出处
原作者: 灏天文库
来源:灏天文库
整理: 灏天文库整理
由灏天文库平台收录,内容或由平台用户上传,仅供学习交流
发布者: 作者: 灏天文库 转发
评论区 (0)
U