PID控制器开发笔记_第1页
PID控制器开发笔记_第2页
PID控制器开发笔记_第3页
PID控制器开发笔记_第4页
PID控制器开发笔记_第5页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

PID控制器开发笔记之二:积分分离PID控制器的实现前面的文章中,我们已经讲述了PID控制器的实现,包括位置型PID控制器和增量型PID控制器。但这个实现只是最基本的实现,并没有考虑任何的干扰情况。在本节及后续的一些章节,我们就来讨论一下经典PID控制器的优化与改进。这一节我们首先来讨论针对积分项的积分分离优化算法。1、基本思想我们已经讲述了PID控制引入积分主要是为了消除静差,提高控制精度。但在过程的启动、结束或大幅度增减设定值时,短时间内系统输出有很大偏差,会造成PID运算的积分累积,引起超调或者振荡。为了解决这一干扰,人们引入了积分分离的思想。其思路是偏差值较大时,取消积分作用,以免于超调量增大;而偏差值较小时,引入积分作用,以便消除静差,提高控制精度。具体的实现步骤是:根据实际情况,设定一个阈值;当偏差大于阈值时,消除积分仅用PD控制;当偏差小于等于阈值时,引入积分采用PID控制。则控制算法可表示为:kU(k)kU(k)=Kperr(k)+工err(j)+/Crf(err(k)戶o—err(k—1))其中0称为积分开关系数,其取值范围为:|err(/c)|<e(左)|>e由上述表述及公式我们可以知道,积分分离算法的效果其实与£值的选取有莫大关系,所以£值的选取实际上是实现的难点,£值过大则达不到积分分离的效果,而£值过小则难以进入积分区,£值的选取存在很大的主观因素。对于经典的增量式PID算法,似乎没有办法由以上的公式推导而来,因为0随着err(k)的变化在不是修改着控制器的表达式。其实我们可以换一种角度考虑,每次系统调节未定后,偏差应该为零,然后只有当设定值改变时,系统才会响应而开始调节。设定值的改变实际上是一个阶跃变化,此时的控制输出记为U0开始调节时,其调节增量其实与之前的一切没有关系。所以我们就可以以变化时刻开始为起点,而得到带积分分离的增量算法,以保证在启动、停止和快速变化时防止超调。公式如下:二Kp(err(k)-err(k-1))+|3K梓件伙)+Kd(err(k)—2err(k-1)+err(k—2))其中0的取值与位置型PID算法一致。可能有人会担心偏差来回变化,造成积分作用的频繁分离和引入,进而使上述的增量表达式无法实现。其实我们分析一下就能发现,在开始时,由于设定值变化引起的偏差大而分离了积分作用,在接近设定值时,偏差变小就引入了积分,一边消除静差,而后处于稳态,直到下一次变化。

2、算法实现这一部分,我们根据前面对其基本思想的描述,来实现基于积分分离的PID算法实现,同样是包括位置型和增量型两种实现方式。首先我们来看一下算法的实现过程,具体的流程图如下:|e(k)|<e否是更新数据输出PID控制器PD控制器结束开始|e(k)|<e否是更新数据输出PID控制器PD控制器结束开始采集数据计算偏差或k)有上图我们知道,与普通的PID算法的区别,只是判断偏差的大小,偏差大时,为PD算法,偏差小时为PID算法。于是我们需要一个偏差检测与积分项分离系数0的函数。staticuint16_tBetaGeneration(floaterror,floatepsilon){uint16_tbeta=0;if(abs(error)<=epsilon)beta=1;}returnbeta;}(1)位置型PID算法实现根据前面的分析我们可以很轻松的编写程序,只需要在编写程序时判断偏差以确定是否引入积分项就可以了。同样先定义PID对象的结构体:/*定义结构体和公用体*/typedefstruct{floatsetpoint; //设定值floatproportiongain; //比例系数floatintegralgain; //积分系数floatderivativegain; //微分系数floatlasterror; //前一拍偏差floatresult;//输出值floatintegral;//积分值floatepsilon;//偏差检测阈值}PID;接下来实现PID控制器:voidPIDRegulation(PID*vPID,floatprocessValue){floatthisError;thisError=vPID->setpoint-processValue;vPID->integral+=thisError;uint16_tbeta=BetaGeneration(error,vPID->epsilon);if(beta>0)vPID->result=vPID->proportiongain*thisError+vPID->derivativegain*(thisError-vPID->lasterror);}else{vPID->result=vPID->proportiongain*thisError+vPID->integralgain*vPID->integral+vPID->derivativegain*(thisError-vPID->lasterror);}vPID->lasterror=thisError;}与普通的PID算法的区别就是上述代码中增加了偏差判断,来决定积分项的分离与否。(2)增量型PID算法实现对于增量型PID控制,我们也可以采取相同的处理。首先定义PID对象的结构体:/*定义结构体和公用体*/typedefstruct{floatsetpoint; //设定值floatproportiongain; //比例系数floatintegralgain; //积分系数floatderivativegain; //微分系数floatlasterror; //前一拍偏差floatpreerror; //前两拍偏差floatdeadband; //死区floatresult;//输出值floatepsilon;//偏差检测阈值}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;uint16_tbeta=BetaGeneration(error,vPID->epsilon);if(beta>0){increment=vPID->proportiongain*pError+vPID->derivativegain*dError;//增量计算}else{increment=vPID->proportiongain*pError+vPID->integralgain*iError+vPID->derivativegain*dError;//增量计算}vPID->preerror=vPID->lasterror;//存放偏差用于下次运算vPID->lasterror=thisError;vPID->result+=increment;}这就实现了增量型PID控制器积分分离算法,也没有考虑任何的干扰条件,仅仅只是对数学公式的计算机语言化。3、总结积分分离算法的思想非常简单。当然,对于0的取值,很

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论