您好,欢迎访问三七文档
当前位置:首页 > 建筑/环境 > 工程监理 > PID算法原理-PID源码-自整定-及工具
一、PID的数学模型在工业应用中PID及其衍生算法是应用最广泛的算法之一,是当之无愧的万能算法,如果能够熟练掌握PID算法的设计与实现过程,对于一般的研发人员来讲,应该是足够应对一般研发问题了,而难能可贵的是,在很多控制算法当中,PID控制算法又是最简单,最能体现反馈思想的控制算法,可谓经典中的经典。经典的未必是复杂的,经典的东西常常是简单的,而且是最简单的。PID算法的一般形式:二、PID的C语言实现1.位置式PID的C语言实现上边已经抽象出了位置性PID和增量型PID的数学表达式,这里重点讲解C语言代码的实现过程。第一步:定义PID变量结构体,代码如下:structt_pid{floatSetSpeed;//定义设定值floatActualSpeed;//定义实际值floaterr;//定义偏差值floaterr_last;//定义上一个偏差值floatKp,Ki,Kd;//定义比例、积分、微分系数floatvoltage;//定义电压值(控制执行器的变量)floatintegral;//定义积分值}pid;第二部:初始化变量,代码如下:voidPID_init(){pid.SetSpeed=0.0;pid.ActualSpeed=0.0;pid.err=0.0;pid.err_last=0.0;pid.voltage=0.0;pid.integral=0.0;pid.Kp=0.2;pid.Ki=0.015;pid.Kd=0.2;}统一初始化变量,尤其是Kp,Ki,Kd三个参数,调试过程当中,对于要求的控制效果,可以通过调节这三个量直接进行调节。第三步:编写控制算法,代码如下:floatPID_realize(floatspeed){pid.SetSpeed=speed;pid.err=pid.SetSpeed-pid.ActualSpeed;pid.integral+=pid.err;pid.voltage=pid.Kp*pid.err+pid.Ki*pid.integral+pid.Kd*(pid.err-pid.err_last);pid.err_last=pid.err;pid.ActualSpeed=pid.voltage*1.0;returnpid.ActualSpeed;}注意:这里用了最基本的算法实现形式,没有考虑死区问题,没有设定上下限,只是对公式的一种直接的实现,后面的介绍当中还会逐渐的对此改进。到此为止,PID的基本实现部分就初步完成了。下面是测试代码:intmain(){PID_init();intcount=0;while(count1000){floatspeed=PID_realize(200.0);printf(%f\n,speed);count++;}return0;}2.增量型PID的C语言实现上一节中介绍了最简单的位置型PID的实现手段,这一节讲解增量式PID的实现方法。#includestdio.h#includestdlib.hstructt_pid{floatSetSpeed;//定义设定值floatActualSpeed;//定义实际值floaterr;//定义偏差值floaterr_next;//定义上一个偏差值floaterr_last;//定义最上前的偏差值floatKp,Ki,Kd;//定义比例、积分、微分系数}pid;voidPID_init(){pid.SetSpeed=0.0;pid.ActualSpeed=0.0;pid.err=0.0;pid.err_last=0.0;pid.err_next=0.0;pid.Kp=0.2;pid.Ki=0.015;pid.Kd=0.2;}floatPID_realize(floatspeed){pid.SetSpeed=speed;pid.err=pid.SetSpeed-pid.ActualSpeed;floatincrementSpeed=pid.Kp*(pid.err-pid.err_next)+pid.Ki*pid.err+pid.Kd*(pid.err-2*pid.err_next+pid.err_last);pid.ActualSpeed+=incrementSpeed;pid.err_last=pid.err_next;pid.err_next=pid.err;returnpid.ActualSpeed;}intmain(){PID_init();intcount=0;while(count1000){floatspeed=PID_realize(200.0);printf(%f\n,speed);count++;}return0;}3.积分分离的PID控制算法在普通PID控制中,引入积分环节的目的,主要是为了消除静差,提高控制精度。但是在启动、结束或大幅度增减设定时,短时间内系统输出有很大的偏差,会造成PID运算的积分积累,导致控制量超过执行机构可能允许的最大动作范围对应极限控制量,从而引起较大的超调,甚至是震荡,这是绝对不允许的。为了克服这一问题,引入了积分分离的概念,其基本思路是当被控量与设定值偏差较大时,取消积分作用;当被控量接近给定值时,引入积分控制,以消除静差,提高精度。其具体实现代码如下:pid.Kp=0.2;pid.Ki=0.04;pid.Kd=0.2;//初始化过程if(abs(pid.err)200){index=0;}else{index=1;pid.integral+=pid.err;}pid.voltage=pid.Kp*pid.err+index*pid.Ki*pid.integral+pid.Kd*(pid.err-pid.err_last);//算法具体实现过程}4.专家PID和模糊PID从前面的讲解中不难看出,PID的控制思想非常简单,其主要问题点和难点在于比例、积分、微分环节上的参数整定过程,对于执行器控制模型确定或者控制模型简单的系统而言,参数的整定可以通过计算获得,对于一般精度要求不是很高的执行器系统,可以采用拼凑的方法进行实验型的整定。然而,在实际的控制系统中,线性系统毕竟是少数,大部分的系统属于非线性系统,或者说是系统模型不确定的系统,如果控制精度要求较高的话,那么对于参数的整定过程是有难度的。专家PID和模糊PID就是为满足这方面的需求而设计的。专家算法和模糊算法都归属于智能算法的范畴,智能算法最大的优点就是在控制模型未知的情况下,可以对模型进行控制。这里需要注意的是,专家PID也好,模糊PID也罢,绝对不是专家系统或模糊算法与PID控制算法的简单加和,他是专家系统或者模糊算法在PID控制器参数整定上的应用。也就是说,智能算法是辅助PID进行参数整定的手段。专家系统、模糊算法,需要参数整定就一定要有整定的依据,也就是说什么情况下整定什么值是要有依据的,这个依据是一些逻辑的组合,只要找出其中的逻辑组合关系来,这些依据就再明显不过了。下面先说一下专家PID的C语言实现。正如前面所说,需要找到一些依据,还得从PID系数本身说起。三、PID算法参数整定方法1.临界比例度法(1)将调节器的积分时间置于最大,微分时间置零,比例度δ适当,平衡操作一段时间,把系统投入自动运行。(2)将比例度δ逐渐减小,得到等幅振荡过程,记下临界比例度和临界振荡周期值。(3)根据和值,采用经验公式,计算出调节器各个参数,即δ、、的值。(4)按“先P后I最后D”的操作程序将调节器整定参数调到计算值上。若还不够满意,可再作进一步调整。临界振荡整定计算公式2.衰减曲线法在纯比例作用下,由大到小调整比例度以得到具有衰减比(4:1)的过渡过程,记下此时的比例度及振荡周期,根据经验公式,求出相应的积分时间和微分时间。衰减曲线法控制器参数计算表3.经验法根据经验先将控制器参数放在某些数值上,直接在闭合的控制系统中通过改变给定值以施加干扰,看输出曲线的形状,以δ、、,对控制过程的规律为指导,调整相应的参数进行凑试,直到合适为止。长期的生产实践中总结出来的参数表4.经验口诀参数整定找最佳,从小到大顺序查。先是比例后积分,最后再把微分加。曲线振荡很频繁,比例度盘要放大。曲线漂浮绕大湾,比例度盘往小扳。曲线偏离回复慢,积分时间往下降。曲线波动周期长,积分时间再加长。曲线振荡频率快,先把微分降下来。动差大来波动慢。微分时间应加长。理想曲线两个波,前高后低4比1。一看二调多分析,调节质量不会低更多PID资料(链接如果过期请加QQ:951359927)(国内讲解最形象的PID高清视频)(国外简易PID参数整定计算器)
本文标题:PID算法原理-PID源码-自整定-及工具
链接地址:https://www.777doc.com/doc-4341408 .html