从控制学的基础讲解PID算法

PID算法网上不少,往往都是基于数学模型,在实际中导致使用难的问题,而数学模型属于理想的,没有深入本质讲解,本文从控制学的基础讲解。

我们看一个生活例子,冬天洗热水澡,需要先放掉一段时间的冷水,因为水管里有一段冷水,热水器也需要一个加热过程,等过了这段时间之后水温有些接近目标值后,开始调节水龙头来调节冷、热水之间的比例及出水量,之后再慢慢的微调,在洗浴过程中感觉温度不合适,再一点点的调节。这个过程,其实就是PID算法过程。我们之所以微调,是因为水温的变化速度与我调节的速度不相匹配,存在一个滞后效应,我们需要调节一点点,等一下再感觉一下温度,不够再条件一点点,再感觉,这个过程就叫PID算法,也可以说,滞后效应是引入PID的原因。

失去的能否找回来?能、只是我找回了纽扣,却发现衣服已经不再了。这个就是滞后效应。

负反馈系统,都有滞后效应,但为什么运放、电源这类的却从来不提PID算法呢?这是因为这类系统的滞后延时时间非常短,若考虑这个延时,负反馈引入180度相位,延时恰好引入180度相位,则完全可能引起振荡。问题在于这个延时时间足够短,它的谐振频率点比较高,以运放为例,加入延时加上负反馈引起的谐振点为10MHz,但这颗运放的频率响应是1MHz,则在10MHz下完全不可能导致振荡,因为这个芯片的频响特性只有1MHz。我们常用的线性电源IC,比如SOT23封装的LDO,假如输出不加电容,就会输出一个振荡的波形,相对来说电源IC的滞后效应比运放要大,但是,因为电源一般后面都要接大电容的,它的频响特性很低,接近直流0Hz,所以当有电容时候,就无法振荡了。

而工业控制领域,比如温度等,都是滞后效应很严重的,往往都是mS,甚至是10mS级别的,若直接用负反馈,因为激励与反馈的不同步,必然导致强烈的振荡,所以为了解决这个问题,我们需要引入PID算法,来实现这类滞后效应严重系统的负反馈控制,我们以高频感应加热设备加热工件,从常温25度加热到700度为例做说明:

1、25~600度,100%的全功率加热工件,这是因为温差太大,前期要全功率,先加热到靠近目标温度。之所以考虑在600度,是因为滞后效应,若设定太高,当发现接近700度再停下来,但实际上,温度会冲过700度。当然,600度是一个经验值,以下几个温度点都是经验值,根据实际情况而来。

2、600以上,开启P算法,P就是根据测量值与目标值的误差来决定负反馈的大小。P算法公式:反馈 = P * (当前温度-目标温度)。但因为负反馈是基于存在误差为前提的,所以P算法导致一个问题,永远到不了想要的值:700度。因为到了700度,反馈值就没有了。P算法的开启,进一步逼近了目标温度,假设稳态下可以达到650度,这样就算因为滞后效应导致的延时,也不会超过700度太多。

3、当达到P算法的稳态极限650度附近的时候,比如640度,就应该开启另外一个算法解决P算法引起的极限误差,那就是I算法。I算法就是为了消除这个P算法导致的误差值,毕竟我们想要的是700度,而不是650度。I算法,本质上讲就是获取一个700度下对应的一个驱动值,之后用这个驱动值来取代P算法,那么我们怎么得到这个驱动值呢,唯一的手段就是把之前的误差都累加起来,最后得到一个期望值,这个期望值就是我们想要的驱动值。因为只要与目标值存在误差,那么把这些误差值积累起来再去反馈控制,就能一步步的逼近目标值,这如同水温不够高,再加一点点热水,不够高再加,这样总能达到想要的水温。值得注意的是,I算法不能接入太高,必须要在P算法的后期介入,不然很容易积累过大。这个时候可以引入一个误差门限,比如误差为60,当作6来处理,误差为50,当作5来处理,消除大的误差值,具体根据项目情况决定。

4、当I算法把工件温度加热到很接近目标温度后,那么可以调节的范围就很小了,最后一点点的微动,让调节的每一次的变化,不要太大,这就是D算法。D算法本质上讲就是反对剧烈的变化,所以适用于达到目标温度的时候。

PID算法其实不复杂,但从目前看,很多人都是因为对这三者的使用条件不了解导致的问题,都是从加热一开始,三个要素都上,结果可想而知。P算法是温度接近目标值的时候用,I算法是在P算法到稳态极限的时候用,D算法是达到目标值附近的时候用。实际项目中,D算法一般不用,效果不大。假如非要找一个现实中对应的实物,那么以开关电源为例,TL431基准电源比较器可以认为是P,输出滤波电容C是I,输出滤波电感是D,两者完全等价。它们各自的应用工作点可以认为:假设目标温度700度,600~800度:P算法;640~760度:I算法;690~710度:D算法。具体值,以实验为准,数据仅供参考。

最后给出一个PID最通俗的解读:我们设计一样东西,一般都是先打个样,这个样跟我们想要的接近,但细节没到位,这就是P,样有差异,所以就要修改,这就是I,到了定稿,就不允许随便修改了,就算要修改,也是有限制的修改,这就是D。