在这里插入图片描述

前言

在工业自动化领域,有一个算法几乎无处不在:

  • 温度控制
  • 电机调速
  • 伺服位置控制
  • 压力控制
  • 流量控制
  • 机器人运动控制
  • 无人机姿态控制

这个算法就是:

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仍然是最经典、应用最广泛的控制算法之一。


Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐