抛开数学问题,如何更好的理解PID控制算法?

您所在的位置:网站首页 自动巡航控制系统的缩写 抛开数学问题,如何更好的理解PID控制算法?

抛开数学问题,如何更好的理解PID控制算法?

2024-04-11 13:52| 来源: 网络整理| 查看: 265

PID是Proportional(比例)、Integral(积分)、Differential(微分)三者的缩写。PID调节是连续控制系统中技术最成熟、应用最广泛的调节方式。PID调节实质是根据输入的偏差值,按照比例、积分、微分的函数关系进行运算,运算结果用以控制输出。

这是书本上对PID的定义,如果没有数学基础,不懂积分、微分,其实很难理解。

PID的应用

无人机悬停、空调温控、定速巡航…

以定速巡航为例子,比如当前速度是0,现在需要用10秒钟的时间把速度提升到100,一个很烂的定速巡航系统可能出现下面的情况:

1、用2秒钟的时间把速度提升到90,剩下的8秒慢慢把速度加到100。这种方法开始推背感很强,后面却很慢,显然分配的不均匀,不合适。

2、车速逐渐增加,但是10秒钟后速度才达到70,并且保持这个速度很难再提升。这样的系统会让我们感觉车辆动力不足,也不合适。

3、用5秒钟的时间把车速提升到130,发现超速了,再刹车把速度降到80,不断的加速、刹车,最终让速度稳定在了100。顿挫感太强,容易晕车,这也不是我们想要的。

PID控制算法很好的解决了上面的三个问题。

PID参数的含义

参数P(比例系数)可以让车速「均匀」增加,比如前5秒钟把车速提升至60,中间3秒钟把车速提升至90,最后2秒钟从90慢慢增加至100。前段时间提升快点,当接近目标的时候,提升的稍微慢点。即提高系统的响应速度。

参数I(积分系数)用来解决第二个问题,让最终的车速达到100。即消除静态误差。

参数D(微分系数)解决了车速不稳定的问题,让车速「稳步」上升,而不是不断的提速、刹车。即克服震荡。

算法中最难的部分就是对三个参数的调整,最终达到系统响应速度、静态误差、震荡的平衡。

代码实现

通过代码来进一步理解PID参数的含义。

PID算法中需要记录三个数值:偏差值、上一次的偏差值、所有偏差值的和。

我们用结构体来表示:

struct _pid{ float err; //定义偏差值 float err_last; //定义上一个偏差值 float integral; //定义所有偏差值的和 };

下面直接贴上PID算法实现定速巡航的代码,通过调整三个参数来更好的理解PID的含义。其中,SpeedLevel表示速度的等级,可以理解成PWM的占空比,SpeedLevel越大,实际的车速也就越大;目标速度设定为50,初速度为0;通过20次调整,让车辆达到目标速度值。

#include struct _pid{ float err; //定义偏差值 float err_last; //定义上一个偏差值 float integral; //定义所有偏差值的和 }pid; float SetSpeed = 50; //目标速度 float ActualSpeed = 0; float SpeedLevel = 0; /*算法的核心就是调整三个参数来达到系统的平衡*/ float Kp = 0.005; //比例系数 提升的速度 float Ki = 0.05; //积分系数 稳定值 float Kd = 0.01; //微分系数 震荡 void PID_init() { pid.err = 0.0; pid.err_last = 0.0; pid.integral = 0.0; } void PID_realize() { pid.err = SetSpeed - ActualSpeed; pid.integral += pid.err; /*PID算法的核心公式*/ SpeedLevel = Kp * pid.err + Ki * pid.integral + Kd * (pid.err - pid.err_last); pid.err_last = pid.err; ActualSpeed = SpeedLevel * 5; } int main() { printf("System begin \n"); PID_init(); int count = 0; while(count


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3