搜索
bottom↓
回复: 29

分享一个温控程序

[复制链接]

出0入0汤圆

发表于 2016-11-17 11:27:24 | 显示全部楼层 |阅读模式
这几天写了个温控程序,调试效果还不错,大体思路是:主循环每隔1秒钟探测一下温度并根据温度调整加热占空比,然后定时器中断里根据占空比来控制加热丝的开关。欢迎指正。
具体程序如下:

中断函数中根据占空比开关加热丝和风扇:
void ISR_T1(void)interrupt 3   
{
      //定时器重载,每50ms一次定时器中断
TH1=T1THint;
TL1=T1TLint;
  if(Counter_50ms==20){
            Counter_50ms=0;
        else {
                Counter_50ms++;
         }

   if(HeatPeriod>=20)  //占空比周期1秒
    {
                   HeatPeriod=0;
         }
         else
          {
                  HeatPeriod++;
                if(HeatPeriod<HeatDutyRatio)
                 {
                  发热=开启;
                  散热风扇=关闭;
                  }
                  else
                  {
                         发热=关闭;
                         if(NeedTurnOnFan==1) 散热风扇=开启;
                          else 散热风扇=关闭;          
                  }
                 
           }
          
                              
}


占空比调整函数,把当前温度和目标温度的差值分几个档,每个档不同的空比,如有需要,还可以添加根据温升速度来微调每个档的占空比,目前效果不错,就没搞
void HeatDutyRatioSet(void)
{
          PresentTemperatureValue=DS18B20();
    if(TargetTemperatureValue>PresentTemperatureValue)
        {
           NeedTurnOnFan=0;
           if((TargetTemperatureValue-PresentTemperatureValue)>10)        
             {
                   HeatDutyRatio=20;
                   }
           else
           if((TargetTemperatureValue-PresentTemperatureValue)>8)   
             {
                   HeatDutyRatio=18;
                   }
           else
           if((TargetTemperatureValue-PresentTemperatureValue)>5)        
             {
                   HeatDutyRatio=16;
                   }
           else
           if((TargetTemperatureValue-PresentTemperatureValue)>2)        
             {
                   HeatDutyRatio=15;
                   }
           else
           if((TargetTemperatureValue-PresentTemperatureValue)>1)        
             {
                   HeatDutyRatio=13;
                   }
           else
           if((TargetTemperatureValue-PresentTemperatureValue)==1)        
             {
                   HeatDutyRatio=10;
                   }
         }
         else if(TargetTemperatureValue==PresentTemperatureValue)         
             {
                   HeatDutyRatio=6;
                   }
         else         
             {
                   HeatDutyRatio=0;
                   if((PresentTemperatureValue-TargetTemperatureValue)>16)//超温1度开始开启散热风扇
                     { NeedTurnOnFan=1;}
                         else NeedTurnOnFan=0;
                   }          
}

主函数每隔一秒调用占空比函数
void main(void)

        ...
        ...
        if(HeatPeriod==0)//每隔1秒调整占空比
         {
           HeatPeriod++;
          HeatDutyRatioSet();
          }

出0入0汤圆

发表于 2016-11-17 11:59:21 | 显示全部楼层
谢谢分享

出0入12汤圆

发表于 2016-11-17 12:01:05 | 显示全部楼层

出0入0汤圆

 楼主| 发表于 2016-11-17 13:02:54 | 显示全部楼层

客气哈,欢迎指正

出0入0汤圆

发表于 2016-11-17 15:26:23 | 显示全部楼层
qaya 发表于 2016-11-17 13:02
客气哈,欢迎指正

学习了,谢谢。

出0入0汤圆

发表于 2016-11-18 00:13:20 | 显示全部楼层
收藏一下

出0入0汤圆

发表于 2016-11-18 09:05:35 | 显示全部楼层
不错正想搞个 焊台     空了看看

出0入0汤圆

发表于 2016-11-18 09:13:52 | 显示全部楼层
可以用表格不,这么多的条件判断看着好头晕

出0入0汤圆

 楼主| 发表于 2016-11-18 09:55:21 | 显示全部楼层
本帖最后由 qaya 于 2016-11-18 11:25 编辑
mcu5i51 发表于 2016-11-18 09:13
可以用表格不,这么多的条件判断看着好头晕


其实这些条件判断就是一句话:根据当前温度和目标温度的差值来设定不同的占空比,当前温度越接近目标温度的时候占空比就越小。达到目标温度后就用最小的占空比维持温度,超过目标温度一定程度就开风扇散热。
不用细看这些条件判断的,需根据具体的应用来调整这些判断的。

出0入0汤圆

发表于 2016-11-18 10:12:07 | 显示全部楼层
mark一下

出0入0汤圆

发表于 2016-11-18 15:02:52 来自手机 | 显示全部楼层
不错,要好好学习下,以前曾想出这个办法,但没能用C写出来。

出0入21汤圆

发表于 2016-11-18 15:07:48 | 显示全部楼层
这仅仅是种想法,应该实际测试才能ok,相当于PID的P吧

出0入0汤圆

 楼主| 发表于 2016-11-18 15:40:58 | 显示全部楼层
qd118118 发表于 2016-11-18 15:07
这仅仅是种想法,应该实际测试才能ok,相当于PID的P吧

看帖不仔细

出0入21汤圆

发表于 2016-11-18 21:24:40 | 显示全部楼层

不好意思,如现场环境温度气流等有变化,可能较难满足温控要求,一般用PID可靠些

出0入0汤圆

 楼主| 发表于 2016-11-19 10:03:14 | 显示全部楼层
qd118118 发表于 2016-11-18 21:24
不好意思,如现场环境温度气流等有变化,可能较难满足温控要求,一般用PID可靠些 ...

这个方法确实比PID简单,可以说是优点也可以说是缺点,看具体应用。

出0入0汤圆

发表于 2016-11-22 13:24:47 | 显示全部楼层
可以尝试用PID再写一次

出0入0汤圆

发表于 2016-11-30 17:15:19 | 显示全部楼层
谢谢分享

出0入0汤圆

发表于 2016-11-30 22:17:06 | 显示全部楼层
谢谢分享,学习。

出0入0汤圆

发表于 2016-11-30 23:43:17 | 显示全部楼层
if条件的语句过多,可以采用SWITCH语句,而且楼主的写代码风格要注意一下。

出0入0汤圆

发表于 2016-12-1 00:19:59 | 显示全部楼层
谢谢分享

出0入0汤圆

发表于 2016-12-3 19:52:41 | 显示全部楼层
谢谢分享

出0入0汤圆

 楼主| 发表于 2016-12-5 10:57:26 | 显示全部楼层
本帖最后由 qaya 于 2016-12-5 10:58 编辑
wxdn 发表于 2016-11-21 11:53
看来撸主是个新手,这么多的判断可以用switch语句的,搞这么多的if else,好累,还有就是,这种程序没有PID ...


确实用SWITCH语句会清晰很多,不过您说这个程序没有考虑过冲就不对了吧?随着接近目标温度,占空比不断减小,就是防止过冲啊

出0入0汤圆

发表于 2016-12-19 13:12:12 | 显示全部楼层
qaya 发表于 2016-12-5 10:57
确实用SWITCH语句会清晰很多,不过您说这个程序没有考虑过冲就不对了吧?随着接近目标温度,占空比不断减 ...

这个程序类似的5点控制法,或者9点控制法,西门子工业上的产品有使用。

出0入0汤圆

发表于 2016-12-19 14:31:43 来自手机 | 显示全部楼层
我估计在一定范围内,那个风扇打开的机会都很少。。

出0入0汤圆

 楼主| 发表于 2016-12-20 09:40:27 | 显示全部楼层
河图洛书 发表于 2016-12-19 13:12
这个程序类似的5点控制法,或者9点控制法,西门子工业上的产品有使用。

没有了解过,请详细说说

出0入0汤圆

 楼主| 发表于 2016-12-20 09:41:43 | 显示全部楼层
minicatcatcn 发表于 2016-12-19 14:31
我估计在一定范围内,那个风扇打开的机会都很少。。

可以说基本上没有启动过,风扇是防止温度万一过冲而设置的,实际测试发现没有过冲的情况出现

出0入0汤圆

发表于 2016-12-20 10:03:15 | 显示全部楼层
qaya 发表于 2016-12-20 09:41
可以说基本上没有启动过,风扇是防止温度万一过冲而设置的,实际测试发现没有过冲的情况出现 ...

五点控制,分为正大、正中、死区、负中、负大  在每个状态采用不同的脉宽或电流来控制,就达到了快速稳定的控制,9点和这个类似,只是增加了几个点,更加精细。

出0入0汤圆

发表于 2016-12-20 20:34:51 来自手机 | 显示全部楼层
有谁能分享一个PID的控温程序吗?

出0入0汤圆

 楼主| 发表于 2016-12-21 14:06:19 | 显示全部楼层
河图洛书 发表于 2016-12-20 10:03
五点控制,分为正大、正中、死区、负中、负大  在每个状态采用不同的脉宽或电流来控制,就达到了快速稳定 ...

明白了,差不多的道理了

出0入0汤圆

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

本版积分规则

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

GMT+8, 2024-4-20 22:42

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

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