pid控制中积分控制指什么,数字pid控制器积分项的改进有哪些
在常用的PID控制算法中,积分系数Ki是恒定的,所以在整个控制过程中积分增量是恒定的。而系统对积分项的要求是,当系统偏差较大时,积分作用要减弱甚至不存在,当偏差较小时,积分作用要加强。如果积分系数大,会造成积分超调甚至饱和;如果很小,短时间内不会消除静态误差。因此,如何根据系统的偏差来改变积分速度是提高系统质量所必需的。变积分PID算法正好可以满足这一要求。
1.变量积分的基本思想
变积分PID的基本思想是试图改变积分项的累加速度,使其与偏差相对应:偏差越大,积分越慢;偏差越小,积分越快。将系数设为f(err(k)),它是err(k)的函数。当err(k)增大时,f减小,反之亦然。可变PID积分项的表达式为:
f(err(k))和err(k)之间的函数关系可以根据具体情况设定,可以是线性的,也可以是非线性的。一般情况下,设置如下:
从上式可以看出,f(err(k))的值在[0,1]的区间内变化。当偏差值err(k)大于分离区间A B时,当前偏差err(k)不会累加;当偏差值err(k)小于b时,加上当前偏差err(k)进行累加;当它在B和A B之间时,按照一定的函数关系随err(k)变化。那么可变积分PID算法可以表示为:
上面提到的f(err(k))函数只是我们列举的一个。其实可以采取任何可行的方式,哪怕是非线性函数,只要更符合被控对象的特性。
增量PID算法的变量积分表示如下:
看到这个公式,很多人可能会觉得和之前积分分离算法的公式很像。尤其是在增量算法中,它们的形式确实是一样的,但是意义是不一样的,所以我们来看看有什么不同。稍后我们会做一个总结。
2.算法实现。
其实改变积分就是通过判断偏差,让积分在不同的速度下累加。这个系数在0到1之间,可以通过多种方式实现。在这里,我们线性地实现它。变量积分的控制流程图如下:
首先,实现一个处理f(e(k))的函数。有了前面的函数关系表达式,实现为响应的代码就非常简单了:
1 /*可变整系数处理函数,实现输出在0和1之间的分段线性函数*/
2 /*当偏差的绝对值小于最小值时,输出为1;当偏差的绝对值大于最大值时,输出为0 */
3 /*当偏差的绝对值在最大值和最小值之间时,输出在0和1之间变化*/
4 /*浮点误差,当前输入偏差值*/
5 /* float absmax,绝对偏差的最大值*/
6 /* float absmin,绝对偏差的最小值*/
7静态浮点变量积分系数(浮点误差、浮点absmax、浮点absmin)
8 {
九
10浮动系数=0.0;
11
12 if(abs(误差)=absmin)
13 {
14
15因子=1.0;
16
17 }
18 else if(abs(误差)absmax)
19 {
20
21因子=0.0;
22
23 }
其他24个
25
26 {
27
28因子=(absmax-abs(误差))/(ABS max-ABS min);
29
30 }
31
32返回因子;
33
34 }(1)位置PID算法的实现
基于位置PID的变积分的实现是为了获得绝对偏差更大的变积分系数。然后,实现PID算法,并且也首先定义PID对象的结构:
1 /*定义结构和公共机构*/
2
3 typedef结构
四
5 {
六
7浮动设定值;//设置值
八
9浮动比例增益;//比例系数
10
11浮点积分增益;//积分系数
12
13浮点导数增益;//微分系数
14
15浮点lasterror//前一节拍偏差
16
17浮点结果;//输出值
18
19浮点积分;//整数值
20
21浮点误差absmax;//最大偏差绝对值
22
23浮点误差absmin;//绝对偏差的最小值
24
25 } PID接下来,实施PID控制器:
1 void PIDRegulation(PID *vPID,浮点处理值)
2 {
三
4 float thisError
五
6浮动因子;
七
8 this error=vPID-setpoint-process value;
九
10 factor=VariableIntegralCoefficient(this error,vPID- errorabsmax,vPID-error absmin);
11
12
13
14 vPID-integral=factor * this error;
15
16 vPID-result=vPID-proportion gain * this error vPID-integral gain * vPID-integral vPID-derivative gain *(this error-vPID-lasterror);
17
18 vPID-lasterror=this error;
19
20 }(2)增量PID算法的实现
同理,基于增量式PID的变积分实现也是一样的。首先,定义PID对象的结构:
1 /*定义结构和公共机构*/
2 typedef结构
3 {
四
5浮动设定值;//设置值
六
7浮动比例增益;//比例系数
八
9浮点积分增益;//积分系数
10
11浮点导数增益;//微分系数
12
13浮点lasterror//前一节拍偏差
14
15浮动预误差;//前两拍的偏差
16
17浮动死区;//死区
18
19浮点结果;//输出值
20
21浮点误差absmax;//最大偏差绝对值
22
23浮点误差absmin;//绝对偏差的最小值
24
25 } PID接下来,实施PID控制器:
1 void PIDRegulation(PID *vPID,浮点处理值)
2 {
三
4 float thisError
五
6浮动增量;
七
8 float pError,dError,iError
九
10浮动系数;
11
12
13
14 this error=vPID-setpoint-process value;//获取偏差值
15
16 factor=VariableIntegralCoefficient(this error,vPID- errorabsmax,vPID-error absmin);
17
18
19
20 pError=this error-vPID-lasterror;
21
22 iError=factor * thisError
23
24 dError=this error-2 *(vPID-lasterror)vPID-preerror;
25
26 increment=vPID-proportion gain * pError vPID-integral gain * iError vPID-derivative gain * der error;//增量计算
27
28 vPID-preerror=vPID-lasterror;//为下一次操作存储偏差。
29
30 vPID-lasterror=this error;
31
32 vPID-result=增量;
33
34 }3.摘要
其实积分是有一定的专家经验的,因为在极限值的选取上,用什么样的函数来计算系数,有很大的灵活性。
前面做了积分分离的算法,这次说的是变量积分的算法。它们有相似之处,也有不同之处。以下是对它们的一些解释。
首先,这两种算法的设计思路不同。分离的思路是在偏差较大时取消积分;当偏差较小时,引入积分。变积分的实现是试图改变积分项的积累速度,在偏差较大时弱化积分;偏差小时,积分加强。一些所谓的改进的积分分离算法,实际上已经偏离了积分分离的基本思想,而是动态地改变了积分系数。在这一点上,尤其是在增量算法中,已经属于变积分的思想。
其次,对于积分分离,这个操作是针对整个积分项的,这一点在位置PID算法中尤为明显。对于变量积分,它是对当前偏差的积分累加,也就是说,它只影响当前积分部分。再者,在具体实现方式上也有差异,尤其是在位置PID模式上。
我们在这里讨论他们分歧的原因。显然,我们不能同时采用这两种优化方法,只能分别实现。稍后,我们将实现基于积分项的优化。
欢迎关注:
想更方便及时的阅读相关文章,请关注我的微信微信官方账号【木南创智】
转载请联系作者取得转载授权,否则将追究法律责任。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。