码迷,mamicode.com
首页 > 编程语言 > 详细

PID算法

时间:2015-08-20 18:25:04      阅读:132      评论:0      收藏:0      [点我收藏+]

标签:

PID比例,积分。英文单词的第一个字母的缩写差。

举个例子来解释表面PID,因此,我们有默契感。。

一个人闭眼走路。如果他知道自己离目的地有100米远,那么他就能够以每秒一米一步这种速度走向目的地,100米刚刚好是100步,这是一个非常理想化的现象。

如果他不知道目的地有多远,目的地可能是1000米也有可能是10000米。他用每秒每步3米得速度向前。非常不巧的是这个目的地在80米处,他走了26步时刚刚好差2米。走27步有刚刚好又多出1米,这就是所谓的稳态误差,如果这个人知道目的地在大概15米处得地方,開始这个人以每秒一米一步的速度,走完一步然后目測一下离目的地还有多远。结果发现还剩下大概14米,显然一米一步太慢,因此这个人决定每秒大于一米一步走,得出一条式子,

y=Kpe(t)

当中y为下一次要每步要走的距离。e(t) 为目測距离,也就是偏差,换句话说就是自己走了的距离跟要走的距离也就是目的地的误差,Kp就是一个常数,如果我们把Kp设置为0.5,             

y=KPe(t)能够得出y=7。也就是说那个人下一步要以每秒7米得速度走,反复上述的过程,。7+1共走了8米,然后目測一下距离15米处还有多远,还有7米得误差。所下面一步要走3.5米,然后在反复,发现最后会出现一个稳态的误差。也就是多走一步会超出目的地。少走一步又没到目的地。当然这个上述的样例情况很特殊。大家可能认为最后那些误差能够忽略,可是实际应用中。肯定没有人走路的那么特殊,依照这样的线性比例下去最后得到的误差会很大,所以就引入了一个积分的概念,积分的数学几何定义是在区间[a, b]里连续的非负曲线与直线x=a,x=b围成的图形的面积。

从积分的定义能够得到一个函数

当中Ti为积分时间,e(t)就是误差了。Y就是输出,它是个不定积分,其实把它融入到上述人走路的样例它是个定积分。从0 到t时刻的误差的对时间的积分。也就是说误差曲线e(t)与时间

轴围成的面积,积分时间Ti是一个常量,也就是说是自己规定大小,非常明显,由上式得y为e(t)与t所围成的图形的面积的除以Ti的值,Ti越大y越小,Ti越小y越大。大了系统会动荡,所以要慢慢调节系数。

以下是关于积分跟比例的专业阐述:

比例(P)控制

  比例控制是一种最简单的控制方式。

其控制器的输出与输入误差信号成比例关系。当仅有比例控制时系统输出存在稳态误差(Steady-stateerror)。

  积分(I)控制

  在积分控制中,控制器的输出与输入误差信号的积分成正比关系。对一个自己主动控制系统。假设在进入稳态后存在稳态误差。则称这个控制系统是有稳态误差的或简称有差系统(System with Steady-state Error)。为了消除稳态误差,在控制器中必须引入“积分项”。

积分项对误差取决于时间的积分。随着时间的添加,积分项会增大。

这样,即便误差非常小,积分项也会随着时间的添加而加大,它推动控制器的输出增大使稳态误差进一步减小,直到等于零。

因此,比例+积分(PI)控制器,能够使系统在进入稳态后无稳 态误差。

微分调节就是偏差值的变化率。比如。假设输入偏差值线性变化,则在调节器输出側叠加一个恒定的调节量。大部分控制系统不须要调节微分时间。由于仅仅有时间滞后的系统才须要附加这个參数。

假设画蛇添足加上这个參数反而会使系统的控制受到影响。

 

举个样例,人去调节窝炉的温度。慢慢调节旋钮。使得温度慢慢变大,要使得温度达到某个固定值,人能够慢慢调节,边看温度边调节,假设開始离这个这目标温度远就高速旋旋钮(比例效果),到最后要使得温度误差小就微调(积分效果),然后实际上温度是有一个惯性在那里,開始你以很高速度调节旋钮的时候温度不会突变。不会一下子就达到稳定值。它慢慢添加到最后。可是不是每一个人都是这么有经验,当他看到温度值离目标温度还差这么远。又加快旋转旋钮。终于结果导致实际温度跟目标温度区别很远。微调也跟本没法调整,最后导致系统的不稳定,可是假设这个人很有经验。他事先知道这个温度是有惯性的。開始它高速旋转旋钮看温度上升率很高,也就是温度变化很快。他就放慢旋转速度了,最后结果是准确的把温度调整到最佳(微分效果)。

人能够是这样子,可是计算机可不会这样调节,那么就要通过一个PID得到一个输出值来调节了。

以下是一段关于微分的专业阐述:

 

制器的输出与输入误差信号的微分(即误差的变化率)成正比关系。 自己主动控制系统在克服误差的调节过程中可能会出现振荡甚至失稳。

其原因是因为存在有较大惯性组件(环节)或有滞后(delay)组件,具有抑制误差的作用, 其变化总是落后于误差的变化。

解决的办法是使抑制误差的作用的变化“超前”,即在误差接近零时。抑制误差的作用就应该是零。这就是说,在控制器中仅引入 “比例”项往往是不够的。比例项的作用仅是放大误差的幅值,而眼下须要添加的是“微分项”,它能预測误差变化的趋势,这样,具有比例+微分的控制器,就能 够提前使抑制误差的控制作用等于零,甚至为负值。从而避免了被控量的严重超调。所以对有较大惯性或滞后的被控对象,比例+微分(PD)控制器能改善系统在 调节过程中的动态特性。

 

typedef struct PID

{

int SetPoint; //设定目标 Desired Value

long SumError; //误差累计

double Proportion; //比例常数 Proportional Const

double Integral; //积分常数 Integral Const

double Derivative; //微分常数 Derivative Const

int LastError;//Error[-1]

int PrevError;//Error[-2]

} PID;

 

 

static PID sPID;

static PID *sptr =&sPID;

/*====================================================================================================
Initialize PID Structure  PID
參数初始化
=====================================================================================================*/

void IncPIDInit(void)

{

sptr->SumError = 0;

sptr->LastError = 0; //Error[-1]

sptr->PrevError = 0; //Error[-2]

sptr->Proportion = 0;//比例常数Proportional Const

sptr->Integral = 0; //积分常数Integral Const

sptr->Derivative = 0;//微分常数Derivative Const

sptr->SetPoint = 0;

}

 

/*====================================================================================================
增量式PID计算部分
=====================================================================================================*/

int IncPIDCalc(intNextPoint)

{

register int iError,iIncpid; //当前误差

iError =sptr->SetPoint - NextPoint; //增量计算

iIncpid =sptr->Proportion * iError //E[k]

- sptr->Integral *sptr->LastError //E[k1]

+ sptr->Derivative *sptr->PrevError; //E[k2]

//存储误差,用于下次计算

sptr->PrevError =sptr->LastError;

sptr->LastError =iError;

//返回增量值

return(iIncpid);

}

 

 




版权声明:本文博客原创文章,博客,未经同意,不得转载。

PID算法

标签:

原文地址:http://www.cnblogs.com/gcczhongduan/p/4745854.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!