本文旨在用通俗的语言帮助各位读者理解PID算法,以及附加实验的局部代码,以便于帮助理解PID算法的同时并快速运用。本文图片素材大量参考B站江科大STM32的PID教程,详细的代码不予以列出,大家可自行搜索观看。

一、什么是PID,PID是干什么的

1、PID的概念详细解释

开环与闭环概念

在解释PID我们先来了解一下开环闭环的概念。

开环:控制器单向输出值给被控对象,不获取被控对象的反馈,控制器对被控对象的执行状态不清楚。        我们这么来理解,我们把目标值当成我们需要被控对象运行的目标功率,控制器当成一个输出功率的器件,输出的功率需要被输送给被控对象,如果在没有外界干扰的情况下运行,被控对象就会按照目标值所要求的情况进行工作,然而,现实世界无时不刻存在着各种干扰因素,导致我们被控对象总是有很多偏差。

        为了引出闭环控制的概念,我们来举一个例子来看,一条传送带上在运送着货物,入货口是有一个人在控制着传送带的速度,出货口有个人在搬运货物,我们需要搬运货物装车的速度是一定的,当传送带上的货物很多的时候,出货口的人就要向入货口的人传达信息,让他将机器调慢一点;同样的,当传送带上的货物很少的时候,出货口的人需要向入货口的人传达信息,让他将机器速度调快一点,但是不管调快调慢,出货口搬运货物装车的速度都是一样的。我们把输出反馈到到输入的信息反馈的控制方式叫做闭环控制。概念如下。

 闭环:控制器输出值给被控对象,同时获取被控对象的反馈,控制器知道被控对象的执行状态,可以根据反馈修改输出值以优化控制。

PID简介

        PID是比例、积分、微分的缩写。PID是一种闭环控制算法,它动态改变施加到被控对象的输出值(Out),使得被控对象某一物理量的实际值(Actual),能够快速、准确、稳定地跟踪到指定的目标值。(补充知识点,稳、准、快是自动控制原理里面分析和评判一个系统的重要指标)

        PID是一种基于误差(Error)调控的算法,其中规定:误差=目标值-实际值

               error(t) = target(t) - actual(t)  

        PID的任务是使得误差始终为0(引用上面的例子,就是要让我们的传送带传送货物的速度始终能够符合我们一开始要求的装车的速度)。

        PID算法的特点对被控制对象模型要求低,无需建模,即使被控对象内部运作规律不明确,PID也能进行调控。(上面例子,我们不需要管传送带的长度以及传送带上每分钟承载的货物数量,我们只需要关注出口装车的反馈,来在出口处进行传送带速度的控制)

PID算法的调控原理

定义误差:

error(t) = target(t) - actual(t)        (1)

PID输出值(原版):

out(t)=K_{p}(errot(t)+\frac{1}{T_{i}}\int_{0}^{t}error(t)dt+T_{d} \frac{derror(t)}{dt})        (2)

PID输出值(变式1,最重要):

out(t)=K_{p}errot(t)+K_{i}\int_{0}^{t}error(t)dt+K_{d} \frac{derror(t)}{dt}        (3)

仔细观察PID输出的两个式子:

(2)中的K_{p}T_{i}T_{d}分别叫做比例系数、积分时间常数、微分时间系数。

(3)中K_{p}K_{i}K_{d}分别叫做比例系数、积分系数、微分系数。

        不管是用(2)还是用(3),我们都需要不断去调整这三个参数的值,使得(1)能够符合PID的最终使命error=0。

        但是为什么提了(2)还要提出(3)这种形式呢。我们在进行PID控制的时候是需要预先设定好三个参数,这三个参数是需要不断调整的。在(2)中K_{p}同时影响着比例、积分、微分三个环节,非常不利于我们将模型调整到一个适合的位置,通常一个参数的改变可能另外两个参数又要调整,这是非常影响效率和心态的。所以引入了(3),它的优点相对于(2)是非常明显的,每个参数单独控制着一个环节的大小,单独环节鼓励并且不由其他环节影响,相较于(2)调整起来非常方便。我们在工业控制中,一般只用(3)来建模,以下是PID控制对应(3)的系统框图。

我们把每个环节孤立之后,就可以单独把他们拿出来分析了。

稳态误差(error)

        在开始PID各个环节的分析前,我们先来了解一个概念:稳态误差error

        接着上面的例子,我们把一个系统比作一条流水线,在流水线的运行过程中,我们在启动时候传送带会一直加速,过一段时间后它达到一个稳定的速度值,这个稳定的速度值和我们一开始预设的速度会存在一个差值,我们把系统稳定时候输出值和预设的输出值之间的差值的绝对值,叫做这个系统的稳态误差。(在系统没有稳定前,也就是传送带还在加速或减速的过程中,误差的变化是动态变化的,也叫动态误差,后面我们在PID独立环节的介绍中会对动态性能进行解释)

        下面内容我们来讲讲各个环节是怎么来处理稳态误差的。

比例环节(P)

        假设我们将K_{i}K_{d}都设置成0,那么我们得到是一个只有比例环节的系统输出,公式如下。

        ​​​​out(t)=K_{p}*error(t)                (4)

公式含义:从公式不难看出,比例项的输出值out仅仅取决于当前时刻的误差,与历史时刻无关。当前存在误差的时候,比例项输出一个与误差成正比的值,如果不存在误差时,比例项输出为0。

Kp越大,比例项的权重越大,系统响应就越快,但是超调也会随之增加(补充知识超调的含义:系统输出的最大值-系统稳定时的输出值的差值再比上系统稳定输出值的百分比,超调量是衡量一个系统是否稳定的重要指标,理论上越大系统越不稳定)。

纯比例项控制系统时,系统一般会存在稳态误差,Kp越大,稳态误差越小,但不会真正为0。

以下是纯比例项下的输出曲线(蓝色)以及目标值(红色),可以直观得出以上结论(参考江科大ppt资料)。

纯比例控制(图片来源于江科大)

        比例环节对误差的影响:

        我们来从公式上看,纯比例控制时,若误差为0,则比例项结果也为0,被控对象的输入就变成0了,但是由于外界环境的影响,一般系统会自发向一个方向偏移,偏移后的输出值和输入之间的差值又产生一个误差。产生非0误差后,比例项负反馈又会调控输出,我们分两种情况下来看:

1、当调控输出力度过大或者恰好能使系统按照目标值来运作,那么下一刻的误差又为0了,系统又会被外界的干扰影响而偏离目标值,以此往复循环,系统震荡或者直接偏离轨道,系统不能稳定输出,造成系统的不稳定,没有稳态误差。

2、当调控输出力度和自发偏移力度相同时,输入和输出存在一个稳定的差值使得系统的调控力度和自然偏移抵消,系统达到稳定,这个时候的有稳态误差。

这两种情况的取决于Kp的大小,不同系统会不同,同一系统在不同外界环境下也可能不同。

判断稳态误差的产生:给被空对象输入0,判断被控对象会不会发生自发偏移。

判断稳态误差的方向:给被控对象输入0,自发偏移方向即为稳态误差方向。

积分环节(I)

        含有比例项和积分项的PID输出值:

        out(t)=K_{p}*error(t)+K_{i}*\int_{0}^{t}error(t)dt        (5)

        这里注意,我们在实际调节PID的过程中是不能忽略比例P环节的,所以我们说的积分环节以及后面说的微分环节严格意义上说是PIPD环节作用下的输出表达式!这就是思维定式,记住就好。

       公式含义: 积分项的输出值取决于 0~t 所有时刻误差的积分,积分项的值和历史时刻有关(参考积分的概念)。积分项将0时刻开始所有的误差累加起来,乘上积分项系数 K_{i} 后作为积分项输出的值。

        这样有什么好处呢,从之前我们分析纯比例环节来看,我们在系统稳定的前提下使用比例环节下的 out(\infty ) 始终会和目标值 target 存在一个稳态误差,可能大也可能小。如果我们在这个基础上加入了一个积分环节,那么积分项会随着时间的推移将误差累积起来,只要误差error(t)一直存在,我们的积分项就会一直增加,这样我们的out(\infty )就会一直增加,直到我们我们的error(t)随时间变化越来越小直到接近0或者为0。这样,如果我们的比例项在稳定的情况下仍然与目标值之间相差一定的距离,我们可以考虑加入积分项。

PI环节控制

        通过以上公式的解释和实际调节过程中的图我们来讲一下积分环节对系统稳态误差的影响:

积分项可以用来补上纯比例环节产生的稳态误差,倘若系统的误差存在,则积分项就会不断累积误差,直到控制器件产生相应动作让稳态误差消失。我们看图K_{i}越大,系统(蓝线)达到目标值(红线)的时间就越短,但是超过一定值的时候,过于灵敏的积分环节会瞬间产生一个很大的弥补值,造成超调(最后一张图片的尖峰部分)。所以说我们在调到一个相对平稳的值的时候,系统达到目标的时间是具有一定的滞后性的,这也是它的弊端,所以我们在接下来会引入微分环节解决它这个问题。

微分环节(D)

        我们在积分环节添加上微分项。

out(t)=K_{p}*error(t)+K_{i}*\int_{0}^{t}error(t)dt+K_{d}*\frac{derror(t)}{dt}        (6)

        就变成我们完全体的PID公式了。同样我们现在公式上面分析它。

        公式含义:由微分的定义我们可以知道,微分项的输出值取决于当前时刻误差变化的斜率,与当前时刻误差函数的斜率有关,当斜率的变化很快时,微分项的也就是这个倒数项也很大,我们拿某一时刻进行分析:

                我们来看一组函数图像,通过这两幅图像来看我们微分项对out走势的影响。当实际值out到比目标值target小的时候,如果实际值一直在上升,当上升速度变快,这是的误差变化的斜率是越来越小的,微分项输出的是负值;当实际值out比目标值target大的时候,如果实际值一直在减小,当减小速度快的时候,其实它的误差变化曲线的斜率是增加的正值。当我们把这两种情况产生的值叠加到输出公式中,我们不难发现,微分项会负反馈输出相反的作用力,当误差变化剧烈的时候,这种反向作用力越明显,阻碍误差的急剧变化,而且这个力它不跟误差的数值有关,只跟误差的变化剧烈与否有关。

        斜率一定程度上反应了误差未来的变化趋势,这使得微分项拥有了提前调控的特性,当我们的输出变化一变快,我们赶快添加这种反作用力,预防系统后面因为变化过快而失控。微分项给系统增加阻尼,可以有效防止系统超调,尤其是惯性比较大的系统,K_{d}越大,微分项权重越大,系统阻尼就越大,这种过大的阻尼容易使得输出值out变化缓慢,系统卡顿现象也会随之增加。

微分项对系统超调量的影响

        最终我们把连续形式PID所有环节拆解并解释清楚了:

out(t)=K_{p}errot(t)+K_{i}\int_{0}^{t}error(t)dt+K_{d} \frac{derror(t)}{dt}        (7)

        由于篇幅过长容易造成知识点的不集中,讲清楚了PID的概念,下一章我会详细讲一下怎么把我们的理论知识运用到实践中去的。

更多推荐