说到为PID举个形象的例子那就是调节洗澡水温,这个例子非常形象:
Kp(比例项):就像用手试水温,当前水温与理想水温差距越大,我们拧动水龙头的幅度就越大;差距越小,调整幅度就越小。
Ki(积分项):当P调节一段时间后,发现水温还是差那么一点点,于是继续微调水龙头。这个"差一点点"的感觉会随时间累积,所以叫积分项。
Kd(微分项):观察水温变化的速度,如果发现水温上升太快,就提前减小热水(防止烫到);下降太快就提前增加热水(防止变凉)。这个"预测变化"的能力就是微分。
PID视频可以参考 https://www.bilibili.com/video/BV1xQ4y1T7yv。
一、PID 控制器基本公式PID 的核心控制公式为:
u(t):控制器输出
e(t)= r(t)- y(t):设定值与实际输出的误差
Kp: 比例增益
Ki:积分增益
Kd:微分增益
三个组成部分的意义:
也可结合上述水温调节的例子做比较。
二、使用环境与适用场景PID 控制器广泛应用于:
电机速度控制(如智能小车、无人机)
温度控制(如热水器、恒温箱)
位置控制(如舵机、机械臂)
流量/压力/液位控制(如工业管控系统)
使用关键点:要实现对某个物理量的闭环控制,必须具备:
目标值设定(你希望它达到什么状态)
反馈量采集(通过传感器测量当前状态)
执行器输出控制(调整控制量,如PWM占空比、电压等)
举个例子:如果你要控制一个电机的转速,就需要:
设置目标转速(如:2000转/分钟)
通过编码器等传感器检测实际转速
用 PID 算法计算 PWM 输出调整电压,以靠近目标转速
三、PID 控制结果与 PWM 的关系在实际嵌入式系统中,PID 的输出值通常会作为 PWM 占空比的控制值。理解这一点的关键是:
你要控制的对象(如电机),是通过 PWM 信号来驱动的
你设置的目标值(如目标速度)本质上应该与 PWM 对应的计数值一致
反馈量(比如测速编码器输出)也应该被转换为同样单位的计数值
因此:目标值、实际值、PID输出值,三者应当有统一的定义域(如PWM计数值)
示例逻辑:
// 目标速度(对应PWM计数值)
int target = 500;
// 实际速度(从编码器读取后换算为PWM计数值)
int actual = read_encoder_count();
// 计算偏差
int error = target - actual;
// 传入 PID 控制器,输出 PWM 控制值
int pwm_value = pid_controller(error);
set_pwm(pwm_value);
在实际单片机中,我们需要把连续的PID公式转换为离散形式:
// 伪代码示例
error = target - actual; // 当前误差
integral += error * delta_time; // 误差积分
derivative = (error - last_error) / delta_time; // 误差微分
output = Kp*error + Ki*integral + Kd*derivative; // PID输出
last_error = error; // 保存本次误差
四、增益参数的调节建议
PID 控制器的性能很大程度上取决于参数 Kp、Ki、Kd 的设置,实际使用中常用以下调参方式:
先调 P:P 太小控制太慢,太大系统会震荡
再加 I:用于消除稳态误差,I 太大会累积过快导致超调
最后加 D:用于抵消误差快速变化时的影响,太大会过度抑制系统动态