pid控制器的调节原则,试说明pid控制器的优点
我们发表了一系列与PID控制器相关的文章,包括经典PID控制器和参数自适应PID控制器。虽然该系列PID控制器实现了主要功能,在实际使用中取得了良好的效果,但仍有许多细节可以改进,以提高性能和灵活性。因此,在本文中,我们将讨论PID控制器的改进,以减少设定值阶跃引起的扰动。
1.提问
当我们使用PID控制器时,如果设定值被大幅度修改,就有可能引入大的阶跃扰动。特别是对于差动动作,这种扰动可能引起很大的振荡,通常称为差动冲击。
为了应对微分动作引起的对设定值变化的激烈反应,人们首先引入微分的PID算法,将基于偏差的微分修改为基于输入的微分。也就是说,设定值的变化不会对微分产生突然的影响,微分只有作用于被控对象后才会起作用,从而消除了设定值变化带来的微分影响。
但有时,设定值的阶跃变化也会通过比例效应体现出来,这种影响也会对系统造成振荡。当然,我们也可以根据输入将其更改为比率。虽然它也可以消除设定值的突然影响,但对设定值的响应会滞后,因为比率和微分都是面向输入信号的,这不是我们想要的。
所以,我们希望找到一种方法,既能应对设定值的变化,又不会造成大的冲击,这才是我们这里要考虑的。
2.分析和设计
实际上,我们已经讨论了基于输入的比例和微分,这实际上改变了PID的调节模式。在这里,我们希望从另一个角度考虑对设定值的响应。我们讨论了步进式PID控制方式是解决这一问题的较好方法。
所谓步进式PID算法,实际上并不是在设定值步进变化时直接响应阶跃信号,而是在一定时间内逐渐改变设定值,直到设定值达到目标值。这种逐渐改变设定值的方法使对象运行平稳。适用于高精度伺服系统的位置跟踪。
显然,这种方法并没有改变PID控制器本身,而是对设定值进行了预处理。因此其结构框图和控制方程与其他PID控制算法一致。
为了对设定值进行必要的处理,使其不迅速变化,有许多方法。常用的方法是建立线性变差函数。我们可以指定设定值从0-100%的变化时间为t,那么我们就可以确定设定值变化的斜率的绝对值,或者说步长。知道了步长,我们就可以根据步长不断修改设定值,直到目标值。可用的公式描述如下:
其中,SPt是设定值的目标值,SPs是设定值的初始值,sl是步长,K是步长的变异系数:
我们希望能够根据自己的需要使用或者不使用步进,所以需要给PID对象添加一个属性来配置是否使用。
1 /*定义PID对象类型*/
2 typedef结构经典
3 {
4 float * pPV//测量值指针
5 float * pSV//设置值指针
6 float * pMV//输出值指针
7 float * pKp//比例系数指针
8 float * pKi//整型系数指针
9 float * pKd//微分系数指针
10 uint16 _ t * pMA//手动自动操作指针
11
12浮动设定值;//设置值
13浮点lasterror//前一节拍偏差
14浮点预误差;//前两拍的偏差
15浮动死区;//死区
16浮点结果;//PID控制器//的计算结果
17浮点输出;//输出值为0-100%
最大18浮动;//输出值的上限
19浮动最小值;//输出值的下限
20浮点误差absmax;//最大偏差绝对值
21浮点误差absmin;//绝对偏差的最小值
22浮动;//不完全微分系数
23浮点deltadiff//差分增量
24浮点积分值;//累计积分金额
25浮动伽马;//差分第一滤波器系数
26浮点lastPv//最后一拍的过程测量值
27 float lastDeltaPv//前一个节拍的过程测量值的增量
28
29 ClassicPIDDRType direct//正面和负面影响
30 ClassicPIDSMType sm//将值设置为平滑
31
32 } CLASSICPID3.软件实现。
实际上,我们讨论的设定值的响应是直接或逐步给出设定值。所谓步进法的实质是将设定值的突变变为平缓的变化,在控制中应用广泛。处理设定值变化的过程如下:
根据我们前面的描述和上面的流程图,我们可以修改PID控制器。我们将设定值处理的部分单独设置为一个函数,这样除了线性处理之外,还可以根据我们的需要进行其他方式的处理。
1 /*平滑改变设定值的处理功能*/
2静态void smooth setpoint(classic PID * vPID)
3 {
4 float stepIn=(vPID-maximum-vPID-minimum)* 0.1;
5 float kFactor=0.0
六
7 if(fabs(vPID-设定点-* vPID-pSV)=步进)
8 {
9 vPID-设定点=*vPID-
10 }
11其他
12 {
13 if(vPID-设定点-*vPID- pSV 0)
14 {
15k factor=-1.0;
16 }
17 else if(vPID-设定点-*vPID- pSV 0)
18 {
19 kFactor=1.0
20 }
其他21个
22 {
23 kFactor=0.0
24 }
25 vPID-设定点=vPID-设定点kFactor * stepIn
26 }
27 }
28
29 /*通用PID控制器,带增量算法,具有变积分、梯形积分、抗积分饱和功能。微分项采用不完全微分和一阶滤波。alpha值越大,过滤效果越强*/
30空PID调节器(CLASSICPID *vPID)
31 {
32 float thisError
33浮点结果;
34浮动因子;
35浮动增量;
36 float pError,dError,iError
37
3IF(* VPID-PMA 1)//手动模式
39 {
40 vPID-输出=*vPID-
1//设置无扰切换
42 vPID- result=(vPID-最大值-vPID-最小值)*vPID-输出/100.0 -vPID-最小值;
43 *vPID- pSV=*vPID-
44 vPID-设定点=*vPID-
45 }
4否则//自动模式
47 {
48 if(vPID- sm==SMOOTH_ENABLE)
49 {
50 smooth setpoint(vPID);
51 }
其他52个
53 {
54 vPID-设定点=*vPID-
55 }
五十六岁
57 this error=vPID-setpoint-(* vPID-pPV);//获取偏差值
58结果=vPID-结果;
59 if (fabs(thisError) vPID-死区)
60 {
61 pError=this error-vPID-lasterror;
62 I error=(thisError vPID-lasterror)/2.0;
63 dError=this error-2 *(vPID-lasterror)vPID-preerror;
64
6//可变积分系数采集
66 factor=VariableIntegralCoefficient(this error,vPID- errorabsmax,vPID-error absmin);
67
6//用不完全微分计算微分项增量
69 vPID-delta diff=(* vPID-pKd)*(1-vPID-alpha)* dError vPID-alpha * vPID-delta diff;
70
71增量=(* vPID-pKp)* pError(* vPID-pKi)* factor * I error vPID-delta diff;//增量计算
72 }
73其他
74 {
75 if((fabs(vPID-设定点-vPID-最小值)vPID-死区)(fabs(* vPID-pPV)-vPID-最小值)vPID-死区))
76 {
77结果=vPID-最小值;
78 }
79增量=0.0;
80 }
81
8//正反动作设置
83 if(vPID- direct==DIRECT)
84 {
85结果=结果增量;
86 }
87其他
88 {
89结果=结果-增量;
90 }
91
2/*对于输出限值,避免过冲和积分饱和*/
93如果(结果=vPID-最大值)
94 {
95结果=vPID-最大值;
96 }
97如果(结果=vPID-最小值)
98 {
99结果=vPID-最小值;
100 }
101
102 vPID-preerror=vPID-lasterror;//为下一次操作存储偏差。
103 vPID-lasterror=this error;
104 vPID-result=结果;
105
106 vPID-output=(vPID-result-vPID-minimum)/(vPID-maximum-vPID-minimum)* 100.0;
107 * vPID-pMV=vPID-output;
108 }
09} 4.摘要
介绍了在不改变PID控制器控制方式的情况下,使设定值在小范围内突变的方法。测试结果可以满足我们的要求。这里,步长固定为范围的十分之一。事实上,我们可以将其作为一个初始化参数进行修改,甚至可以在一定条件下采用可变步长来满足更高的控制要求。
欢迎关注:
想更方便及时的阅读相关文章,请关注我的微信微信官方账号【木南创智】
转载请联系作者取得转载授权,否则将追究法律责任。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。