
pid公式
双液注浆-个人申请书模板
2023年2月21日发(作者:社保证明模板)PID算法原理及基本实现
PID算法原理及基本实现
在⾃动控制中,PID及其衍⽣出来的算法是应⽤最⼴的算法之⼀。各个做⾃动控制的⼚家基本都有会实现这⼀经典算法。我们在做项⽬的过
程中,也时常会遇到类似的需求,所以就想实现这⼀算法以适⽤于更多的应⽤场景。
1、PID算法基本原理
PID算法是控制⾏业最经典、最简单、⽽⼜最能体现反馈控制思想的算法。对于⼀般的研发⼈员来说,设计和实现PID算法是完成⾃动控制
系统的基本要求。这⼀算法虽然简单,但真正要实现好,却也需要下⼀定功夫。⾸先我们从PID算法最基本的原理开始分析和设计这⼀经典
命题。
PID算法的执⾏流程是⾮常简单的,即利⽤反馈来检测偏差信号,并通过偏差信号来控制被控量。⽽控制器本⾝就是⽐例、积分、微分三个
环节的加和。其功能框图如下:
根据上图我们考虑在某个特定的时刻t,此时输⼊量为rin(t),输出量为rout(t),于是偏差就可计算为err(t)=rin(t)-rout(t)。于是PID的基本
控制规律就可以表⽰为如下公式:
其中Kp为⽐例带,T为积分时间,T为微分时间。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算法的离线形式表⽰为:
也可以记为:
ID
这就是所谓的位置型PID算法的离散描述公式。我们知道还有⼀个增量型PID算法,那么接下来我们推到⼀下增量型PID算法的公式。上⾯的
公式描述了第k个采样周期的结果,那么前⼀时刻也就是k-1个采样周期就不难表⽰为:
那么我们再来说第K个采样周期的增量,很显然就是U(k)-U(k-1)。于是我们⽤第k个采样周期公式减去第k-1个采样周期的公式,就得到了
增量型PID算法的表⽰公式:
当然,增量型PID必须记得⼀点,就是在记住U(k)=U(k-1)+∆U(k)。
3、PID控制器的基本实现
完成了离散化后,我们就可以来实现它了。已经⽤离散化的数据公式表⽰出来后,再进型计算机编程已经不是问题了。接下来我们就使⽤C
语⾔分别针对位置型公式和增量型公式来具体实现。
(1)位置型PID的简单实现
位置型PID的实现就是以前⾯的位置型公式为基础。这⼀节我们只是完成最简单的实现,也就是将前⾯的离散位置型PID公式的计算机语⾔
化。
⾸先定义PID对象的结构体:
1/*定义结构体和公⽤体*/
2
3typedefstruct
4
5{
6
7floatsetpoint;//设定值
8
9floatproportiongain;//⽐例系数
10
11floatintegralgain;//积分系数
12
13floatderivativegain;//微分系数
14
15floatlasterror;//前⼀拍偏差
16
17floatresult;//输出值
18
19floatintegral;//积分值
20
21}PID;
接下来实现PID控制器:
1voidPIDRegulation(PID*vPID,floatprocessValue)
2
3{
4
5floatthisError;
6
7thisError=vPID->setpoint-processValue;
8
9vPID->integral+=thisError;
10
11vPID->result=vPID->proportiongain*thisError+vPID->integralgain*vPID->integral+vPID->derivativegain*(thisError-vPID->lasterror);
12
13vPID->lasterror=thisError;
14
15}
这就实现了⼀个最简单的位置型PID控制器,当然没有考虑任何⼲扰条件,仅仅只是对数学公式的计算机语⾔化。
(2)增量型PID的简单实现
增量型PID的实现就是以前⾯的增量型公式为基础。这⼀节我们只是完成最简单的实现,也就是将前⾯的离散增量型PID公式的计算机语⾔
化。
⾸先定义PID对象的结构体:
1/*定义结构体和公⽤体*/
2
3typedefstruct
4
5{
6
7floatsetpoint;//设定值
8
9floatproportiongain;//⽐例系数
10
11floatintegralgain;//积分系数
12
13floatderivativegain;//微分系数
14
15floatlasterror;//前⼀拍偏差
16
17floatpreerror;//前两拍偏差
18
19floatdeadband;//死区
20
21floatresult;//输出值
22
23}PID;
接下来实现PID控制器:
voidPIDRegulation(PID*vPID,floatprocessValue)
{
floatthisError;
floatincrement;
floatpError,dError,iError;
thisError=vPID->setpoint-processValue;//得到偏差值
pError=thisError-vPID->lasterror;
iError=thisError;
dError=thisError-2*(vPID->lasterror)+vPID->preerror;
increment=vPID->proportiongainpError+vPID->integralgainiError+vPID->derivativegain*dError;//增量计算
vPID->preerror=vPID->lasterror;//存放偏差⽤于下次运算
vPID->lasterror=thisError;
vPID->result+=increment;
}
这就实现了⼀个最简单的增量型PID控制器,也没有考虑任何的⼲扰条件,仅仅只是对数学公式的计算机语⾔化。
4、基本特点
前⾯讲述并且实现了PID控制器,包括位置型PID控制器和增量型PID控制器。界限来我们对这两种类型的控制器的特点作⼀个简单的描述。
位置型PID控制器的基本特点:
位置型PID控制的输出与整个过去的状态有关,⽤到了偏差的累加值,容易产⽣累积偏差。
位置型PID适⽤于执⾏机构不带积分部件的对象。
位置型的输出直接对应对象的输出,对系统的影响⽐较⼤。
增量型PID控制器的基本特点:
增量型PID算法不需要做累加,控制量增量的确定仅与最近⼏次偏差值有关,计算偏差的影响较⼩。
增量型PID算法得出的是控制量的增量,对系统的影响相对较⼩。
采⽤增量型PID算法易于实现⼿动到⾃动的⽆扰动切换。