# PID算法详解:从控制原理到STM32工程实现,彻底搞懂P、I、D三部分作用

前言
在工业自动化领域,有一个算法几乎无处不在:
- 温度控制
- 电机调速
- 伺服位置控制
- 压力控制
- 流量控制
- 机器人运动控制
- 无人机姿态控制
这个算法就是:
PID控制算法(Proportional Integral Derivative Controller)
很多初学者第一次接触PID时,会看到这样的公式:
[
u(t)=K_p e(t)+K_i\int e(t)dt+K_d\frac{de(t)}{dt}
]
然后感觉非常复杂。
实际上,PID的核心思想非常简单:
根据目标值和实际值之间的误差,不断调整控制输出,让系统越来越接近目标。
本文将从控制思想、数学公式、P/I/D作用、参数调节方法以及STM32工程实现几个方面,详细介绍PID算法。
一、什么是PID控制?
1. PID解决的问题
任何控制系统都有三个基本元素:
目标值(Setpoint)
也叫设定值。
例如:
温度控制:
目标温度 = 60℃
电机控制:
目标转速 = 3000rpm
位置控制:
目标位置 = 50mm
实际值(Feedback)
通过传感器测量当前状态。
例如:
温度传感器检测:
当前温度 = 55℃
编码器检测:
当前速度 = 2800rpm
误差(Error)
PID最核心的变量:
[
e(t)=r(t)-y(t)
]
其中:
- r(t):目标值
- y(t):实际值
- e(t):误差
例如:
目标温度:
60℃
实际温度:
55℃
那么:
[
e(t)=60-55=5℃
]
PID就是根据这个误差计算控制输出。
二、PID闭环控制结构
一个完整的PID控制系统如下:
目标值
|
↓
+---------+
| 比较器 |
+---------+
|
误差e(t)
|
↓
+---------+
| PID控制 |
+---------+
|
控制输出u(t)
|
↓
被控对象
|
↓
传感器
|
└────反馈
例如温度控制:
目标温度60℃
|
↓
PID
|
↓
调节加热功率
|
↓
加热器
|
↓
温度传感器反馈
如果:
当前温度低
误差大:
PID增加输出
加热功率提高。
如果:
温度接近目标
误差变小:
PID降低输出
最终达到稳定状态。
三、PID控制公式详解
标准PID公式:
[
u(t)=K_p e(t)+K_i\int e(t)dt+K_d\frac{de(t)}{dt}
]
其中:
| 参数 | 名称 | 作用 |
|---|---|---|
| Kp | 比例系数 | 看当前误差 |
| Ki | 积分系数 | 看过去误差 |
| Kd | 微分系数 | 预测未来趋势 |
简单记忆:
P:现在
I:过去
D:未来
四、P比例控制详解
1. P控制公式
比例输出:
[
u_p=K_p e(t)
]
意思:
当前误差越大,输出作用越强。
例如:
目标速度:
3000rpm
当前速度:
2000rpm
误差:
1000rpm
PID计算:
输出增加
如果当前速度:
2900rpm
误差:
100rpm
输出调整变小。
2. Kp大小影响
Kp太小
表现:
- 响应速度慢
- 达到目标时间长
- 控制不明显
例如:
温度控制:
加热功率太小
温度慢慢升高。
Kp太大
表现:
- 响应很快
- 超调明显
- 容易振荡
例如:
目标:
60℃
实际:
快速冲到75℃
然后下降、振荡。
P控制的问题
单纯使用P控制:
无法完全消除稳态误差。
例如:
目标:
1000rpm
最终:
950rpm
系统已经稳定,但是仍然存在:
50rpm误差
这个误差称为:
稳态误差
因此需要积分控制。
五、I积分控制详解
1. 积分控制公式
[
u_i=K_i\int e(t)dt
]
积分的含义:
把过去所有误差累积起来。
例如:
系统一直差5℃:
第一次:
误差5℃
第二秒:
误差5℃
第三秒:
误差5℃
积分不断增加:
5+5+5+...
最终增加控制输出。
2. I控制解决什么问题?
主要解决:
稳态误差
例如:
只有P:
目标60℃
实际58℃
永远差2℃。
加入I:
PID发现:
长期存在2℃误差
不断增加输出。
最终:
实际≈60℃
3. Ki大小影响
Ki太小
表现:
- 消除误差慢
- 响应时间长
Ki太大
表现:
- 积分累积过快
- 超调增加
- 恢复时间变长
严重时会出现:
积分饱和(Integral Windup)
六、什么是积分饱和?
假设:
目标温度:
100℃
但是加热器最大功率:
100%
当前温度:
50℃
误差很大。
PID一直计算:
增加输出
但是:
执行器已经:
100%
无法继续增加。
此时积分仍然累积:
越来越大
当温度接近目标:
积分还保持很大输出。
结果:
温度超过目标
产生严重超调。
工程中通常采用:
- 积分限幅
- 抗饱和算法
- 条件积分
七、D微分控制详解
1. 微分控制公式
[
u_d=K_d\frac{de(t)}{dt}
]
微分关注:
误差变化速度。
简单理解:
不是看现在误差多大,而是看:
误差变化得有多快
例如:
目标:
100℃
当前:
90℃
看起来误差:
10℃
但是如果温度正在快速上升:
每秒增加5℃
PID预测:
马上可能超过目标。
于是提前降低输出。
这就是D作用。
八、D控制的作用
主要作用:
- 减少超调
- 抑制振荡
- 提高稳定性
例如:
没有D:
100℃
目标
升到120℃
下降
继续振荡
加入D:
快速接近
平稳停止
九、D参数调节注意
Kd太小:
减振效果不明显
Kd太大:
对噪声敏感
输出抖动
因为微分放大变化。
如果传感器:
温度波动±0.5℃
D可能认为:
系统变化剧烈。
所以工程中D通常需要:
- 滤波
- 限幅
- 合理采样周期
十、P、I、D组合起来如何理解?
完整公式:
[
u(t)=K_pe(t)+K_i\int e(t)dt+K_d\frac{de(t)}{dt}
]
三个部分作用:
| 部分 | 解决问题 |
|---|---|
| P | 提高响应速度 |
| I | 消除稳态误差 |
| D | 减少超调,提高稳定性 |
记忆口诀:
P让系统快
I让系统准
D让系统稳
十一、PID参数如何调节?
工程中最常用方法:
第一步:调整Kp
先:
Ki=0
Kd=0
逐渐增加Kp。
观察:
- 响应速度
- 是否振荡
- 是否超调
直到:
响应较快。
第二步:增加Ki
慢慢增加Ki。
目的:
消除稳态误差。
观察:
- 是否出现超调
- 是否恢复变慢
第三步:增加Kd
适当增加Kd。
目的:
减少:
- 超调
- 振荡
第四步:循环优化
根据实际波形调整。
十二、PID调参现象快速判断
| 现象 | 调整 |
|---|---|
| 响应慢 | 增加Kp |
| 一直有误差 | 增加Ki |
| 超调严重 | 减小Kp或增加Kd |
| 振荡明显 | 减小Kp,增加Kd |
| 输出抖动 | 减小Kd,加强滤波 |
十三、PID在STM32中的实现
实际嵌入式项目中,PID通常运行在定时任务中。
例如:
采样周期:
10ms
每10ms执行一次:
读取传感器
↓
计算误差
↓
PID计算
↓
输出PWM
流程:
ADC读取温度
↓
PID计算
↓
调整PWM占空比
↓
控制MOS管
↓
调节加热功率
十四、STM32 PID代码示例
定义PID结构体:
typedef struct
{
float target;
float feedback;
float error;
float last_error;
float integral;
float kp;
float ki;
float kd;
float output;
}PID_TypeDef;
PID计算函数:
float PID_Calculate(PID_TypeDef *pid,float feedback)
{
pid->feedback = feedback;
pid->error =
pid->target - pid->feedback;
pid->integral += pid->error;
float derivative =
pid->error - pid->last_error;
pid->output =
pid->kp * pid->error
+
pid->ki * pid->integral
+
pid->kd * derivative;
pid->last_error =
pid->error;
return pid->output;
}
十五、PID实际应用场景
1. 温度控制
例如:
- 烤箱
- 恒温箱
- 锅炉
- 空调
控制变量:
PWM加热功率
2. 电机速度控制
例如:
- 风机
- 水泵
- 机器人
反馈:
编码器速度
输出:
PWM占空比
3. 位置控制
例如:
- 机械臂
- CNC机床
- 舵机
反馈:
编码器位置
输出:
电机驱动力
十六、PID工程中还需要注意什么?
实际项目中,除了调参数,还需要考虑:
1. 采样周期
采样太慢:
系统反应迟钝
采样太快:
噪声增加
2. 输出限幅
例如:
PWM:
0%~100%
必须限制:
不能超过范围
3. 传感器滤波
避免:
- 高频噪声
- 测量抖动
4. 系统延迟
例如:
加热系统:
加热→温度变化
需要时间
如果忽略延迟:
容易产生振荡。
十七、总结
PID虽然公式复杂,但核心思想非常简单:
计算误差
↓
P快速纠正当前错误
I消除长期偏差
D预测变化趋势
↓
调整输出
↓
让系统稳定达到目标
一句话总结:
P负责速度,I负责精度,D负责稳定。
在STM32、PLC、变频器、电机控制、温控系统以及工业自动化设备中,PID仍然是最经典、应用最广泛的控制算法之一。
更多推荐


所有评论(0)