amobbs.com 阿莫电子技术论坛

标题: 温控PID参数调节实验过程 [打印本页]

作者: fsmcu    时间: 2008-3-9 09:30
标题: 温控PID参数调节实验过程
对于温度控制系统参数的整定过程及方法,搜索了很多论坛,大家都只提到PID数学原型,很少看到有实验过程及Kp,Ki,Kd参数的整定过程及方法,这2天闲着没事,来做个温度控制实验,并将一些实验过程写上来,我也是正在摸索阶段,希望大家踊跃发言哟,各位有好的建议尽管提出来,然后我来实验,将实验数据整理上来,希望对于以后想做温度控制的朋友有所帮助

硬件:
1。用可控硅控制200W加热丝,对一铁块加热,用K型热电偶采集温度,采用MAX6675做温度转换,可以到0。25度的精度,并且外围很简单,很容易与CPU对接,采用SPI通信,读取当前的温度值
2。过零检测电路,将交流信号全波整流后得到的波形去控制NPN管,将信号整形后接到CPU外部中断脚,为系统提供基准时间,所以CPU中断的频率是100HZ

实验目标:
在100度到200度内可对任意设定的温度恒温,精度先做到+/-1度吧

基本的控制实现方法:
因为是对加热的铁块温度进行控制,属于滞后效应系统,所以采样周期先定为5秒(这里指的是PID计算的周期,注意我的温度采样是时时的),所以CPU外部中断次数为500次,对应的PID计算结果输出为0~500,就是说把这5秒钟划分为500等份,根据计算的结果来决定在这5秒钟内应该加热多少等份

软件:
采用PID控制方法,我先采用位置式输出方式,公式原型:u(t) = kp * e(t) + ki * [e(1) + e(2) + ....+ e(t)] + kd * [e(t) - e(t-1)],这里先做基本的PID算法,达到控制目标后再来优化算法提高恒温精度,考虑到实验温度过高实验时间会过长,所以我先定目标控制温度为110度,等控制好了再看其他温度会达到多少精度,为了提高加热速度提前20度开始PID控温

下面是调节参数的过程及数据:
参照网上一些方法,先确定Kp,即令Ki,Kd=0,只用比例调节,得到一个稳定的越接近控制目标的震荡参数,然后根据这个Kp和震荡周期来计算Ti,Td,
作者: fsmcu    时间: 2008-3-9 09:35
第1次:Kp=2.5,测试数据如下见图片:Y坐标为温度值,放大了10倍,X坐标为时间每5秒一个点,
1
作者: fsmcu    时间: 2008-3-9 09:39
第2次:Kp=5
1
作者: chendaon    时间: 2008-3-9 09:43
好东东,顶
作者: makesoft    时间: 2008-3-9 10:10
支持

铁块的质量是多少啊?
作者: fsmcu    时间: 2008-3-9 10:28
第3次:Kp=8。5,这次的测试时间比较长,因为比较接近稳定震荡了,图片如下:
1
作者: fsmcu    时间: 2008-3-9 11:28
第4次:Kp=9,从图片已经基本稳定,下次再测试一下9.3这个值
1
作者: ecat    时间: 2008-3-9 11:43
楼主继续!
作者: Remond    时间: 2008-3-9 11:57
标记。呵呵
作者: fangmcu    时间: 2008-3-9 11:58
好东西,期待!!
作者: kdtcf    时间: 2008-3-9 13:51
楼主加油!好啊
作者: fsmcu    时间: 2008-3-9 13:52
第5次实验结果,Kp=9.3,从图上分析,震荡幅度稍比9的大点,但是上下幅度比较均匀,所以先确定Kp为9~9.3之间
1
作者: fsmcu    时间: 2008-3-9 14:17
现在整理了一下Kp=9和Kp=9.3的震荡周期,图片分析如下
1
从数据看震荡周期基本都是48~43个点,每个点是5秒,所以震荡周期为225秒


接下来根据下面典型参数计算表:
Ziegler-Nichols参数

控制器                Kp                Ti                Td
P                0.50*Kc                /                /
PD                0.65*Kc                /                0.12*Pc
PI                0.45*Kc                0.85*Pc                /
PID                0.65*Kc                0.5*Pc                0.12*Pc

我先做PD实验:
根据临界增益KC=9.2 震荡周期Pc=225秒,计算出Kp=5.98,Td=27秒,公式Kd=Kp*Td/T=5.98*27/5=32.392

期待实验结果。。。

忘了回答4楼的问题:重量2斤
作者: passerby    时间: 2008-3-9 14:59
很好,顶顶.
作者: fsmcu    时间: 2008-3-9 15:16
实验结果出来了,见下图
1

从图片数据分析最终稳定温度为:109度,上下波动为0。5度,而我的设定目标温度为110,说明这里引入了2度的稳太误差
需要加入积分调节器才能消除这个稳态误差

计算Ti=112.5秒,根据公式:Ki=Kp*T/Ti=5.98*5/112.5=0.265

下面加入PID调节,看实验结果如何?
作者: ecat    时间: 2008-3-9 15:47
期待中!
作者: fsmcu    时间: 2008-3-9 16:33
下面是加入积分分离法的PID算法实验结果
从图中数据看出已经符合设计要求,在110度稳定精度为+/-0。5,等一下看看其他设定温度的控制效果
1
作者: oilgas    时间: 2008-3-9 16:49
继续加油
作者: steven    时间: 2008-3-9 17:22
不错,有理论有实例,还有实验数据,谢谢楼主的无私分享!
作者: chenfei    时间: 2008-3-9 17:38
期待,正好最近有人让我帮忙做温度控制
作者: fsmcu    时间: 2008-3-9 17:46
下面是180度目标的控温效果,恒温时为180,+/-0.5度的误差,基本已经满足要求
1

以上就是今天的全部实验过程,如何去调节PID的三个参数,希望对大家有所帮助!

今天累了一天了,先休息一下啦,各位有什么好的建议可以随时交流!
作者: chendaon    时间: 2008-3-9 18:49
楼主的表是用什么生成的?????
作者: fsmcu    时间: 2008-3-9 19:06
将采集的时时温度传到PC,然后导入到EXCEL中再用图表分析功能做成的
作者: ecat    时间: 2008-3-9 20:20
刚好前天我买了个温控器,昨天接了一个电炉,烧一碗水,温度控制在50度,测试了一下,PID参数自整定的,由于没有保温,温度有点波动,效果还算满意。上个照片。
1
作者: D138138    时间: 2008-3-9 20:59
我以前给别人做过一个烤烟房温度控制系统,使用的就只有比例系数KP,积分和微分都没有使用.控制精度基本可以用.请问楼主积分,微分部分怎么处理的,能否共享一下具体PID算法的代码.
作者: mfm123    时间: 2008-3-9 21:25
不错,支持,正想学习pid....多交流啊
作者: lvhaian    时间: 2008-3-10 00:34
留意
作者: szmmgg    时间: 2008-3-10 00:40
学习pid....在做控温方面的
作者: yzz163    时间: 2008-3-10 01:19
标记。
作者: makesoft    时间: 2008-3-10 08:03
强烈要求版主置本帖“酷”

好帖的概念绝不是仅仅有电路图以及程序。
作者: xiaowei0588    时间: 2008-3-10 08:06
标记!
作者: poppush    时间: 2008-3-10 11:47
好  不错
作者: liqu    时间: 2008-3-10 11:52
好  不错
作者: hitsxg    时间: 2008-3-10 23:17
优秀的概念分析,可怜我一个控制专业的人,概念还没有你这么清晰.
作者: fsmcu    时间: 2008-3-11 09:30
谢谢大家来捧场!,咦,分析的这么努力,还没有穿上裤子啊,哈哈!
这个星期有时间再来理论结合实践分析一下:PID参数自整定方法
作者: mahui625    时间: 2008-3-11 10:23
没代码 没电路 只是结果分析 不可能给酷的
作者: mahui625    时间: 2008-3-11 10:25
pid的难度在于把理论怎么用于实际问题上,自动控制我也学过了,但是只能理论,实践不知道怎么下手。
作者: linjpxt    时间: 2008-3-11 13:32
感觉不错,支持,个人认为这些不一定非要代码,电路的.
作者: mig29    时间: 2008-3-11 14:04
这样的帖子不需要完整代码的。重要的是控制算法和试验思路。

楼主已经_文字说明了电路连接关系,也已经说了,是在5S中得到500次过零中断,输出的控制结果是【这500次过零中,可控硅需要完全导通多少次】,用的是控制导通周期个数,而不是调导通角。

提问,
1. 应该需要平均分配导通的周期。比如结果是只需要导通50次,那么应该1次开9次关,比50次开450次关要好吧?

2.  用K型热电偶采集温度,采用MAX6675做温度转换,可以到0。25度的精度
===>记忆中,K型热电偶的精度不会高过1度的,应该是“MAX6675可以提供0.25度的分辨率”,
精度可以校正,分辨率就只能要原始传感器及其电路的处理了。比如热敏电阻精度不高,但是可以提供0.1度的分辨率。
另外,不知道现在的热电偶的重复性如何,因为用于体温计的热敏电阻重复性是足够好的。

3.  控制可控硅,需要跟大家解释一下你的安全措施,比如跟PC的串口是怎么隔离的,,,,或者你是采用光耦隔离触发可控硅?
作者: fsmcu    时间: 2008-3-11 18:10
我的硬件系统是51单片机通过光耦触发可控硅来实现给电热丝供电,并且检测交流电过零,控制导通周期,至于上面看到的数据解析图片,是单片机通过串口将时时温度数据传递给PC,然后保存起来用EXCEL软件分析,温度走势,看PID的控温效果,等一下我将实验图片上传。下面是控制解析图,不知道表达清楚不?
1
作者: ecat    时间: 2008-3-11 22:43
这个帖子绝对可以换条裤子了。鱼和渔的关系想必大家都知道吧。
作者: makesoft    时间: 2008-3-12 00:54
呵呵,估计阿莫也是一个认死理的人 :-)
作者: 51mcu51    时间: 2008-3-12 09:08
阿莫,不要太小气了,应该要给条裤子了
作者: szxszx    时间: 2008-3-12 09:42
楼主很强,能否做成pdf文件。
作者: paulw    时间: 2008-3-12 09:53
PID用C51实现的代码在网上找找,一大堆!
作者: sunmake    时间: 2008-3-13 09:54
期待楼主发布源码
作者: yzz163    时间: 2008-3-15 00:18
源码+电路+分析,就更酷了。
作者: plc_avr    时间: 2008-3-15 07:57
PID用C51实现的代码在网上找找是一大堆!但是就是没有见到AVR的,对于高手来说简单,但对于和我一样半路出身,只会AVR的兄弟来说确实是一个高难度的东西,原理是懂一点,但是应用到实践中就不会了。从本贴里加深了对PID的理解,谢谢楼主。
期待楼主发布源码 + 电路,这样会有更多的人受益。
作者: chuyu111    时间: 2008-3-15 09:17
pid理解好了 很有用  

很多场合pi或pid足够用了
作者: bjtuwei    时间: 2008-3-15 09:24
留一份纪念
作者: our_avr    时间: 2008-3-15 10:56
波形图做的很漂亮
作者: 82587299    时间: 2008-3-15 11:30
谢谢楼主给我们这么精彩的分析,但我还想问个问题,在位置式中整定的参数是否能用于全量式?
作者: fsmcu    时间: 2008-3-15 21:18
PID的源代码在网上基本都是公开的,既然大家都希望看一看,我还是贴出来吧,估计看了也很失望,因为我的也是网上的代码一模一样的,既然数学模型已经建立,程序只是把这个模型用语言把他表达出来而已,其实很多人PID实验不成功,就是没有仔细去分析参数的调节过程,我是想通过上面的实验过程来给大家一个思路去如何调节这几个参数,而不是在网上到处搜索源程序,然后抱怨下载的PID源程序都不能满足自己的调节要求。
经过实验发现:位置式整定的参数不能直接用在增量式上面,会出现超调的时间居多,无法稳定在目标值上

//PID计算
UINT16 PID_Cal(void)
{
        float xdata pterm,iterm,dterm;

        //把当前的温度和设定的目标温度定义好
        ppid->pv = SystemRealTemprature;
        ppid->sp = SystemSetTemprature;

        //根据实验得出:Kp=5.98 T=5 Td=27 Ti=112.5

        //PID数学模型
        //u(t) = kp * e(t) + ki * [e(1) + e(2) + ....+ e(t)] + kd * [e(t) - e(t-1)]
       
        ppid->errk = (float)(ppid->sp - ppid->pv);

        pterm = ppid->kp * ppid->errk;

        ppid->sum += ppid->errk;               
        iterm = ppid->ki * ppid->sum;
       
        dterm = ppid->kd * (ppid->errk - ppid->errk_1);

        ppid->Last_Out = pterm + iterm + dterm;

        ppid->errk_2 = ppid->errk_1;
        ppid->errk_1 = ppid->errk;

        if(ppid->Last_Out > SampleT)
                ppid->Last_Out = SampleT;
        else if(ppid->Last_Out < 0)
                ppid->Last_Out = 0;

        printf("%d   p=%d   i=%d   d=%d   ",SystemRealTemprature, (int)pterm, (int)iterm, (int)dterm);
        printf("H=%d\n", (UINT16)ppid->Last_Out);

        return        (UINT16)ppid->Last_Out;
}
作者: Popo    时间: 2008-3-15 21:37

作者: mikezfq    时间: 2008-3-16 19:41
楼主,想讨教一下, PID_Cal()里的T为5秒,那么在main()主程序里是否每5秒运行一次 PID_Cal()?
作者: bentlet    时间: 2008-3-16 21:35
我也接了个这个项目啊,刚开始起步,楼主好厉害啊,有空交流
作者: bentlet    时间: 2008-3-16 21:46
老实说用8位来做浮点运算还真不爽,不过C不像以前用汇编来写了,都有库函数,也没什么关系
作者: fsmcu    时间: 2008-3-16 22:23
回55楼:
main()主程序里是每5秒运行一次 PID_Cal()
作者: shaozh    时间: 2008-3-16 22:45
关注!
作者: sunny1500    时间: 2008-3-16 23:10
好东东,收藏了
作者: sea_19821    时间: 2008-3-17 00:34
好东西,顶楼主。
作者: LOVEMCU    时间: 2008-3-17 09:34
PID的调节方法其实很简单,只是要花点时间而已.控制的效果如何,主要取决于选用的sensor和ADC芯片.秀一下偶做的一个项目,温度的精度可以做到0.1摄氏度以内,从常温加热到75摄氏度的时间在3分钟之内(这个时间参数很重要的).

   1
作者: mcu5i51    时间: 2008-3-17 12:20
想找PID自整定方面的资料,关注中
作者: LOVEMCU    时间: 2008-3-17 13:12
楼上的朋友,发个资料给你参考一下。
  
   点击此处打开ourdev_232355.pdf(文件大小:264K)
作者: luan_dahai    时间: 2008-3-17 13:17
好,就一个字!
作者: LOVEMCU    时间: 2008-3-17 13:38
关于温度传感器部分还想说两句。大部分sensor的阻值与温度的关系都不是线性的,可以根据具体的要求采用不同的方法来解决。当要求精度比较高时,可以采用查表(这个是最麻烦的)或者分段插值的方法;当要求精度不是很高时,可以将关系曲线分成简单的几段,分别采用近似的线性或者对数关系来处理。
   下图是我用到的几款sensor的阻值与温度的关系曲线:
  1
作者: bjj9217    时间: 2008-3-17 14:18
好东西!
作者: LOVEMCU    时间: 2008-3-18 10:27
up!
作者: kexinqiji    时间: 2008-3-18 15:34
好东西收藏了
作者: xiangjing    时间: 2008-3-18 17:06
期待,现在PID算法很重要!不知那位高手能来个全面的讲解!
作者: baoshan    时间: 2008-3-18 18:31
PID算法分位置式PID、增量式PID、积分分离式PID
曾经用51控制温度的程序(增量式):
          ei=sv-20*pv;
      q0=K*(ei-ex);
             if(Ti==0)
          q1=0;
          else
          q1=K*0.001*Ts*ei/Ti;
          q2=1000*K*Td*(ei-2*ex+ey)/Ts;
      ey=ex;
      ex=ei;
      op=op+q0+q1+q2;   
          if(op>4.5)
          {op=4.5;}
          if(op<1)
          {op=1;}
作者: baoshan    时间: 2008-3-18 18:34
控制在140度的图片:
1
作者: LOVEMCU    时间: 2008-3-19 08:57
楼上的过冲太大了点吧。P和I的系数还可以再调调。
作者: fengye8384    时间: 2008-4-1 15:04
mark!
作者: dicat    时间: 2008-4-1 15:20
思路才是最重要的,谢谢楼主
作者: cgbabc    时间: 2008-4-21 23:05
做个记号
作者: goldrained    时间: 2008-4-21 23:11
ok
作者: jaky80000    时间: 2008-4-22 12:18
留个记号
作者: mymach    时间: 2008-4-22 13:06
好帖!!
收藏~~~~~~~~~
作者: chenqianglight    时间: 2008-4-22 13:18
顶成 COOL
作者: china_china    时间: 2008-4-23 18:31
收益不小,不顶不行啊!!!
作者: eagle5555    时间: 2008-4-28 23:12
我也想做一下,问一下硬件部分的光耦和可控硅怎么连的,有没有相关资料啊?它们的型号是什么样的?
作者: chuyu111    时间: 2008-4-28 23:59
好东东 再顶一次
作者: zhanjay    时间: 2008-4-29 00:57
mark
作者: dvhome    时间: 2008-4-29 15:59
PID控制 好帖子,很实用

留个记号
作者: jevenhuang    时间: 2008-4-29 19:13
mark ! thanks !
作者: tkdr2001    时间: 2008-4-29 21:07
.
作者: lbing2002    时间: 2008-4-29 22:32
好东东 mark
作者: blackcafe    时间: 2008-4-30 08:20
好贴!整理收藏!
点击此处下载 ourdev_262563.pdf(文件大小:707K) (原文件名:对于温度控制系统参数的整定过程及方法.pdf)
作者: eagle5555    时间: 2008-5-1 08:23
谢谢楼上的,我收了
作者: wzavr    时间: 2008-5-1 11:30
授人以鱼不如授人以渔
作者: segar    时间: 2008-5-21 13:48
我也正在调PID控制
再请教一下楼主,你的输出量是0-500变化量,是如何让PID实现的?我通过PID算出来是值怎么有正负的整数?
作者: gx_huang    时间: 2008-5-21 22:12
看了这个帖子,强!
终于发现自己的数学都忘光了,只会做实验不会整理数据了。
楼主,能否做以下实验:
1、把输出周期加大到20秒左右,适合继电器工作
2、把铁块改为铝块,或者减少铁块重量
3、加大加热功率,从200W改为500W或者更大
4、在铁块上泼一些冷水,看是否会振荡
5、当室温在25度时,要求控制温度在30-35度,此时加热输出也许只要0.5%,看能否稳定住
6、当铁块的形状比较长时,加热丝和传感器距离比较远,滞后比较大时,会振荡吗?

请楼主不要怪我提这么多问题,这些问题都是我在实际中遇到的,不解决这些问题,就无法商用!
作者: chuchu3030    时间: 2008-5-21 22:26
哈哈 ,发现一个有经验的人了,他就是----------93楼的
作者: phone    时间: 2008-5-21 22:29
初学者,不知道如何查表法来实现pid.
作者: chuchu3030    时间: 2008-5-21 22:50
模糊PID,就是查表的
作者: Jacky    时间: 2008-5-21 23:10
楼主再接再厉啊,2斤重的铁块,温度滞后是比较小的,使用一些简单的PID算法应该就可以达到目的
但是对于一些大惯性滞后系统,上升时间和超调让人很头痛,比如锅炉的汽包压力PID控制,PID输出增加鼓风和引凤机转速后,汽包压力经常要7,8分钟后才会略有增加,对于大的锅炉,这个时间还要增加,我试了很多种参数组合,都难以达到理想的效果。当用气量突然增加导致汽包压力下降时,PID很难快速响应
楼主的图表、分析做的很踏实
作者: shenwuzhe    时间: 2008-5-22 01:13
标记
作者: haerbintcl    时间: 2008-5-22 01:40
经典一贴!谢谢!
作者: wxws    时间: 2008-6-3 01:25
mark




欢迎光临 amobbs.com 阿莫电子技术论坛 (https://www.amobbs.com/) Powered by Discuz! X3.4