您好,欢迎访问三七文档
当前位置:首页 > 金融/证券 > 投融资/租赁 > 设计系统PID算法的方法软件编写PID详解
这个是PID公式:U(k+1)=U(k)+(KP*E(k)-KI*E(k-1)+KD*E(k-2))对你的系统而言,U(k)就是当前占空比。我这里先假定你的占空比对应定时器寄存器设置范围是0-65535.同时假定定时器设置为0的时候,占空比输出为0%,全部是低电平,完全不加热。65535的时候,占空比输出100%,全速加热。E(k)是当前温度和设定温度的误差值E(k-1)是上次计算时的误差值E(k-2)是上上次计算时的误差值由于KP,KI,KD三个系数现在都不知道。需要整定,有自动整定,也有手动整定。我们先采取手动整定的方案。我们现在可以知道温度相差40℃,显然,需要比较快速的加热。水温在正常系统使用的时候,显然是0-100℃的。而你们这里需要目标温度是30-60℃,故最大加热的差值可以认为是60-0=60。(假定不是冰,是水开始加热)。我们可以认为,在需要最大加热差值的时候,仅用比例控制应当是开启全速加热。所以我们可以得到一个KP的估计值。KP=65535/60=1000左右。这个意思是最大温差对应最快加热速度。然后,假设KI=800,KD=300;注意,系数需要根据实际情况来整定,此为假设。好,现在假定设置需要温度是60℃,而当前温度是20℃。那么可以知道第一次U(k)=0---最开始是没有占空比输出的。所以是占空比是0E(k)=60-20=40---第一次的误差E(k-1)=0---还没有上次,所以初始化为0E(k-2)=0---还没有上上次,所以初始化为0由于KP假定是1000,所以U(k+1)=40*1000=40000所以,现在就可以按照占空比40000来加热了。由于热系统是一个缓慢变化的系统,所以,加热需要一段时间才可以看到效果,假设采用固定间隔时间来设计。这里取5秒。5秒过后,假定温度上升了5℃,当前温度为25℃。则计算第二次占空比过程。第二次U(k)=40000E(k)=60-25=35E(k-1)=40E(k-2)=0U(k+1)=40000+35*1000-40*800+0=43000(加热加速了)又过了5秒,假定温度上升了6℃。当前温度为29℃第三次U(k)=43000E(k)=60-31=29E(k-1)=35E(k-2)=40U(k+1)=43000+29*1000-35*800+40*300=56000(2个周期以后还未达到指定温度,加热继续加速)继续计算第四次,第五次,第N次即可。显然,要一直到出现超调,才会出现加热速度放慢甚至不加热。若不允许超调,则需要增加一些门限控制。那就不在标准的PID讨论范围以内了。以上是算法部分。以下来讨论整定部分。看系数是否合理,需要通过实验观察。关于系数的整定,有一些工程的方法。你可以对自己的系统来摸索摸索。整定的时候,先用整定比例系数。先不给积分,微分系数赋值,然后看加热速度有多快。这个快慢就主要看的是几个整定周期达到目标温度。先不考虑超调的问题。所以,你需要先对整个系统做实验,先看全速加热需要多久才可以把温度由0℃加热到60℃。全速加热把温度从0℃加热到60℃所需要的时间设置为T,那么我们的整定周期就可以根据T来设置了。假设整定周期为T/10。(事实上,整定周期还可以根据偏差值来做动态调整,显然温度越接近目标值,整定周期就需要越短,非标PID不在继续深入,仅仅做一个简单提示)然后以此来设置不同的KP比例系数,看KP设置为多少,可以接近10个整定周期达到同等加热速度,这样得到的KP就是一个比较合理的KP了。然后再来看KI的整定,看KI设置成多少,可以让超调大约在根号2左右,也就是说最大只有超调41%,这样得到的KI就是比较合理的。当然,如果系统温度不允许超调41%,那就需要修改KI来实现了。最后来整定KD,看KD设置成多少,可以让最终稳定温度和设置温度的偏差达到要求,比如偏差在0.5℃以内。这个就看你的需求了。故,你的代码需要记录整定的时候,PID算法运行的次数,以及每次整定的时候所得到的温度偏差。通过串口发送出来做记录。根据这些记录来选取合适的KP,KI,KD。以上介绍了关于PID算法和整定的方案。总的思路应该是比较清晰的,实际应用的时候,需要根据自己的需求多做做修改。4楼的公式U(k+1)=U(k)+(KP*E(k)-KI*E(k-1)+KD*E(k-2))有点问题,PID公式是U(k)=U(k-1)+{KP*[E(k)-E(k-1)]+KI*E(k)+KD*[E(k)+E(k-2)-2*E(k-1)]}整理一下是U(k)=U(k-1)+aE(k)-bE(k-1)+cE(k-2),其中,a=KP+KI+KD,b=KP+2KD,c=KD;大家发现和4楼的公式差不多,有木有。调整a,b,c值也就是调整KP,KI,KD值,但还是不要混为一谈,毕竟KP,KI,KD通常都是分别代表比例项,积分项,微分项系数。后面整定的思路是根据KP,KI,KD的意义来整定的,而不是a,b,c,这也是不要混淆的原因。我把PID的公式稍微解释一下:时域标准的PID公式为:y(t)=Kp*e(t)+Ki*∫(e(t))dt+Kd*d(e(t))/dt把上面的标准公式转换为数字形式是,一般有两种主要形式(1)独立积分式,这种方法把积分器独立出来,i(t)=Ki*∫(e(t))dt转换为:i(k)=i(k-1)+e(k)最后把比例,积分,微分三个部分叠加在一起y(k)=Kp*e(k)+Ki*i(k)+Kd*(e(k)–e(k-1))(2)增量式:对标准的PID公式微分后,可得:dy=Kp*de+Ki*e+Kd*dde离散化后得:dy(k)=y(k)–y(k-1)=Kp*(e(k)–e(k-1)+Ki*e(k)+Kd*(e(k)-2*e(k-1)+e(k-2))即:dy(k)=y(k)–y(k-1)=(Kp+Ki+Kd)*e(k)+(-Kp-2*Kd)*e(k-1)+Kd*e(k-2)独立积分式与增量式其实是一个公式,各自表述,没有本质的区别,我们可以从独立积分式导出增量式:y(k)=Kp*e(k)+Ki*i(k)+Kd*(e(k)–e(k-1))y(k-1)=Kp*e(k-1)+Ki*i(k-1)+Kd*(e(k-1)–e(k-2))上述两个公式相减可得:dy(k)=y(k)–y(k-1)=(Kp+Ki+Kd)*e(k)+(-Kp-2*Kd)*e(k-1)+Kd*e(k-2)从实际应用角度来看,独立积分式略微更简单些,因为没有e(k-2)项。
本文标题:设计系统PID算法的方法软件编写PID详解
链接地址:https://www.777doc.com/doc-2024989 .html