📖 第 8 章:PID 算法(PID Algorithm)

⚙️ 正点原子《DMF407 电机控制专题教程》V1.0 · Chapter 8
🗨️ 本章金句:「P 出力、I 消差、D 抑制超调:三个字母撑起工业控制半壁江山。」
这一章在干嘛? 全书核心算法登场。从开环 vs 闭环讲起,用「大棚温控」的例子掰开揉碎 PID 三环节各管什么,推导位置式/增量式离散公式,给出可直接抄的 C 代码,最后认识积分饱和问题。
8.1 开环与闭环8.2 三个环节各管什么?8.3 位置式 vs 增量式8.4 积分饱和与代码实现

8.1 开环与闭环

开环:只发指令不看结果——风扇设了固定电压,但电机老化、灰尘让负载变了,实际风力就偏离目标,精度差、抗扰弱。

闭环:加反馈回路,用「目标值 − 实际值 = 偏差」驱动控制——大棚温控系统实时测温,偏差喂给控制电路自动调温。把对象换成电机、反馈换成编码器,就是电机闭环调速:

原书图 8.1.2
原书图 8.1.2:闭环控制系统实例:目标值与实际值求偏差,自动调节

8.2 三个环节各管什么?

PID = Proportion 比例 + Integral 积分 + Differential 微分。控制流程:目标值与实际值求偏差 e → 三环节运算 → 输出作用于执行器:

原书图 8.2.1
原书图 8.2.1:PID 控制流程:偏差经 P/I/D 三环节后输出
环节公式作用副作用(过大)
P 比例$u = K_p \cdot e$偏差越大出力越大,响应快超调、振荡;存在静态误差
I 积分$+K_i \sum e$只要偏差在就持续累计加力,消除静态误差超调加剧、响应变慢
D 微分$+K_d(e_k - e_{{k-1}})$看偏差变化趋势,提前减速,抑制超调放大噪声、系统振荡
原书图 8.2.1.1
原书图 8.2.1.1:比例环节曲线:Kp 越大到达目标越快,但超调振荡越猛
原书图 8.2.1.2
原书图 8.2.1.2:纯比例的静态误差:输出刚好被外部损耗抵消,偏差长期存在
原书图 8.2.2.1
原书图 8.2.2.1:比例+积分曲线:积分持续加力消除静差
静态误差怎么来的? 例:Kp 固定时输出刚好被外部环境抵消(半小时升温 5°C = 外部降温 5°C),偏差永远消不掉。积分环节「记账式」累计偏差,逼输出增大直到静差消除。

三者合体的离散公式(位置式):

$u_k = K_p e_k + K_i \sum_{{j=0}}^{{k}} e_j + K_d (e_k - e_{{k-1}})$

8.3 位置式 vs 增量式

把 k 换成 k−1 再相减,得到增量式

$\Delta u_k = K_p(e_k - e_{k-1}) + K_i e_k + K_d(e_k - 2e_{k-1} + e_{k-2})$

直观理解:50→60RPM 加速,位置式直接输出 60RPM 的全量占空比;增量式只输出「提 10RPM 的增量」,需累加到上次输出上。

对比项位置式增量式
输出全量输出仅增量
偏差需一直累计只看最近 3 次
积分作用
限幅输出 + 积分都要限幅仅输出限幅
怎么选? 位置式带积分、适合需消除静差的场合(速度环),但要做积分限幅防饱和;增量式运算量小、误算影响小,适合执行机构带积分特性的对象(如步进电机)。

8.4 积分饱和与代码实现

积分饱和:目标设得超出系统能力(电机最快 300RPM 你设 350),偏差长期存在 → 积分越累越大深度饱和;这时改目标 200RPM,系统因「积食」迟迟无法响应:

原书图 8.3.1
原书图 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. 积分饱和是怎么发生的?工程上如何避免?
目标值超出系统能力或长时间无法达标时,累计偏差持续增大导致深度饱和,反向调节变慢。可通过优化参数、限制目标范围、积分限幅来避免。
← 上一篇🏠 顶层目录下一篇 →