PID控制算法原理,pid 控制算法
在自动控制中,PID及其衍生算法是应用最广泛的算法之一。所有做自动控制的厂商基本都有能力实现这个经典算法。在做项目的过程中,我们经常会遇到类似的需求,所以我们想实现这个算法来应用到更多的应用场景。
1、PID算法的基本原理
PID算法是控制行业中最经典、最简单的算法,最能体现反馈控制的思想。对于一般R&D人员来说,PID算法的设计和实现是完成自动控制系统的基本要求。这个算法虽然简单,但是要想很好的实现还是要下一番功夫的。首先,我们从PID算法最基本的原理开始分析和设计这个经典命题。
PID算法的实现过程很简单,就是通过反馈检测偏差信号,由偏差信号控制被控量。控制器本身就是比例、积分、微分三个环节的总和。其功能框图如下:
根据上图,我们考虑在某一时刻T,输入量为rin(t),输出量为rout(t),那么偏差可以计算为err(t)=rin(t)-rout(t)。那么PID的基本控制规律可以表示为下面的公式:
其中Kp是比例带,TI是积分时间,TD是微分时间。这是PID控制的基本原理。
2.PID算法的离散化
最后一节简要介绍了PID算法的基本原理,但如果要在计算机上实现,就必须对其进行离散化。接下来说一下PID算法的离散化。在实现离散化之前,我们需要对比例、积分、微分的特性做一个简单的说明。
比例是用来对系统的偏差做出反应的,所以只要有偏差,比例就会起作用。积分主要用于消除静态误差,静态误差是指系统稳定后输入输出的差值,积分是通过偏差的积累来抵消系统的静态误差。而微分是对偏差的变化趋势做出反应,根据偏差的变化趋势实现提前调整,提高反应速度。
在实现离散化之前,我们假设系统的采样周期为t,假设我们检查第k个采样周期,很明显系统进行的是第k个采样。此时的偏差可以表示为err(K)=rin(K)-rout(K),那么积分可以表示为:err(k)err(k-1),微分可以表示为:(err(K)- err(K-1))/T.因此,我们可以将第k次采样时PID算法的离线形式表示为:
也可以记录为:
这就是所谓位置PID算法的离散描述公式。我们知道还有一种增量式PID算法,那么我们来推一下增量式PID算法的公式。上述公式描述了第k个采样周期的结果,因此前一时刻,即第k-1个采样周期,可以很容易地表示为:
然后再来说第k个采样周期的增量,显然是U(k)-U(k-1)。所以我们从第k个采样周期的公式中减去第k个采样周期的公式,得到增量式PID算法的表达式:
当然增量PID一定要记住U (k)=U (k-1) U (k)。
3.PID控制器的基本实现
离散化完成后,就可以实现了。用离散数据公式表示后,可重入计算机编程不再是问题。接下来我们用C语言分别实现位置公式和增量公式。
(1)位置PID的简单实现
位置PID的实现是基于前面的位置公式。本节我们只完成最简单的实现,也就是前面的离散位置PID公式的计算机语言。
首先,定义PID对象的结构:
1 /*定义结构和公共机构*/
2
3 typedef结构
四
5 {
六
7浮动设定值;//设置值
八
9浮动比例增益;//比例系数
10
11浮点积分增益;//积分系数
12
13浮点导数增益;//微分系数
14
15浮点lasterror//前一节拍偏差
16
17浮点结果;//输出值
18
19浮点积分;//整数值
20
21 } PID
接下来,实施PID控制器:
1 void PIDRegulation(PID *vPID,浮点处理值)
2
3 {
四
5 float thisError
六
7 this error=vPID-setpoint-process value;
八
9 vPID-integral=this error;
10
11 vPID-result=vPID-proportion gain * this error vPID-integral gain * vPID-integral vPID-derivative gain *(this error-vPID-lasterror);
12
13 vPID-lasterror=this error;
14
15 }
这样实现了最简单的位置PID控制器,当然不考虑任何干扰条件,而只是数学公式的计算机语言。
(2)增量式PID的简单实现
增量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 } PID接下来,实施PID控制器:
void PIDRegulation(PID *vPID,浮点处理值)
{
float thisError
浮动增量;
float pError,dError,iError
this error=vPID-setpoint-process value;//获取偏差值
pError=this error-vPID-lasterror;
iError=thisError
dError=this error-2 *(vPID-lasterror)vPID-preerror;
increment=vPID-proportion gain * pError vPID-integral gain * iError vPID-derivative gain * der error;//增量计算
vPID-preerror=vPID-lasterror;//为下一次操作存储偏差。
vPID-lasterror=this error;
vPID-result=增量;
}这实现了最简单的增量式PID控制器,它不考虑任何干扰条件。只是数学公式的计算机语言。
4.基本特征
描述并实现了PID控制器,包括位置PID控制器和增量PID控制器。下面简单描述一下这两类控制器的特点。
位置PID控制器的基本特性:
位置PID控制的输出与整个过去状态有关,使用偏差的累积值,容易产生累积偏差。类型位置PID适用于带有不带整体部件的执行器的对象。位置的输出直接对应对象的输出,对系统的影响很大。增量式PID控制器的基本特征:
增量式PID算法不需要累加,控制量增量的确定只与最近的偏差值有关,计算偏差的影响较小。增量式PID算法获得的是控制量的增量,对系统的影响相对较小。增量式PID算法易于实现从手动到自动的无扰动切换。欢迎关注:
想更方便及时的阅读相关文章,请关注我的微信微信官方账号【木南创智】
转载请联系作者取得转载授权,否则将追究法律责任。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。