微分先行的pid控制算法课程设计,什么是微分先行pid控制
之前已经实现了各种PID算法,但是在某些给定值变化频繁且幅度较大的情况下,微分项往往会引起系统的振荡。为了适应给定值频繁变化的情况,人们设计了差分优先算法。
1.差分优先算法的思想。
微分PID控制只对输出进行微分,不对给定指令进行微分,适用于给定指令频繁上升和下降的情况,可以避免指令变化带来的超调。预先区分的基本结构图:
根据上面的结构图,我们可以推导出PID控制器的输出公式。比例和积分不变,但微分部分改为只对物体输出积分,标记为y .我们在微分部分引入一阶惯性滤波器:可记录微分部分的传递函数如下:
那么微分部分可以导出下面的公式:
我们在推导PID的公式时,规定Kd=Kp*Td/T,所以带入公式得到:
那么我们可以先得到微分的离散化公式:
这是位置PID的计算公式,我们也可以用前面的方法导出增量计算公式如下:
从上式中我们发现微分部分只与测量值有关,而且与连续几个测量值有关。与设定值无关,设定值的阶跃变化不会引起高频干扰。
2.算法实现。
我们简要介绍了当前微分的基本结构,并推导了位置公式和增量公式。接下来,根据前面对其基本思想的描述,我们将首先实现基于微分的PID算法,它也包括位置法和增量法。
(1)位置PID算法的实现
我们已经推导出了微分优先PID算法的公式,编码实现就是根据公式将其变成计算机语言。同样,首先定义PID对象的结构:
1 /*定义结构和公共机构*/
2
3 typedef结构
四
5 {
六
7浮动设定值;//设置值
八
9浮动比例增益;//比例系数
10
11浮点积分增益;//积分系数
12
13浮点导数增益;//微分系数
14
15浮点lasterror//前一节拍偏差
16
17浮点结果;//输出值
18
19浮点积分;//整数值
20
21浮动导数;//微分项
22
23浮点lastPv//前一拍的测量值
24
25浮动伽马;//差分第一滤波器系数
26
27 } PID接下来,实施PID控制器:
1 void PIDRegulation(PID *vPID,浮点处理值)
2
3 {
四
5 float thisError
六
7浮点c1,c2,c3,temp
八
9 this error=vPID-setpoint-process value;
10
11 vPID-integral=this error;
12
13
14
15 temp=vPID-gama * vPID-derivative gain vPID-proportion gain;
16
17 c3=vPID-导数gain/temp;
18
19 C2=(vPID-derivative gain vPID-proportion gain)/temp;
20
21 C1=vPID-gama * C3;
22
23 vPID-导数=c1* vPID-导数C2 * process value C3 * vPID-lastPv;
24
25
26
27 vPID-result=vPID-proportion gain * this error vPID-integral gain * vPID-integral vPID-导数;
28
29 vPID-lasterror=this error;
30
31 vPID-lastPv=process value;
32
3}对于先微分的位置PID控制器,本次的微分项不仅与前一拍的微分结果有关,还与前一拍的测量值有关。
(2)增量式PID算法的实现
微分增量PID控制算法的实现是基于前面的增量公式。一次微分的比例部分和积分部分没有变化,当然积分部分也可以使用各种优化算法。微分部分可以用增量公式实现。首先,定义PID对象的结构:
1 /*定义结构和公共机构*/
2
3 typedef结构
四
5 {
六
7浮动设定值;//设置值
八
9浮动比例增益;//比例系数
10
11浮点积分增益;//积分系数
12
13浮点导数增益;//微分系数
14
15浮点lasterror//前一节拍偏差
16
17浮动预误差;//前两拍的偏差
18
19浮动死区;//死区
20
21浮点结果;//输出值
22
23浮点deltadiff/*微分增量*/
24
25浮点积分值;/*累计积分数*/
26
27浮伽马;/*微分滤波器系数*/
28
29浮点lastPv/*最后一拍的过程测量值*/
30
31 float lastDeltaPv/*最后一次心跳测量值的增量*/
32
33 } PID接下来,实施PID控制器:
1 void PIDRegulation(PID *vPID,浮点处理值)
2
3 {
四
5 float thisError
六
7浮动增量;
八
9 float pError,iError
10
11浮点c1,c2,c3,temp
12
13浮动PV;
14
15
16
17 temp=vPID-gama * vPID-derivative gain vPID-proportion gain;
18
19 c3=vPID-导数gain/temp;
20
21 C2=(vPID-derivative gain vPID-proportion gain)/temp;
22
23 C1=vPID-gama * C3;
24
25
26
27 deltaPv=process value-vPID-last deltaPv
28
29 vPID-delta diff=C1 * vPID-delta diff C2 * delta PV C3 * vPID-lastdetapv;
30
31
32
33 thisError=vPID-设定点-过程值;//获取偏差值
34
35 pError=this error-vPID-lasterror;
36
37 iError=thisError
38
39 increment=vPID-proportion gain * pError vPID-integral gain * iError vPID-delta diff;//增量计算
40
41
四十二个
43 vPID-preerror=vPID-lasterror;//为下一次操作存储偏差。
四十四
45 vPID-lastdetapv=deltaPv;
46
47 vPID-lastPv=process value;
48
49 vPID-lasterror=this error;
50
51 vPID-result=增量;
五十二个
50}这实现了最简单的微分优先增量PID控制器。与一般的PID控制器相比,还需要知道前一拍的测量值、前一拍的测量值的增量和前一拍的微分增量,剩下的只需要根据公式完成即可。
3.摘要
第一,由于微分部分只作用于测量值,可以消除设定值突变的影响,还可以引入低通滤波,即使需要,比例效果也可以相应提高。实际上是用于设定值会频繁变化的过程对象,防止设定值频繁波动导致系统不稳定。这种控制有利于改善系统的动态特性,但必然会影响响应速度,要综合考虑。
欢迎关注:
想更方便及时的阅读相关文章,请关注我的微信微信官方账号【木南创智】
转载请联系作者取得转载授权,否则将追究法律责任。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。