位置式PID、增量式PID与经典PID控温效果比较

2020-01-12 17:28发布

本帖最后由 coleyao 于 2012-6-7 20:20 编辑

  理想的控温曲线很多人都了解是个啥样子,但要是想用PID控温,得到理想的控温曲线就没那么容易了(通常认为延时越大,升温越快就越不容易控制)。
不过有了PID温控仿真器之后,PID温控就变得很简单了,我在附件中列举了在这三种PID控温方式得到较理想控温曲线时的PID参数(这些参数在升温速率快慢、延时长短、设定温度距离环境温度远近等各种场合适应性较广),大家有空可以自己确认一下(仿真器中温度采集和控温的周期均为1秒)或者亦可尝试寻找一下各种PID控制方式下最佳的PID参数,这三种PID控制方式我个人觉得经典式PID效果最差,尽管在大延时,高升温速率下也能稳定,但控温时间长,波动较大;位置式PID次之,在升温速率30度每分钟,延时达20秒时仍有较理想的控温曲线,缺点是继续增加升温速率或延时时间则会出现振荡;增量式PID最佳,在升温速率40度每分钟,延时达20秒时仍有较理想的控温曲线,缺点同位置式PID(当然这些是我通过仿真软件得到的结论,本人并没有用增量式或位置式PID解决过实际问题,写这个仿真软件的目的一方面是为了交流和学习,另一方面是为了将PID控制的效果和其它方法如PreF_v方法作个比较,我目前在温控系统中实际用过的是改进型的PreF_v方法)。
  当然,我个人的看法是没有最好,只有更好,使用PreF_v控制方法(仅有两个参数PreK和FdK需要调整,并且本身就是时域的方法,而不是像PID那样用频域方法解决时域问题)在升温速率达到70度每分钟,延时达100秒时仍能得到较理想的控温曲线。(注:仿真软件在51分论坛上可以下载,效果请各网友自行评估。)
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
48条回答
bg8wj
1楼-- · 2020-01-15 09:57
 精彩回答 2  元偷偷看……
liudaolunhui
2楼-- · 2020-01-15 15:40
我来冒个泡!!!!!!!
bg8wj
3楼-- · 2020-01-15 16:40
本帖最后由 bg8wj 于 2012-6-9 02:29 编辑

对于软件我仔细看来一下非常好,如果调整一下描述文字会更好,PID经典是否是就是如果是改进成模拟系统仿真为好,位置式建议取消了,PID发展50年来已经否定位置式。
增量的方法我这种算法
/************************************************
              增量控制PID函数体
51单片机最不擅长浮点数计算,转换成int型计算
*************************************************/
unsigned int PIDCalc( struct PID *pp, unsigned int NextPoint )
{
  unsigned int dError,Error,pError;
  //增量法计算公式:
  //Pdt=Kp*[E(t)-E(t-1)]+Ki*E(t)+Kd*[E(t)-2*E(t-1)+E(t-2)]
  Error = set_temper - NextPoint;       // 偏差E(t)
  pError=Error-pp->LastError;         //E(t)-E(t-1)
  dError=Error-2*pp->LastError+pp->PrevError; //E(t)-2*E(t-1)+E(t-2)
  pp->PrevError = pp->LastError;
  pp->LastError = Error;
  return (
            pp->Proportion * pError        //比例
            + pp->Integral *Error  //积分项
            + pp->Derivative * dError          // 微分项
                        );  
}
if (PID>0) then if  ((pwmpointer+PID)<=pwmmax)  then pwmpointer:=pwmpointer+PID;
if (PID<0) then if  (pwmpointer+PID>=0) then pwmpointer:=pwmpointer+PID;
不要用了。
如果要判断的话,那就是公式推导的下一阶段从函数图象来说前期基本上是一阶线性也就是Kp作用比较大,干脆直接自由升温,我一般用目标值与初始值之差的黄金分割界定自由升温临界,过后再用PI控制温升到第二临界点与目标值之差5度,在把Kd微分项引入做完全PID增量控制。减少轻系统振荡。
这就是所谓的带死区的pid控制简单实现,没有看过你软件中的pref_v pref_av(该电脑时间还是辛苦的)不知是否是死区控。
最后
谢谢这位老兄/?大姐
不是大姐,头像是我姑娘的,现在的小孩难管教啊。这才两岁多点,就模仿老爹吸烟。

davidd
4楼-- · 2020-01-15 16:59
bg8wj 发表于 2012-6-8 07:57
软件中提到的PID 位置: 递增量=KP*ET[CountT]-KI*ET[CountT-1]+KD*ET[CountT-2]怎么看也么有搞懂。看来 ...

if (PID>0) then if  ((pwmpointer+PID)<=pwmmax)  then pwmpointer:=pwmpointer+PID;
if (PID<0) then if  (pwmpointer+PID>=0) then pwmpointer:=pwmpointer+PID;
这个在实际控制中还是需要的,她是对控制量的限幅,而不是死区控制。带死区的控制是:当|e(k)|小于死区时,控制量维持不变。
davidd
5楼-- · 2020-01-15 20:52
coleyao 发表于 2012-6-8 20:34
http://www.ourdev.cn/thread-4932148-1-1.html
我的仿真软件中的PID算法部分从该帖子直接摘录过来的, ...

看到了你引用的公式:  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)-2*E(k-1)+E(k-2)],U(k)是绝对量,适用于执行机构需要全量的场合。若去掉公式中的U(k-1),U(k)输出的是增量,适用于执行机构需要增量的场合。

U(k+1) = U(k) + ( KP*E(k) - KI*E(k-1) + KD*E(k-2) )
上式有问题,探讨一下。首先, ( KP*E(k) - KI*E(k-1) + KD*E(k-2) )计算的不是增量。
积分项符号是负的,与常识不符。设K(k-1)>0,说明实际值尚未达到给定值,此项值却是削弱总控制作用。
微分项一定要有差分计算,才能算微分。
比例项也不是E(k)的差分。
总之,这个公式在我看来是对E(k)的三个采样值作了加权处理,然后得出一个控制。不能称之为PID,也许对于温度控制可以用用。
coleyao
6楼-- · 2020-01-16 01:34
 精彩回答 2  元偷偷看……

一周热门 更多>