---
title: PID 控制
url: https://doc.liz6.com/theory/02-control-theory/04-pid-control
locale: zh
area: theory
tags:
- 控制理论
- 基础理论
date: 2026-09-10
modified: 2026-09-10
description: 比例控制让温度更接近目标，却可能需要持续误差来维持补偿；积分可以记住补偿量，微分则响应变化趋势。本篇承接响应与稳定性，先分析无饱和的连续控制，再指出实际实现需要补上的部分。
---

# PID 控制

比例控制让温度更接近目标，却可能需要持续误差来维持补偿；积分可以记住补偿量，微分则响应变化趋势。本篇承接[响应与稳定性](03-response-and-stability.md)，先分析无饱和的连续控制，再指出实际实现需要补上的部分。

## P：误差变成即时动作

对热模型使用 $u=u_b+K_pe$，其中 $u_b=0.4$、$e=r-\theta$。目标40 °C、环境10 °C、参数保持基线时：

$$e_\infty=\frac{k(r-\theta_a)-P_{\max}u_b-d}{k+P_{\max}K_p}.$$

取 $d=0$、$K_p=0.04$，分子200 W，分母60 W/K，得到3.33 K。增大 $K_p$ 减小该偏差，但增加传感器噪声传到动作的幅度，也更容易触及执行器限制。

“P必然有稳态误差”并不成立。例如具有积分动态的对象可以在稳定比例闭环下跟踪阶跃而无稳态偏差。结论必须同时指定对象、输入类型、基准动作与稳定条件。

## I：把补偿存入状态

令 $z$ 直接表示积分贡献，而不是未乘增益的误差积分：

$$u_c=u_b+K_pe+z,\qquad \dot z=K_ie.$$

$K_i$ 单位为 $\mathrm{K}^{-1}\mathrm{s}^{-1}$，$z$ 与 $u$ 一样无量纲。偏差为正时，积分贡献增加；偏差回到零后，已有贡献保留，并不会归零。

稳态要求 $\dot z=0$，若 $K_i>0$ 则 $e=0$。在前述环境10 °C条件下，40 °C需要 $u=0.6$，所以积分最终保存 $z=0.2$。这依赖闭环稳定、目标可达、传感器无偏差且执行器不持续饱和。

PI 增加了一个动态状态。温控闭环特征多项式为

$$C_{\mathrm{th}}s^2+(k+P_{\max}K_p)s+P_{\max}K_i=0.$$

取 $K_p=0.04$、$K_i=0.001$，得到 $s^2+0.03s+0.0005=0$，极点 $-0.015\pm0.01658j$。现在有欠阻尼模态；它来自积分状态，不是原一阶对象自行出现了惯性。

**PID 控制 · 实验**

目标40 °C，100 s室温20→10 °C，初始积分为0。PID对测量微分，Kd=1 s/K、滤波5 s；不裁剪请求。P/I/D图不含固定基准动作0.4。


实验在100 s把环境从20降到10 °C，目标始终40 °C。切换 P、PI 与带滤波的 PID，对比温度以及 P/I/D 三项。控制请求不裁剪，并显示是否超出物理范围；这是用于看清线性机制的计算，执行器限制在[约束篇](08-constraints-and-robustness.md)处理。

## D：变化趋势需要滤波

理想并联 PID 为 $u_c=u_b+K_pe+K_i\int e\,dt+K_d\dot e$。如果目标突然跳变，$\dot e$ 包含尖锐变化，直接对误差微分会产生微分冲击。常见实现对测量微分：

$$\tau_f\dot y_f=y_m-y_f,\qquad u_D=-K_d\frac{y_m-y_f}{\tau_f}.$$

这等价于从测量到微分动作的 $-K_ds/(\tau_fs+1)$，在高频处增益有限。对测量微分与对误差微分是不同结构：目标变化时，前者不产生由目标本身引起的微分冲击。

取 $K_d=1$ s/K、$\tau_f=5$ s，若测量为38 °C、滤波状态37.5 °C，则 $u_D=-0.1$，表示温度正在上升，需要减少加热。滤波状态的初值也重要，常用初始测量初始化，避免凭空制造启动尖峰。D不预测未来外部扰动；它利用当前和历史测量中的变化信息。

## 把一轮计算完整算出来

设 $e=2$ K、$z=0.15$、上述 $u_D=-0.1$、$K_p=0.04$，则 $u_c=0.4+0.08+0.15-0.1=0.53$。若用1 s的前向积分更新，$z_{j+1}=0.15+0.001\times2\times1=0.152$。本轮动作使用更新前还是更新后的积分状态，必须在代码中约定一致；本例先计算动作，再推进状态。

不要把不同 PID 参数形式直接混用：$K_p[1+1/(T_is)+T_ds]$ 对应 $K_i=K_p/T_i$、$K_d=K_pT_d$，滤波约定还需另行核对。连续参数不能脱离采样周期直接变成离散系数。

## 调整参数时要验证什么？

先确认反馈符号、对象时间尺度和可达范围，再从 P 或 PI 开始，增加 D 应有抑制动态误差的具体理由。分别测试目标阶跃、负载阶跃、测量噪声、初值偏差和动作饱和。记录输出之外，还要记录 $u_c$、实际 $u$ 和积分状态。

经验整定规则可以提供起点，但其对象近似和试验条件必须明确。模型中的漂亮阶跃不证明真实设备在全部负载下可用；也不能通过不断增大积分来修正不可能达到的目标。

## 自检

偏差已经回到零，为什么 PI 仍输出比基准更多的功率？

<details><summary>参考思路</summary>

偏差为零使积分停止变化，而不是删除积分状态。这里$z=0.2$保留额外200 W，抵消新的热损失。

</details>

测量含高频噪声时，是否应增大 D 来让温度更稳定？

<details><summary>参考思路</summary>

不能直接推出。微分会强化快速测量变化并传入动作；应先区分真实动态与测量噪声，比较滤波、带宽和控制代价，再决定D是否有益。

</details>

## 延伸

[python-control 巡航控制示例](https://python-control.readthedocs.io/en/stable/examples/cruise-control.html)展示 PI 与限幅下的行为；[MathWorks 抗积分饱和示例](https://www.mathworks.com/help/simulink/slref/anti-windup-control-using-a-pid-controller.html)比较回算与条件积分。第08篇会独立推导并模拟热对象的饱和恢复。
