不用浮点实现pid_PID控制器开发笔记之六:不完全微分PID控制器的实现

本文介绍了不完全微分PID控制器的概念和优势,通过加入一阶低通滤波器减少高频干扰。详细阐述了两种结构形式,并分别提供了位置型和增量型PID算法的实现代码,强调了不完全微分系数α对系统性能的影响。
摘要由CSDN通过智能技术生成

从PID控制的基本原理我们知道,微分信号的引入可改善系统的动态特性,但也存在一个问题,那就是容易引进高频干扰,在偏差扰动突变时尤其显出微分项的不足。为了解决这个问题人们引入低通滤波方式来解决这一问题。

1、不完全微分的基本思想

微分项有引入高频干扰的风险,但若在控制算法中加入低通滤波器,则可使系统性能得到改善。方法之一就是在PID算法中加入一个一阶低通滤波器。这就是所谓的不完全微分,其结构图如下:

80d4bc1e655aeb5cc6fd6de98b60bfec.png

或者是另一种形式:

fbb6d131533a6244deecaa60ae249537.png

在这里我们考虑第一种结构形式。在这种情况下,微分与一阶惯性环节结合,其微分部分的计算公式可表示如下:

8b225e75300f4506091e0196797edb03.png

其中α的取值在0和1之间,有滤波常数和采样周期确定。据此我们将其增量化,则可以得到为不完全微分的增量计算公式:

2557c0a3692cb81ab07489654bc14b40.png

或者表示为:

da51dabcc5f03c591d9c4a358aba394a.png

这两种表示方式是等价的,第二种表示法与我们的完全微分PID算法增量型式表示更接近,好理解。而且与位置型的表示法也更为一致,所以我们选择第二种表示法。

2、算法实现

经过前面的分析及公式推导,我们想要实现不完全微分其实已经相当容易了。为了便于理解,我们保持比例和积分为基本的格式,只对微分部分采用不完全微分算法。

(1)位置型PID算法实现

位置型PID实现过程与前面的一样,所不同的是需要增加前一个Ud值。首先定义PID对象的结构体:

1 /*定义结构体和公用体*/

2

3 typedef struct

4

5 {6

7 float setpoint; //设定值

8

9 float proportiongain; //比例系数

10

11 float integralgain; //积分系数

12

13 float derivativegain; //微分系数

14

15 float lasterror; //前一拍偏差

16

17 float lastdev; //前一拍时的微分项值

18

19 float alpha; //不完全微分系数

20

21 float result; //输出值

22

23 float integral;//积分值

24

25 }PID;

接下来实现PID控制器:

1 void PIDRegulation(PID *vPID, floatprocessValue)2

3 {4

5 floatthisError;6

7 floatthisDev;8

9 thisError=vPID->setpoint-processValue;10

11 vPID->integral+=thisError;12

13 thisDev= vPID->derivativegain*(1- vPID-> alpha)*(thisError-vPID->lasterror)+ vPID-> alpha* vPID->lastdev;14

15

16

17 vPID->result=vPID->proportiongain*thisError+vPID->integralgain*vPID->integral+thisDev;18

19 vPID->lasterror=thisError;20

21 vPID->lastdev =thisDev;22

23 }

这就实现了一个最简单不完全微分的位置型PID控制器,当然没有考虑任何干扰条件,仅仅只是对数学公式的计算机语言化。

(2)增量型PID算法实现

增量型不完全微分PID控制器的实现就是以前面的增量型公式为基础。首先定义PID对象的结构体:

1 /*定义结构体和公用体*/

2

3 typedef struct

4

5 {6

7 float setpoint; //设定值

8

9 float proportiongain; //比例系数

10

11 float integralgain; //积分系数

12

13 float derivativegain; //微分系数

14

15 float lasterror; //前一拍偏差

16

17 float preerror; //前两拍偏差

18

19 float lastdeltadev; //前一拍时的微分项增量

20

21 float alpha; //不完全微分系数

22

23 float deadband; //死区

24

25 float result; //输出值

26

27 }PID;

接下来实现PID控制器:

1 void PIDRegulation(PID *vPID, floatprocessValue)2

3 {4

5 floatthisError;6

7 floatincrement;8

9 floatdeltaDev;10

11 floatpError,dError,iError;12

13

14

15 thisError=vPID->setpoint-processValue; //得到偏差值

16

17 pError=thisError-vPID->lasterror;18

19 iError=thisError;20

21 dError=thisError-2*(vPID->lasterror)+vPID->preerror;22

23

24

25 deltaDev= vPID->derivativegain*(1- vPID-> alpha)*dError+ vPID-> alpha* vPID->lastdeltadev;26

27 increment=vPID->proportiongain*pError+vPID->integralgain*iError+ deltaDev; //增量计算

28

29

30

31 vPID->preerror=vPID->lasterror; //存放偏差用于下次运算

32

33 vPID->lasterror=thisError;34

35 vPID-> lastdeltadev =deltaDev;36

37 vPID->result+=increment;38

39 }

这就实现了一个最简单的增量型不完全微分PID控制器,也没有考虑任何的干扰条件,仅仅只是对数学公式的计算机语言化。

3、总结

不完全微分方式在微分环节采用了低通滤波有效地提高了微分项的特性。其中α的取值是一个0~1之间的数。两个极限值,在0时其实就是没有滤波的普通微分环节;而取1时,则没有微分作用。所以α的取值对不完全微分的效果是至关重要的,一般要根据被控对象的特性来确定。

欢迎关注:

3a4ea7e2d98d4edd64fe59bcfedc2d12.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值