pid控制死区范围,带死区的pid控制方法有何优点
在计算机控制系统中,由于系统特性和计算精度的问题,系统偏差总是存在的,系统总是频繁运动,不稳定。为了解决这种情况,我们可以引入带死区的PID算法。
1.带死区PID的基本思想
带死区的PID控制算法是检测偏差值。如果偏差值达到一定程度,就会进行调整。如果偏差值很小,则认为没有偏差。公式如下:
死区值的选择应根据具体对象仔细考虑,因为值太小不起作用,值太大可能造成大滞后。
带死区的PID算法对位置和增量表达式都没有影响,但它是一个非线性系统。
除了上面的描述,还有一个问题。零点附近偏差较小时,当偏差设为0时,积分会消失。如果系统存在静态误差,则无法消除,需要人工处理。
2.算法实现。
我们已经描述了带死区PID控制的基本思想。接下来我们来实现这个思路,也是分别用位置型和增量型来实现的。
(1)位置PID算法的实现
我们对微分项和积分项采用了不同的优化算法,它们都可以和死区一起作用于PID控制。在本节中,我们将实现一种采用反积分饱和、梯形积分、变量积分算法、不完全微分算法和死区控制的PID算法。第一步是定义PID结构。
1 /*定义结构和公共机构*/
2
3 typedef结构
4 {
5浮动设定值;/*设定值*/
6浮动KP;/*比例因子*/
7 float ki/*积分系数*/
8浮动KD;/*微分系数*/
9 float lasterror/*先前节拍偏差*/
10浮点预误差;/*前两拍的偏差*/
11浮动死区;/*死区*/
12浮点结果;/*PID控制器的计算结果*/
13浮点输出;/*输出值0-100%*/
最大14浮动;/*输出值上限*/
最小15浮动;/*输出值下限*/
16浮点误差absmax;/*最大偏差绝对值*/
17浮点误差absmin;/*绝对偏差的最小值*/
18浮动;/*不完全微分系数*/
19浮动衍生工具;/*微分项*/
20浮点积分值;/*累计积分数*/
21 } CLASSICPID接下来,实现了带死区、反积分饱和、梯形积分、变积分算法和不完全微分算法的增量式PID控制器。
1个空PID调节器(经典PID vPID,浮动pv)
2 {
3 float thisError
4浮点结果;
5浮动因子;
六
7 this error=vPID-setpoint-PV;//获取偏差值
8结果=vPID-结果;
九
10 if (fabs(thisError) vPID-死区)
11 {
12 vPID-integral value=vPID-integral value this error;
13
14 //可变积分系数采集
15 factor=VariableIntegralCoefficient(this error,vPID- errorabsmax,vPID-error absmin);
16
7//用不完全微分计算微分项增量
18 vPID-derivative=KD *(1-vPID-alpha)*(this error-vPID-lasterror vPID-alpha * vPID-derivative;
19
20 result=vPID-KP * this error vPID-ki * vPID-integral value vPID-derivative;
21 }
其他22个
23 {
24 if((abs(vPID-设定点-vPID-最小值)vPID-死区)(abs(pv-vPID-最小值)vPID-死区))
25 {
26结果=vPID-最小值;
27 }
28 }
29
30 /*对于输出限值,避免过冲和积分饱和*/
31如果(结果=vPID-最大值)
32 {
33结果=vPID-最大值;
34 }
35
36 if(结果=vPID-最小值)
37 {
38结果=vPID-最小值;
39 }
40
41 vPID-preerror=vPID-lasterror;//为下一次操作存储偏差。
42 vPID-lasterror=this error;
43 vPID-result=结果;
四十四
45 vPID- output=((结果-vPID-最小值)/(vPID-最大值-vPID-最小值))* 100.0;
40} (2)增量PID算法的实现
在位置PID中,我们实现了综合PID控制器,对于增量PID,我们也实现了相应的控制器。除了这些组合之外,还可以根据具体需要组合和实现其他优化算法。第一步是定义PID结构。
1 /*定义结构和公共机构*/
2 typedef结构
3 {
4浮动设定值;/*设定值*/
5浮动KP;/*比例因子*/
6 float ki/*积分系数*/
7浮动KD;/*微分系数*/
8 float lasterror/*先前节拍偏差*/
9浮动预误差;/*前两拍的偏差*/
10浮动死区;/*死区*/
11浮点结果;/*PID控制器的计算结果*/
12浮点输出;/*输出值0-100%*/
13浮动最大值;/*输出值上限*/
14浮动最小值;/*输出值下限*/
15浮点误差absmax;/*最大偏差绝对值*/
16浮点误差absmin;/*绝对偏差的最小值*/
17浮动阿尔法;/*不完全微分系数*/
18浮点deltadiff/*微分增量*/
19 } CLASSICPID接下来,实现了带死区、反积分饱和、梯形积分、变积分算法和不完全微分算法的增量式PID控制器。
1个空PID调节器(经典PID vPID,浮动pv)
2 {
3 float thisError
4浮点结果;
5浮动因子;
6浮动增量;
7 float pError,dError,iError
八
9 this error=vPID-setpoint-PV;//获取偏差值
10结果=vPID-结果;
11
12 if (fabs(thisError) vPID-死区)
13 {
14 pError=this error-vPID-lasterror;
15 I error=(thisError vPID-lasterror)/2.0;
16 dError=this error-2 *(vPID-lasterror)vPID-preerror;
17
18 //可变积分系数采集
19 factor=VariableIntegralCoefficient(this error,vPID- errorabsmax,vPID-error absmin);
20
1//用不完全微分计算微分项增量
22 vPID-delta diff=KD *(1-vPID-alpha)* dError vPID-alpha * vPID-delta diff;
23
24增量=vPID-KP * pError vPID-ki * factor * I error vPID-delta diff;//增量计算
25 }
其他26个
27 {
28 if((fabs(vPID-设定点-vPID-最小值)vPID-死区)(fabs(pv-vPID-最小值)vPID-死区))
29 {
30结果=vPID-最小值;
31 }
32增量=0.0;
33 }
34
35结果=结果增量;
36
37 /*对于输出限制,避免过冲和积分饱和*/
38如果(结果=vPID-最大值)
39 {
40结果=vPID-最大值;
41 }
四十二个
43如果(结果=vPID-最小值)
44 {
45结果=vPID-最小值;
46 }
47
48 vPID-preerror=vPID-lasterror;//为下一次操作存储偏差。
49 vPID-lasterror=this error;
50 vPID-result=结果;
51
52 vPID- output=((结果-vPID-最小值)/(vPID-最大值-vPID-最小值))* 100.0;
53 }3.摘要
引入死区的主要目的是消除稳定点附近的波动。由于测量精度和测量值干扰的影响,实际系统中的测量值不会真正稳定在一个特定值,但总会与设定值有偏差,而这个偏差并不是系统真实控制过程的反应,所以引入死区可以更好的消除这一点。
当然,死区的大小对系统有不同的影响。太小可能达不到预期的效果,太大则可能造成系统正常变化的严重滞后,需要根据具体的系统对象进行设置。
欢迎关注:
想更方便及时的阅读相关文章,请关注我的微信微信官方账号【木南创智】
转载请联系作者取得转载授权,否则将追究法律责任。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。