承接上文浅谈控制原理和PID,继续写一写不同PID的变种。
不同的PID控制器
在上篇中所介绍的PID控制器均为并行式的,是一种标准形式:
实际上PID的变体有很多,笔者根据不同使用场景对这些控制器进行分析。
1、离散化以及增量式PID控制器
先列举连续系统下的标准PID形式,其中U为控制器的输入,E为每次输入的误差:
但电子设备中的信号都是数字离散的,因此在大多场景中需要使用离散化的控制器来操作,将上述式子转化为离散域的形式,该表达式又被称为位置式PID算法:
有时我们不关心控制器当前的输入,只关注控制器的输入增量(如驱动步进电机),可以转换思路,对控制器输入进行差分:
即:
这样就可以设计如下的增量式PID控制器:
以上两种不同形态的PID本质上是等价的,在实际应用中依据便利性选择不同的控制器:
注意在仿真离散控制器时,最好使用定步长解析器,并根据实际工况确定步长(一般可以选择步长0.01s以上,即100Hz内),这样在进行差分时数据才会有明显变化,更方便调试,也更符合实际场景。
2、抗饱和的PID控制器
我们知道,引入积分环节的目的主要在于消除稳态误差,提高控制精度。但在系统调节之初,由于与预期偏差过大,很容易造成积分的过量累计,导致系统响应的超调,甚至震荡。以及系统在工作稳定后受到干扰影响,微分环节输出过大也会导致小范围的波动。这都要求我们对控制器的输入进行限制,特别是对积分环节进行削弱或分离。
首先登场的便是积分分离算法,该算法仅当偏差值error进入某个范围内时,才开始进行累加,即:
如下面系统中上半部分所示:
引入积分分离后,可以尽可能的增大积分系数,并减少超调,且做到响应速度近似:
积分分离可以继续引申为变速积分算法,偏差越小,积分系数越大;偏差越大,积分系数越小,即:
(变速积分算法的效果相当于积分分离算法的优化,在此不做建模演示)
进行仅仅对积分系数进行调控,无法完全避免输入长时间饱和的情况,设想一个系统的输入处于饱和状态,物理阀门开度不可能继续增大,但此时控制器的输出还可能继续增大,一旦系统出现反向偏差,由于控制器无法及时退出饱和区,在这段时间内执行机构仍处于极限位置,难以做出调整(失控)。因此需要对控制器的输出进行限制,当输出达到设定阈值,便不再累加正偏差,只累计负偏差;当输出小于设定阈值,正常工作。该算法又被称为积分饱和算法。
上图举例的便是一种动态钳位的方案,对控制器的输出进行限幅,并将多余的输出从积分环节扣除,以减少积分在初始上升阶段的大量累计,同时能对系统的负偏差动作及时做出反馈。
3、抗干扰的PID控制器
干扰通常来源于环境中的白噪声,电路内的热噪声,呈现出高频无规律的特性,在这样的工况下,控制器的输入也会呈现出跟随性,导致系统的波动。一种简单的做法是加入一个低通滤波器,过滤掉这些干扰。但滤波器加入的位置需要根据不同系统的特点进行修改,对噪声敏感的系统环节可以优先进行滤波处理。
在PID中,对噪声敏感的主要是微分环节,该环节可能会无限放大偏差的波动,导致控制器输出的不稳定,针对这一环节,可以采用不完全微分的方式,加入一节惯性环节(低通滤波器),针对性地减少噪声干扰。
下图是两种低通滤波方式的结果对比:
有时,干扰可能会出现在输入端,导致参考值频繁跳动,直接对偏差进行微分可能会导致系统震荡。此时可以对系统的输出反馈进行微分,又称为微分先行算法,其本质上和直接对稳定参考值进行微分一致,但可以避免参考值频繁变化带来的微分波动。
4、万金油:模糊PID
在进行了对不同控制器的详细分析后,我们很自然地会产生这么一种想法,如果PID的三种作用能够独立控制,在特定的阶段使用专门的工具进行调控,是不是既方便又放心。
于是,根据PID控制器自身的特点,可以最终引申出模糊PID的概念。我们需要先了解响应曲线的不同阶段:
(1)动态调节阶段,该阶段又可以分为两个环节:
①响应的上升环节,反应了系统的响应速度,通常处于输出值在0%至90%的这段时间内;
②消除稳态误差的环节,可能会发生超调和震荡;
(2)静态阶段,在系统逐渐平稳后,需要抵抗干扰,减少波动。
然后明确三个环节的意义:比例环节加快响应速度,减小稳态误差,但过度会带来超调;积分环节消除稳态误差,但会使调节滞后;微分环节可以减少系统震荡,抑制系统的变化,但抗干扰性能差,且会使系统变得迟钝。将这三个环节对应到上面的响应阶段中,就很容易一一对应:
- 上升环节主要利用比例环节进行调控,可以快速响应系统变化;
- 消除稳态误差环节主要利用积分环节进行调控,同时辅以少量比例环节,快速进入稳态的同时消除误差。此时可能存在超调现象,因此微分环节也要加入;
- 平稳后只保留比例和积分环节来控制稳态,减少干扰带来的影响;
有了以上的分析,就可以总结出模糊策略。我们通常说的“模糊”,本质就是将误差和误差的增量划分为不同区间,在每一个区间上,比例、积分、微分都有不同的系数,实现对系统的“近似精准”控制(不同系统还是要做出区分)。关于这一节的内容和经验,之后有时间再继续分享。