分析常规PID控制算法与积分分离PID算法,积分分离pid控制仿真实验
在上一篇文章中,我们已经描述了PID控制器的实现,包括位置PID控制器和增量PID控制器。但这个实现只是最基本的一个,没有考虑任何干扰。在本节和随后的一些章节中,我们将讨论经典PID控制器的优化和改进。在这一节中,我们首先讨论积分项的积分分离优化算法。
1.基本思想
我们已经描述过积分PID控制主要用于消除静态误差和提高控制精度。但当过程开始、结束或大幅度增减设定值时,系统的输出在短时间内有较大偏差,会引起PID运算的积分积累,引起超调或振荡。为了解决这种干扰,人们引入了积分分离的思想。思路是在偏差值较大时取消积分功能,以免增加超调量;当偏差值较小时,引入积分函数消除静态误差,提高控制精度。
具体实施步骤是:根据实际情况,设置一个阈值;当偏差大于阈值时,消去积分只受PD控制;当偏差小于或等于阈值时,采用PID控制引入积分。控制算法可以表示为:
称为积分开关系数,其取值范围为:
从上面的表达式和公式可以知道,积分分离算法的效果实际上与值的选取密切相关,所以值的选取实际上是一个难以实现的点。如果值太大,就达不到积分分离的效果,而如果值太小,就很难进入积分区域。值的选取有很大的主观因素。
对于经典的增量式PID算法,似乎没有办法从上面的公式推导出来,因为随err(k)的变化并不是在修改控制器的表达式。其实我们可以换个角度考虑。每次系统调整未定,偏差应该为零,然后只有设定值发生变化,系统才会做出反应,开始调整。设定值的变化实际上是阶跃变化,此时的控制输出记为U0。当调整开始时,调整增量实际上与之前的一切无关。所以我们可以从变化的瞬间开始,得到一个积分分离的增量算法,保证在启动、停止和快速变化过程中可以防止超调。公式如下:
的值与位置PID算法一致。有人可能会担心偏差会来回变化,导致积分函数频繁分离引入,从而使上述增量表达式无法实现。其实经过分析可以发现,在开始时,由于设定值的变化引起的较大偏差,积分函数是分离的。当接近设定值时,偏差变小,引入积分,同时消除静态误差,然后处于稳定状态,直到下一次变化。
2.算法实现。
在这一部分,根据前面对其基本思想的描述,我们实现了基于积分分离的PID算法,其中也包括位置型和增量型两种方式。首先,我们来看看算法的实现过程。具体流程图如下:
从上图我们知道,和普通PID算法的区别只是判断偏差。偏差大的时候是PD算法,偏差小的时候是PID算法。所以我们需要一个偏差检测和积分项分离系数的函数。
1静态uint 16 _ t生成(浮点误差,浮点)
2
3 {
四
5 uint 16 _ t=0;
六
7如果(abs(误差)=)
八
9 {
10
11=1;
12
13 }
14
15返回beta
16
17 }(1)位置PID算法的实现
根据前面的分析,我们可以很容易的编写程序,只需要判断偏差来决定在编写程序时是否引入积分项。同样先定义PID对象的结构:
1 /*定义结构和公共机构*/
2
3 typedef结构
四
5 {
六
7浮动设定值;//设置值
八
9浮动比例增益;//比例系数
10
11浮点积分增益;//积分系数
12
13浮点导数增益;//微分系数
14
15浮点lasterror//前一节拍偏差
16
17浮点结果;//输出值
18
19浮点积分;//积分
9 vPID-integral=this error;
10
11 uint16_t beta=BetaGeneration(错误,vPID-epsilon);
12
13中频(0)
14
15 {
16
17 vPID-result=vPID-proportion gain * this error vPID-derivative gain *(this error-vPID-lasterror);
18
19 }
20
其他21个
22
23 {
24
25 vPID-result=vPID-proportion gain * this error vPID-integral gain * vPID-integral vPID-derivative gain *(this error-vPID-lasterror);
26
27 }
28
29
30
31 vPID-lasterror=this error;
32
30}和普通PID算法的区别是在上面的代码中加入了偏差判断来判断积分项是否分离。
(2)增量式PID算法的实现
对于增量式PID控制,我们也可以采取同样的处理方式。首先,定义PID对象的结构:
1 /*定义结构和公共机构*/
2
3 typedef结构
四
5 {
六
7浮动设定值;//设置值
八
9浮动比例增益;//比例系数
10
11浮点积分增益;//积分系数
12
13浮点导数增益;//微分系数
14
15浮点lasterror//前一节拍偏差
16
17浮动预误差;//前两拍的偏差
18
19浮动死区;//死区
20
21浮点结果;//输出值
22
23浮动;//偏差检测阈值
24
25 } PID接下来,实施PID控制器:
1 void PIDRegulation(PID *vPID,浮点处理值)
2
3 {
四
5 float thisError
六
7浮动增量;
八
9 float pError,dError,iError
10
11
12
13 this error=vPID-setpoint-process value;//获取偏差值
14
15 pError=this error-vPID-lasterror;
16
17 iError=thisError
18
19 dError=this error-2 *(vPID-lasterror)vPID-preerror;
20
21 uint16_t beta=BetaGeneration(错误,vPID-epsilon);
22
23中频(0)
24
25 {
26
27增量=vPID-比例增益*pError vPID-导数增益* dError//增量计算
28
29 }
30
其他31个
32
33 {
34
35增量=vPID-proportion gain * pError vPID-integral gain * iError vPID-derivative gain * der error;//增量计算
36
37 }
38
39 vPID-preerror=vPID-lasterror;//为下一次操作存储偏差。
40
41 vPID-lasterror=this error;
四十二个
43 vPID-result=增量;
四十四
40}这实现了增量式PID控制器的积分分离算法,不考虑任何干扰条件,只有数学公式的计算机语言。
3.摘要
分离算法的思想非常简单。当然也有很多人对的取值提出了改进措施,比如多段取值,设置多个阈值1,2,3,4等。但这些阈值也需要根据实际系统来设置。除了分段值,甚至使用函数关系来获得值。当然,经过这种处理,就不再是简单的积分分离,尤其是在增量算法上,实际上已经演变成了变量积分算法。已经偏离了积分分离算法的设计思路,后面会进一步说明。
欢迎关注:
想更方便及时的阅读相关文章,请关注我的微信微信官方账号【木南创智】
转载请联系作者取得转载授权,否则将追究法律责任。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。