pid各参数对控制系统的调节作用,简述pid调节器的参数对控制性能的影响
我们发表了一系列与PID控制器相关的文章,包括经典PID控制器和参数自适应PID控制器。虽然该系列PID控制器实现了主要功能,在实际使用中取得了良好的效果,但仍有许多细节可以改进,以提高性能和灵活性。所以在本文中,我们将讨论PID控制器的改进,以达到动态调整参数的目的。
1.提问
我们最初开发PID控制器的时候,主要关注的是它的算法实现,并没有太关注它的使用过程。但是在我们的使用过程中,发现了一些不灵活的地方。
在原有的PID控制器中,设定值是通过外部分配PID对象的参数来实现的。虽然不影响使用,但是我们处理PID控制器中的参数设定值不是很方便。但是在原来的PID控制器中,输出值在外部是不可见的,只能通过PID对象查看,不能改变。这些使得这些参数的操作显得不灵活。
而且在原有的PID控制器中,三个调节参数都不能随时外部调节,这显然不能满足很多应用的需要,因为PID参数的调节是一项非常普通的工作。所以在本文中,我们将考虑这些参数的动态调整。
2.分析和设计
为了使PID控制器更加灵活,我们需要对PID对象进行必要的修改。对于PID对象,我们认为测量值、设定值和输出值是对象的属性。但是我们并不直接使用这些变量作为对象属性,因为这样从外部无法达到灵活操作的目的。我们用几个指向浮点变量的指针作为对象属性,初始化后这些指针会指向我们的测量值、设定值和输出值变量。
我们想从外部修改同样的三个PID参数。我们还在外部将它们定义为变量,在PID对象中将它们定义为指向这三个变量的浮点指针。当初始化对象时,我们给这些指针分配变量地址。据此,我们将PID对象类型定义为:
1 /*定义结构和公共机构*/
2 typedef结构经典
3 {
4 float * pPV//测量值指针
5 float * pSV//设置值指针
6 float * pMV//输出值指针
7 float * pKp//比例系数指针
8 float * pKi//整型系数指针
9 float * pKd//微分系数指针
10
11浮动设定值;//设置值
12浮点lasterror//前一节拍偏差
13浮动预误差;//前两拍的偏差
14浮动死区;//死区
15浮点结果;//PID控制器//的计算结果
16浮点输出;//输出值为0-100%
最大17浮动;//输出值的上限
最小18浮动;//输出值的下限
19浮点误差absmax;//最大偏差绝对值
20浮点误差absmin;//绝对偏差的最小值
21浮动;//不完全微分系数
22浮点deltadiff//差分增量
23浮点积分值;//累计积分金额
24浮动伽马;//差分第一滤波器系数
25浮点lastPv//最后一拍的过程测量值
26浮点lastDeltaPv//前一个节拍的过程测量值的增量
27 } CLASSICPID3.软件实现。
我们计划将PID参数和流程变量更改为指向浮点变量的指针,那么我们需要在代码中进行哪些更改呢?需要修改的功能主要有两个:PID调节功能和PID对象初始化功能。
首先,我们来看看PID对象的初始化函数。我们知道,将这些变量修改成指向浮点变量方法的指针后,必须在初始化时指定具体的变量地址,否则会指向不可预知的位置。因此,我们将初始化函数修改如下:
1 /* PID初始化应在修改vPID对象的值之前完成*/
2 void pidrain初始化(经典PID * vpid,//PID控制器对象
3 float *pPV,//测量值指针
4 float *pSV,//设置值指针
5 float *pMV,//输出值指针
6 float *pKp,//比例因子指针
7 float *pKi,//整型系数指针
8 float *pKd,//微分系数指针
9浮点vMax,//控制变量范围
1floatvmin,//控制变量的零点
11 )
12 {
13 if((vPID==NULL) (pPV==NULL) (pSV==NULL) (pMV==NULL)(pKp==NULL) (pKi==NULL) (pKd==NULL))
14 {
15返回;
16 }
17 vPID-pPV=pPV;
18 vPID-pSV=pSV;
19 vPID-pMV=pMV;
20 vPID-pKp=pKp;
21 vPID-pKi=pKi;
22 vPID-pKd=pKd;
23
24 vPID-maximum=vMax;/*输出值上限*/
25 vPID-最小值=vMin/*输出值下限*/
26
27 vPID-setpoint=* pPV;/*设定值*/
28
29 vPID-lasterror=0.0;/*先前节拍偏差*/
30 vPID-pre error=0.0;/*前两拍的偏差*/
31 vPID-result=vMin;/*PID控制器结果*/
32 vPID-output=0.0;/*产值,百分比*/
33
34 vPID-errorabsmax=(vMax-vMin)* 0.8;
35 vPID-errorabsmin=(vMax-vMin)* 0.2;
36
37 vPID-死区=(vMax-vMin)* 0.0005;/*死区*/
38 vPID-alpha=0.2;/*不完全微分系数*/
39 vPID-delta diff=0.0;/*微分增量*/
40
41 vPID-integral value=0.0;
四十二个
43 vPID-mode=mode;
44}其次,我们还需要修改PID调节功能。在原来的PID调节器中,过程值是作为函数参数输入的,PID参数是作为变量存在于对象中的,所以需要针对这两个方面做相应的修改:
1 /*一般PID控制器采用增量算法,具有变积分、梯形积分和抗积分饱和功能。微分项采用不完全微分和一阶滤波。alpha值越大,过滤效果越强*/
2空PID调节器(CLASSICPID *vPID)
3 {
4 float thisError
5浮动结果;
6浮动因子;
7浮动增量;
8 float pError,dError,iError
九
10 vPID-设定点=*vPID-
11 this error=vPID-setpoint-(* vPID-pPV);//获取偏差值
12结果=vPID-结果;
13 if (fabs(thisError) vPID-死区)
14 {
15 pError=this error-vPID-lasterror;
16 I error=(thisError vPID-lasterror)/2.0;
17 dError=this error-2 *(vPID-lasterror)vPID-preerror;
18
9//可变积分系数采集
20 factor=VariableIntegralCoefficient(this error,vPID- errorabsmax,vPID-error absmin);
21
2//用不完全微分计算微分项增量
23 vPID-delta diff=(* vPID-pKd)*(1-vPID-alpha)* dError vPID-alpha * vPID-delta diff;
24
25增量=(* vPID-pKp)* pError(* vPID-pKi)* factor * I error vPID-delta diff;//增量计算
26 }
其他27个
28 {
29 if((fabs(vPID-设定点-vPID-最小值)vPID-死区)(fabs(* vPID-pPV)-vPID-最小值)vPID-死区))
30 {
31结果=vPID-最小值;
32 }
33增量=0.0;
34 }
35
36结果=结果增量;
37
38 /*对于输出限制,避免过冲和积分饱和*/
39如果(结果=vPID-最大值)
40 {
41结果=vPID-最大值;
42 }
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-result-vPID-minimum)/(vPID-maximum-vPID-minimum)* 100.0;
53
54 * vPID-pMV=vPID-output;
55 }
56 }4.摘要
我们将PID参数和过程变量改为对象中包含的指针,这样当我们修改来自上位机或其他进程的变量值时,也同步修改PID对象中的值。测试结果比原来的方法更方便。
欢迎关注:
想更方便及时的阅读相关文章,请关注我的微信微信官方账号【木南创智】
转载请联系作者取得转载授权,否则将追究法律责任。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。