搜索
bottom↓
回复: 60

温度控制与模糊控制技术

[复制链接]

出0入0汤圆

发表于 2011-11-10 16:30:12 | 显示全部楼层 |阅读模式
最近读了一篇文章,说模糊控制技术适合于温度控制系统,特地试验了一下,采用读取温度超过设定温度即关断加热,低于即打开方式控制误差越-0.3℃~1.6℃,换成模糊控制后大约在-0.5度到正0.5度间,有改善,不过理论上讲,采用18B20最佳应该可以达到正负0.1度左右的,不知道哪位有好的改进意见,欢迎讨论

阿莫论坛20周年了!感谢大家的支持与爱护!!

月入3000的是反美的。收入3万是亲美的。收入30万是移民美国的。收入300万是取得绿卡后回国,教唆那些3000来反美的!

出0入0汤圆

发表于 2011-11-16 12:07:54 | 显示全部楼层
最近正在弄这个,发源程序看看可以吗,谢谢!

出0入0汤圆

 楼主| 发表于 2011-11-17 09:16:35 | 显示全部楼层
void HeatControl(void)
  {
           static unsigned int CountT,pointPWM=900;
           static uint temT,Last_temT,vT,ErrorT,SetT=450;
           static uchar plvT,plErrorT,HeatingStatus,LoopPwm=0,pLoopPwm=0;
            
           temT=(uint)Temper;        //输入Temper当前温度*10, SetT设定温度*10
           if(temT>SetT) { ErrorT=temT-SetT; plErrorT=1; }  else {ErrorT=SetT-temT; plErrorT=0;}
           if(temT>Last_temT) { vT=temT-Last_temT; plvT=1; } else { vT=Last_temT-temT; plvT=0;}
           CountT++;
         HeaterOff;
           if(CountT>1000)   //?5S
                   {
                           CountT=0;        
                           LoopPwm++; if(LoopPwm>9)  LoopPwm=0;
                           if((ErrorT>100)&&(plErrorT==1))       //超出设定温度很多
                                   {
                                           if((vT>4)&&(plvT==1)) { HeatingStatus=8;  }    //快速升温极热
                                     else if((vT>0)&&(plvT==1)) { HeatingStatus=7;}  //很热
                                           else if((vT>4)&&(plvT==0)) { HeatingStatus=4;}         //适中
                                           else if((vT>0)&&(plvT==0)) { HeatingStatus=5;}         //微热
                                           else  { HeatingStatus=6;}                       //热
                             }
                           else if((ErrorT>30)&&(plErrorT==1))    //超出设定温度多
                                   {
                                           if((vT>4)&&(plvT==1)) { HeatingStatus=7;  }    //快速升温很热
                                     else if((vT>0)&&(plvT==1)) { HeatingStatus=6;}  //热
                                           else if((vT>4)&&(plvT==0)) { HeatingStatus=3;}         //微冷
                                           else if((vT>0)&&(plvT==0)) { HeatingStatus=4;}         //适中
                                           else  { HeatingStatus=5;}                       //微热
                             }
                           else if((ErrorT>5)&&(plErrorT==1))    //超出设定温度
                                   {
                                           if((vT>4)&&(plvT==1)) { HeatingStatus=7;  }    //快速升温很热
                                     else if((vT>0)&&(plvT==1)) { HeatingStatus=6;}  //热
                                           else if((vT>4)&&(plvT==0)) { HeatingStatus=2;}         //冷
                                           else if((vT>0)&&(plvT==0)) { HeatingStatus=4;}         //适中
                                           else  { HeatingStatus=5;}                       //微热
                             }          
                           else if((ErrorT>1)&&(plErrorT==1))    //超出设定温度
                                   {
                                           if((vT>4)&&(plvT==1)) { HeatingStatus=6;  }    //快速升温热
                                     else if((vT>0)&&(plvT==1)) { HeatingStatus=6;}  //热
                                           else if((vT>4)&&(plvT==0)) { HeatingStatus=2;}         ///冷
                                           else if((vT>0)&&(plvT==0)) { HeatingStatus=3;}         //微冷
                                           else  { HeatingStatus=5;}                       //微热
                             }
                           else if((ErrorT>100)&&(plErrorT==0))    //低于设定温度很多
                                   {
                                           if((vT>4)&&(plvT==1)) { HeatingStatus=4;  }    //快速升温适中
                                     else if((vT>0)&&(plvT==1)) { HeatingStatus=3;}  //微冷
                                           else if((vT>4)&&(plvT==0)) { HeatingStatus=0;}         //极冷
                                           else if((vT>0)&&(plvT==0)) { HeatingStatus=1;}         //很冷
                                           else  { HeatingStatus=2;}                       //冷
                             }          
                           else if((ErrorT>30)&&(plErrorT==0))    //低于设定温度多
                                   {
                                           if((vT>4)&&(plvT==1)) { HeatingStatus=6;  }    //快速升温热
                                     else if((vT>0)&&(plvT==1)) { HeatingStatus=4;}  //适中
                                           else if((vT>4)&&(plvT==0)) { HeatingStatus=1;}         //很冷
                                           else if((vT>0)&&(plvT==0)) { HeatingStatus=2;}         //冷
                                           else  { HeatingStatus=3;}                       //微冷
                             }
                           else if((ErrorT>5)&&(plErrorT==0))    //低于设定温度
                                   {
                                           if((vT>4)&&(plvT==1)) { HeatingStatus=6;  }    //快速升温热
                                     else if((vT>0)&&(plvT==1)) { HeatingStatus=4;}  //适中
                                           else if((vT>4)&&(plvT==0)) { HeatingStatus=1;}         //很冷
                                           else if((vT>0)&&(plvT==0)) { HeatingStatus=2;}         //冷
                                           else  { HeatingStatus=3;}                       //微冷
                             }          
                           else if((ErrorT>1)&&(plErrorT==0))    //低于设定温度
                                   {
                                           if((vT>4)&&(plvT==1)) { HeatingStatus=6;  }    //快速升温热
                                     else if((vT>0)&&(plvT==1)) { HeatingStatus=5;}  //微热
                                           else if((vT>4)&&(plvT==0)) { HeatingStatus=2;}         //冷
                                           else if((vT>0)&&(plvT==0)) { HeatingStatus=2;}         //冷
                                           else  { HeatingStatus=3;}                       //微冷
                             }          
                           else     //接近设定温度
                                   {
                                           if((vT>4)&&(plvT==1)) { HeatingStatus=6;  }    //快速升温热
                                     else if((vT>0)&&(plvT==1)) { HeatingStatus=5;}  //微热
                                           else if((vT>4)&&(plvT==0)) { HeatingStatus=2;}         //冷
                                           else if((vT>0)&&(plvT==0)) { HeatingStatus=3;}         //微冷
                                           else  { HeatingStatus=4;}                       //适中
                             }         
                           switch(HeatingStatus)   
                            {
                                     case 0:  { pointPWM=0;                       } break;     //极冷
                                     case 1:  { if(pointPWM>50) pointPWM-=50;     } break;
                                     case 2:  { if(pointPWM>10)  pointPWM-=3;     } break;
                                     case 3:  { if(pLoopPwm>0)   pLoopPwm--;
                                                        else  { if(pointPWM>0)  pointPWM--; pLoopPwm=9; }    } break;
                                     case 4:    ;                                   break;       
                                     case 5:  { if(pLoopPwm<9)  pLoopPwm++;
                                                        else { if(pointPWM<999) pointPWM++; pLoopPwm=0; }  } break;
                                     case 6:  { if(pointPWM<990)   pointPWM+=3; } break;
                                     case 7:  { if(pointPWM<900)   pointPWM+=50;} break;
                                     case 8:  { pointPWM=1000;                    } break;          //极热
                                     default: {   pointPWM=1001;                  } break;                
                            }
              Last_temT=temT;
                   }
           if(CountT>pointPWM) HeaterOn;
                    else if(CountT<pointPWM) HeaterOff;
                    else { if(LoopPwm>pLoopPwm) HeaterOn; else  HeaterOff;   }   //输出HeaterOn开加热,HeaterOff关加热

  }

出0入0汤圆

发表于 2011-11-17 13:31:54 | 显示全部楼层
感谢。标记学习

出0入0汤圆

发表于 2011-12-12 23:42:04 | 显示全部楼层
我觉得是你的调节范围太粗了~

调节时间和调节量都是要按照你的受控元件的惯性量来定

优化下应该能达到你要的效果


个人愚见~~

出0入0汤圆

 楼主| 发表于 2011-12-13 05:35:47 | 显示全部楼层
谢谢你的关心,不过我试验模糊控制主要是看文章里描述得很轻松,曲线很完美,以为很好调试呢,结果却不尽然。目前我对模糊控制兴趣不是很大,因为我有能达到类似效果的控温方法了。


(原文件名:Heatcontro2.jpg)

出0入0汤圆

发表于 2011-12-13 07:36:09 | 显示全部楼层
MARK

出0入85汤圆

发表于 2011-12-13 09:08:21 | 显示全部楼层
采用段式控制就能做到这么好的控温精度,上模糊控制真是大材小用了,你的模糊控制并没有突出其优越性,建议LZ把负载换成一个滞后比较强的负载来做对比

出0入0汤圆

发表于 2011-12-13 11:55:15 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-12-15 09:31:36 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-12-15 16:29:21 | 显示全部楼层
学习了~谢谢

出0入0汤圆

发表于 2011-12-17 00:28:51 | 显示全部楼层
决定试试

出0入0汤圆

发表于 2011-12-17 08:40:33 | 显示全部楼层
18B20最佳应该可以达到正负0.1度左右的?
回复【楼主位】coleyao
-----------------------------------------------------------------------

18B20精度才0.5

出0入0汤圆

 楼主| 发表于 2011-12-17 08:53:05 | 显示全部楼层
回复【12楼】yao1  
-----------------------------------------------------------------------

是温度稳定性,不是精度,18B20分辨率达到0.0625度,控温稳定性应该可以达到0.1度左右,精度要高于0.5度还要根据曲线作补偿的。

出0入0汤圆

发表于 2011-12-17 08:58:32 | 显示全部楼层
mark

出0入0汤圆

 楼主| 发表于 2011-12-19 15:50:28 | 显示全部楼层
回复【7楼】marshallemon
-----------------------------------------------------------------------


(原文件名:Tcontrol.JPG)

不知道这个算不算大滞后的,普通控制温度变化范围到了10度左右

出0入0汤圆

 楼主| 发表于 2011-12-28 09:54:27 | 显示全部楼层

(原文件名:Tcontro2.JPG)
产品做得差不多了,以前的图片是都是没加水空烧的,加上缸里面加水之后的效果比对图

出0入0汤圆

发表于 2011-12-28 11:59:49 | 显示全部楼层
lz其实你这个算法不能叫做模糊控制
两个要素没有做到:
1. 你把值域划分为了Crisp Set,而非Fuzzy Set,这点比较关键
2. Defuzzification的方法有待商榷

附件供参考,两种常用Fuzzy Inference方法流程:
点击此处下载 ourdev_708312T7UAWR.pdf(文件大小:110K) (原文件名:Artificial Intelligence - A Guide to Intelligent Systems 127.pdf)
点击此处下载 ourdev_708313H4V7LQ.pdf(文件大小:105K) (原文件名:Artificial Intelligence - A Guide to Intelligent Systems 132.pdf)

出0入0汤圆

发表于 2011-12-28 12:10:17 | 显示全部楼层
不错的讨论

出0入0汤圆

 楼主| 发表于 2011-12-28 13:51:54 | 显示全部楼层
回复【18楼】catx  猫杀吖
-----------------------------------------------------------------------

终于遇到专业人士了呀,我说我的所谓模糊控制怎么效果和资料上的差那么多啊!

出0入0汤圆

发表于 2011-12-28 14:23:24 | 显示全部楼层
回复【20楼】coleyao  
-----------------------------------------------------------------------

嘿嘿
专业不敢当
只是大学时恰好修过Computational Intelligence这门课
学校从米国卡耐基梅隆大学请过来的外教
一周的课程传递的信息以及带来的启发说实话比国内课程一整年的还要大
所以印象极其深刻

出0入0汤圆

发表于 2011-12-28 15:59:21 | 显示全部楼层
楼上是 牛人 学校也牛

出0入0汤圆

发表于 2011-12-28 16:53:51 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-12-28 18:11:10 | 显示全部楼层
mark..

出0入0汤圆

发表于 2011-12-28 19:16:09 | 显示全部楼层
感觉所有的温度控制算法都有一个缺点,都不会随着环境自动调整自己的控制行为。
有几个问题:
1、如何评价当前的控温性能。包括温升速度、过冲等。
2、在什么时候修正自己的控温方法。
3、如何修正自己的控温方法。
4、对扰动进行模式分类,对不同的扰动要归纳出具体对策。
5、如何对历史数据记录,并分类。

这些都搞定,就不用人调试了啊。

出0入0汤圆

发表于 2011-12-28 19:47:41 | 显示全部楼层
回复【25楼】zhangjinxing  
-----------------------------------------------------------------------

自适应的算法其实很多
论文一搜一大堆
很多都是可行的
相信其实有很多产品也在用
要与本帖主题相关来举例的话
有一种用模糊逻辑来动态确定PID的Kp,Ki,Kd三个参数的自适应PID算法
也有直接用人工神经网络来做温控的
要举例的话估计很难举完

这些算法其实都是把系统当做黑盒来处理的
实际上也有利用热力学原理建立数学模型来控制的方法
如果建模得当控制的效果会很好

出0入0汤圆

 楼主| 发表于 2011-12-28 21:17:39 | 显示全部楼层
回复【26楼】catx 猫杀吖
-----------------------------------------------------------------------

温度控制不一定要自适应算法,能自动调节参数,我上面的图表资料包含低迟滞(传感器在加热膜中央位置)和高迟滞(传感器在加热膜侧边),空烧及带水烧的,自我感觉效果不错,参数和程序就一套不变化的,也没有在运行时调整。

出0入0汤圆

发表于 2011-12-28 21:35:58 | 显示全部楼层
回复【27楼】coleyao  
-----------------------------------------------------------------------

对的
这个要看场合
原则上如果被控制的系统或者环境本身的物理参数不变
那么一次tune好的参数就可以用N次
什么都不变自然也没什么适应的需求

自适应算法是针对那种系统或者环境本身参数会发生变化的
但即使在不变的环境下
如果可用
我也会倾向于使用自适应的
首先是可以省去反复tune参数的劳力
特别是那种不好tune的算法
其次比如产品要长期使用
并不能保证各种参数不会因为老化等各种原因发生变化
还有一个好处就是
我可能只需要极少的改动
就可以直接把一个控制空气温度的控制器用来控制水温
甚至控制电机等其它完全不相关的应用

出0入0汤圆

 楼主| 发表于 2011-12-29 05:41:36 | 显示全部楼层
回复【28楼】catx 猫杀吖
-----------------------------------------------------------------------

温度控制一般是恒值控制,如果电机控制也是恒值(角速度or线速度)控制,理论上核心算法是不要变动的,要变动的是外围的传感器和控制周期,采样周期以及每次调节占的%等参数,似乎自适应也解决不了这些吧。

出0入0汤圆

 楼主| 发表于 2011-12-29 06:02:37 | 显示全部楼层
数值算法就怕传感器不能得到所需的物理量,如PID控制时如果P测量不出来(光碟恒线速的线速度似乎很难精确测量),就只能改动及调整算法了。

出0入0汤圆

发表于 2011-12-29 08:08:37 | 显示全部楼层
学习学习!

出0入0汤圆

发表于 2011-12-29 13:54:50 | 显示全部楼层
mark!

出0入0汤圆

发表于 2011-12-29 14:51:29 | 显示全部楼层
回复【30楼】coleyao  
-----------------------------------------------------------------------

自适应改善的是控制算法结果的“质量”
如达到目标温度的时间,overshoot的程度,振荡等问题
在Pid这个例子中其实就是那几个参数在决定这些
算法本身的确是可以一字不动的用在不同的应用上
但参数就不一定了
如果不想或者不能随时人工tune参数的场合
就应该考虑自适应
而且人工tune的参数往往不及自适应算法
实际上很多自适应算法就是为了优化而出现的

出0入0汤圆

发表于 2011-12-29 15:04:01 | 显示全部楼层
曾经做过一个产品,也是用18B20控制加热板,温度恒定在35℃。

原理是用PID控制PWM的占空比,P、I、D参数根据实际测控对象进行设定,还是发两张图,看起来直观点。


(原文件名:PID_从室温到稳定所需时间.gif)


(原文件名:PID_控制精度.gif)

图中,红色为温度(℃),绿色为加热功率百分比(%),横坐标为时间(s).

出0入0汤圆

发表于 2011-12-29 15:11:39 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-12-30 07:44:34 | 显示全部楼层
回复【34楼】catx 猫杀吖
-----------------------------------------------------------------------

关键是现场好些都没有调温度PID这个概念啊。都不知道怎么调,就说你这东西不好,控制误差大。

出0入0汤圆

发表于 2011-12-30 08:06:03 | 显示全部楼层
回复【38楼】zhangjinxing  
-----------------------------------------------------------------------

首先你说“所有的温度控制算法”都有这个缺点的说法本身站不住脚
因为你的出发点是就你所接触到的有限的,没有精细调节参数的(简单的说是没有正确被使用的)非适应性算法
来一竿子打翻一船算法
自适应算法的种类繁多
而且不少有成熟广泛的现实应用

其次正如上面所说
任何算法,包括非自适应算法
最后效果如何
取决于能够正确的使用
像你说的没有调参数的概念
要怪的是人不能正确使用而不是算法不好

以下引用自维基百科PID词条中介绍历史背景一节
http://en.wikipedia.org/wiki/PID_controller#History

...
Trials were carried out on the USS New Mexico, with the controller controlling the angular velocity (not angle) of the rudder. PI control yielded sustained yaw (angular error) of ±2°, while adding D yielded yaw of ±1/6°, better than most helmsmen could achieve.[8]
...

请注意这是在还没有现代计算机强大计算能力的古代
PID就能达到的精度

出0入0汤圆

发表于 2011-12-31 07:36:49 | 显示全部楼层
回复【39楼】catx 猫杀吖
-----------------------------------------------------------------------
大家有没有好点的自适应温控算法啊,推荐下啊,要适合单片机上的啊。
现在主要还是现场人员都不会调PID参数,都直接说你东西不好用。想改进成自适应的,
只要装上就好了,控温精度越用越高。

出0入0汤圆

发表于 2011-12-31 08:49:46 | 显示全部楼层
好文,MARK!

出0入0汤圆

 楼主| 发表于 2011-12-31 12:02:28 | 显示全部楼层
回复【35楼】jshp32  古道西风
-----------------------------------------------------------------------

你的PID调整的确实不错,基本上控温的各项指标都达到了极致,呵呵。可惜我琢磨过一阵PID,却没有弄出来,倒是另外弄了一个控温算法。其实我觉得也不错了,在设定温度从室温到100度,空烧或带水烧的各种情况下不用调节参数,稳定下来后温度波动在设定温度正负0.2度左右,空烧的时候会有几个调整周期(10分钟左右),带水烧的时候加1/4水温度超调0.5度左右。

出0入0汤圆

 楼主| 发表于 2011-12-31 12:07:32 | 显示全部楼层
回复【40楼】zhangjinxing  
-----------------------------------------------------------------------

偶的算法我觉得是不用调参数的,不过可惜一方面不能贴代码,另一方面,我的算法尽管与PID有点相似,却与经典的PID使用上相差甚远,要动底层的呀,当然如果你的点数不多,计算机也完全能计算得过来,不过这样运行模式就不对了,可靠性差了(每台设备都依赖中心计算机)。

出0入0汤圆

发表于 2011-12-31 12:17:05 | 显示全部楼层
获益良多

出0入0汤圆

发表于 2012-1-12 04:15:06 | 显示全部楼层
获益匪浅

出0入0汤圆

发表于 2012-2-13 19:51:55 | 显示全部楼层
留下了。mark

出0入0汤圆

发表于 2012-5-15 14:46:09 | 显示全部楼层
mark下,好好研究学习下!

出0入0汤圆

发表于 2012-5-15 16:52:47 | 显示全部楼层
标记模糊控制

出0入0汤圆

发表于 2012-6-29 08:57:47 | 显示全部楼层
关注,学习,mark

出0入0汤圆

发表于 2012-7-19 09:44:43 | 显示全部楼层
模糊控制

出0入0汤圆

发表于 2012-11-5 21:56:07 | 显示全部楼层
学习了啊.......................

出0入0汤圆

发表于 2012-11-5 22:28:53 | 显示全部楼层
有点长,明天仔细看看

出0入0汤圆

发表于 2013-3-4 22:41:37 | 显示全部楼层
楼主楼主,请问你这个设计的模糊规则是什么,急求啊

出0入0汤圆

发表于 2013-5-9 23:24:20 | 显示全部楼层
好贴,留记!

出0入0汤圆

发表于 2013-6-4 12:38:40 | 显示全部楼层
mark,不错,收下了。太好了。

出0入0汤圆

发表于 2013-6-4 12:48:38 | 显示全部楼层
模糊控制?

出0入0汤圆

发表于 2013-7-6 17:17:53 | 显示全部楼层
马克一下。

出0入0汤圆

发表于 2013-9-1 13:58:27 | 显示全部楼层
mark!!

出0入0汤圆

发表于 2013-9-1 14:40:14 | 显示全部楼层
学习了。好东西

出0入0汤圆

发表于 2013-9-3 05:59:33 来自手机 | 显示全部楼层
mark         

出0入0汤圆

发表于 2014-12-17 19:54:36 来自手机 | 显示全部楼层
楼主用二位试控制就可以控制在—0.3到1.6度这么小的范围,我的系统看来不适合,过冲太大

出0入0汤圆

发表于 2017-5-27 10:24:13 | 显示全部楼层
好帖子,模糊控制PID
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-27 06:28

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表