这一章在干嘛?
全书核心算法登场。从开环 vs 闭环讲起,用「大棚温控」的例子掰开揉碎 PID 三环节各管什么,推导位置式/增量式离散公式,给出可直接抄的 C 代码,最后认识积分饱和问题。
8.1 开环与闭环
开环:只发指令不看结果——风扇设了固定电压,但电机老化、灰尘让负载变了,实际风力就偏离目标,精度差、抗扰弱。
闭环:加反馈回路,用「目标值 − 实际值 = 偏差」驱动控制——大棚温控系统实时测温,偏差喂给控制电路自动调温。把对象换成电机、反馈换成编码器,就是电机闭环调速:
原书图 8.1.2:闭环控制系统实例:目标值与实际值求偏差,自动调节
8.2 三个环节各管什么?
PID = Proportion 比例 + Integral 积分 + Differential 微分。控制流程:目标值与实际值求偏差 e → 三环节运算 → 输出作用于执行器:
原书图 8.2.1:PID 控制流程:偏差经 P/I/D 三环节后输出
| 环节 | 公式 | 作用 | 副作用(过大) |
|---|---|---|---|
| P 比例 | 偏差越大出力越大,响应快 | 超调、振荡;存在静态误差 | |
| I 积分 | 只要偏差在就持续累计加力,消除静态误差 | 超调加剧、响应变慢 | |
| D 微分 | 看偏差变化趋势,提前减速,抑制超调 | 放大噪声、系统振荡 |
原书图 8.2.1.1:比例环节曲线:Kp 越大到达目标越快,但超调振荡越猛
原书图 8.2.1.2:纯比例的静态误差:输出刚好被外部损耗抵消,偏差长期存在
原书图 8.2.2.1:比例+积分曲线:积分持续加力消除静差
静态误差怎么来的?
例:Kp 固定时输出刚好被外部环境抵消(半小时升温 5°C = 外部降温 5°C),偏差永远消不掉。积分环节「记账式」累计偏差,逼输出增大直到静差消除。
三者合体的离散公式(位置式):
8.3 位置式 vs 增量式
把 k 换成 k−1 再相减,得到增量式:
直观理解:50→60RPM 加速,位置式直接输出 60RPM 的全量占空比;增量式只输出「提 10RPM 的增量」,需累加到上次输出上。
| 对比项 | 位置式 | 增量式 |
|---|---|---|
| 输出 | 全量输出 | 仅增量 |
| 偏差 | 需一直累计 | 只看最近 3 次 |
| 积分作用 | 有 | 无 |
| 限幅 | 输出 + 积分都要限幅 | 仅输出限幅 |
怎么选?
位置式带积分、适合需消除静差的场合(速度环),但要做积分限幅防饱和;增量式运算量小、误算影响小,适合执行机构带积分特性的对象(如步进电机)。
8.4 积分饱和与代码实现
积分饱和:目标设得超出系统能力(电机最快 300RPM 你设 350),偏差长期存在 → 积分越累越大深度饱和;这时改目标 200RPM,系统因「积食」迟迟无法响应:
原书图 8.3.1:不合理目标值导致积分深度饱和,调节失灵
对策:① 优化 PID 参数让系统尽快达标;② 限制目标值范围;③ 积分限幅(调好参数后按系统设定上限)。
C 代码用一个结构体管理全部控制量(目标值、三系数、最近三次偏差、累计偏差),位置式核心就五行:
PID->Error = PID->SetPoint - Feedback; /* 偏差 */
PID->SumError += PID->Error; /* 累计偏差 */
PID->ActualValue = PID->Proportion * PID->Error /* P */
+ PID->Integral * PID->SumError /* I */
+ PID->Derivative * (PID->Error - PID->LastError); /* D */
PID->LastError = PID->Error;
增量式写法不同点:
ActualValue 是 += 自增 (输出增量),并需要保存最近两次偏差。
1. 纯比例控制为什么存在静态误差?积分环节如何消除它?
只要比例输出恰好被外部损耗抵消,偏差就恒定存在。积分环节持续累计偏差增大输出,直到偏差归零——即使偏差很小,时间一长累计量依然可观。
2. 位置式和增量式 PID 的输出含义有什么不同?
位置式输出的是全量控制值,直接可用;增量式输出的是相对上次的变化量,必须累加到上次输出上才是实际控制值。
3. 积分饱和是怎么发生的?工程上如何避免?
目标值超出系统能力或长时间无法达标时,累计偏差持续增大导致深度饱和,反向调节变慢。可通过优化参数、限制目标范围、积分限幅来避免。