如何用单片机实现PID控制算法

作者:cambrain     发布时间:2025-09-11     点击数:0    

说到为PID举个形象的例子那就是调节洗澡水温,这个例子非常形象:

Kp(比例项):就像用手试水温,当前水温与理想水温差距越大,我们拧动水龙头的幅度就越大;差距越小,调整幅度就越小。

Ki(积分项):当P调节一段时间后,发现水温还是差那么一点点,于是继续微调水龙头。这个"差一点点"的感觉会随时间累积,所以叫积分项。

Kd(微分项):观察水温变化的速度,如果发现水温上升太快,就提前减小热水(防止烫到);下降太快就提前增加热水(防止变凉)。这个"预测变化"的能力就是微分。

PID视频可以参考 https://www.bilibili.com/video/BV1xQ4y1T7yv。


一、PID 控制器基本公式PID 的核心控制公式为:

image.png

u(t):控制器输出

e(t)= r(t)- y(t):设定值与实际输出的误差

Kp: 比例增益

Ki:积分增益

Kd:微分增益


三个组成部分的意义:

image.png

也可结合上述水温调节的例子做比较。


二、使用环境与适用场景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:用于抵消误差快速变化时的影响,太大会过度抑制系统动态