试说明pid控制器的优点,pid控制是反馈控制吗
我们发表了一系列与PID控制器相关的文章,包括经典PID控制器和参数自适应PID控制器。虽然该系列PID控制器实现了主要功能,在实际使用中取得了良好的效果,但仍有许多细节可以改进,以提高性能和灵活性。因此,在本文中,我们将讨论PID控制器的改进,以实现正负转换。
1.提问
到目前为止,我们讨论了输出增加,控制变量也增加的情况,但实际情况并不完全是这样。在某些系统中,当我们增加输出时,控制变量会减少,这就是我们在这里要讨论的。我们之前开发PID控制器的时候没有考虑这个问题。为了增强PID控制器的适应性和方便性,我们需要增加控制PID输出方向的功能,这就是正负控制。
其实PID控制器有两种:正的和负的,两者没有本质区别。但用户需要知道是希望输出增加时输入增加还是输出增加时输入减少,以此来决定控制器的正负效果。
2.分析和设计
怎样才能实现正负效果相加的功能?首先我们要明白,所谓的正效应,其实是一种输出增加,输入值也增加的控制方式;反应就是输出增加,输入值减少的控制模式。系统选择什么样的动作模式是由系统本身的特性决定的,包括被控对象的属性和执行机构的工作特性。换句话说,我们不能通过对输入的处理来实现动作模式,但可以从输出的角度来实现我们的要求。
首先,我们需要向PID对象添加一个描述积极和消极影响的属性。该属性的值决定了控制器对象的行为方式。
1 /*定义正负枚举类型*/
2 typedef枚举ClassicPIDDR {
3直接,//正面效果
4反向//反应
5 } ClassicPIDDRType
六
7 /*定义PID对象类型*/
8 typedef结构经典
9 {
10 float * pPV//测量值指针
11 float * pSV//设置值指针
12 float * pMV//输出值指针
13 float * pKp//比例系数指针
14 float * pKi//整型系数指针
15 float * pKd//微分系数指针
16 uint16 _ t * pMA//手动自动操作指针
17
18浮动设定值;//设置值
19浮点lasterror//前一节拍偏差
20浮点预误差;//前两拍的偏差
21浮动死区;//死区
22浮点结果;//PID控制器//的计算结果
23浮点输出;//输出值为0-100%
最大24浮动;//输出值的上限
最小25浮动;//输出值的下限
26浮点误差absmax;//最大偏差绝对值
27浮点误差absmin;//绝对偏差的最小值
28浮动;//不完全微分系数
29浮点deltadiff//差分增量
30浮点积分值;//累计积分金额
31浮伽马;//差分第一滤波器系数
32浮点lastPv//最后一拍的过程测量值
33 float lastDeltaPv//前一个节拍的过程测量值的增量
34
35 ClassicPIDDRType direct//正面和负面影响
36 } CLASSICPID其次,我们需要在初始化对象时初始化这个属性。至于初始化值,需要根据实际使用需求选择枚举。
最后,这部分操作需要在PID控制器中实现。有两种方法可以做到这一点。一种方法是将PID的三个参数反演为负值,这样就可以实现反应。第二种方法是我们正常使用PID的三个参数计算并反推增量部分,同样可以达到相反的效果。显然,第一种方法容易理解,而第二种方法更容易操作。这里我们用第二种方法来实现。
3.软件实现。
我们设计了使用参数正常计算增量,在正向动作中加上增量,在负向动作中减去增量,从而实现正向和负向动作的转换。这里所说的“加”和“减”是纯数学运算,与增量本身的符号是否为负无关。正反效果不同于手动自动转换,不需要在线修改。它们在系统确定之后就已经确定了,所以我们需要在初始化的时候进行设置。在PID控制器中,我们根据正负动作值来决定是增加还是减去增量部分。因此,我们将PID控制器修改如下:
1 /*一般PID控制器采用增量算法,具有变积分、梯形积分和抗积分饱和功能。微分项采用不完全微分和一阶滤波。alpha值越大,过滤效果越强*/
2空PID调节器(CLASSICPID *vPID)
3 {
4 float thisError
5浮动结果;
6浮动因子;
7浮动增量;
8 float pError,dError,iError
九
1if(* vpid-PMA 1)//手动模式
11 {
12 vPID-输出=*vPID-
13 //设置无扰切换
14 vPID- result=(vPID-最大值-vPID-最小值)*vPID-输出/100.0 -vPID-最小值;
15 *vPID- pSV=*vPID-
16 vPID-设定点=*vPID-
17 }
1脉冲//自动模式
19 {
20 vPID-设定值=*vPID-
21 this error=vPID-setpoint-(* vPID-pPV);//获取偏差值
22结果=vPID-结果;
23 if (fabs(thisError) vPID-死区)
24 {
25 pError=this error-vPID-lasterror;
26 I error=(thisError vPID-lasterror)/2.0;
27 dError=this error-2 *(vPID-lasterror)vPID-preerror;
28
9//可变积分系数采集
30 factor=VariableIntegralCoefficient(this error,vPID- errorabsmax,vPID-error absmin);
31
2//用不完全微分计算微分项增量
33 vPID-delta diff=(* vPID-pKd)*(1-vPID-alpha)* dError vPID-alpha * vPID-delta diff;
34
35增量=(* vPID-pKp)* pError(* vPID-pKi)* factor * I error vPID-delta diff;//增量计算
36 }
其他37个
38 {
39 if((fabs(vPID-设定点-vPID-最小值)vPID-死区)(fabs(* vPID-pPV)-vPID-最小值)vPID-死区))
40 {
41结果=vPID-最小值;
42 }
43增量=0.0;
44 }
45
46 //正反动作设置
47 if(vPID- direct==DIRECT)
48 {
49结果=结果增量;
50 }
51其他
52 {
53结果=结果-增量;
54 }
55
5/*对于输出限值,避免过冲和积分饱和*/
57如果(结果=vPID-最大值)
58 {
59结果=vPID-最大值;
60 }
61如果(结果=vPID-最小值)
62 {
63结果=vPID-最小值;
64 }
65
66 vPID-preerror=vPID-lasterror;//为下一次操作存储偏差。
67 vPID-lasterror=this error;
68 vPID-result=结果;
六十九
70 vPID-output=(vPID-result-vPID-minimum)/(vPID-maximum-vPID-minimum)* 100.0;
71 * vPID-pMV=vPID-output;
72 }
73 }4.摘要
我们在PID控制器中加入了正负作用,结果与我们的预期一致。其实正负效应并不复杂,就是在我们预期输入增加的情况下,如何控制输出方向。如果投入和产出的变化趋势一致,我们需要采用正效应;如果投入和产出的变化趋势相反,那么我们需要选择反应。
至于如何确定一个控制器的正负效应,这里我们不妨举个例子。想象一下,我们需要控制一个水箱的液位。如何才能确定这个控制器的正负效应?我们说过,要确定控制器的正负效应,需要考虑被控对象的特性和执行机构的特性。对于这个例子,我们要考虑被控对象是否有可控的进水口或出水口,执行机构是常闭还是常开,所以有四种情况:
所谓常闭型和常开型是指没有信号输入时执行机构的状态。所以常开型给的信号越大,开度越小,常闭型给的信号越大,开度越大。当然,这只是一个简单的例子,在实际使用中会更复杂,但控制器的正负效应可以从被控对象和执行机构的特性中选择。
欢迎关注:
想更方便及时的阅读相关文章,请关注我的微信微信官方账号【木南创智】
转载请联系作者取得转载授权,否则将追究法律责任。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。