分享一个温控程序

2020-01-16 18:29发布

这几天写了个温控程序,调试效果还不错,大体思路是:主循环每隔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();
          }
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
31条回答
mcu5i51
1楼-- · 2020-01-17 11:04
可以用表格不,这么多的条件判断看着好头晕
qaya
2楼-- · 2020-01-17 13:55
本帖最后由 qaya 于 2016-11-18 11:25 编辑
mcu5i51 发表于 2016-11-18 09:13
可以用表格不,这么多的条件判断看着好头晕


其实这些条件判断就是一句话:根据当前温度和目标温度的差值来设定不同的占空比,当前温度越接近目标温度的时候占空比就越小。达到目标温度后就用最小的占空比维持温度,超过目标温度一定程度就开风扇散热。
不用细看这些条件判断的,需根据具体的应用来调整这些判断的。
小Z
3楼-- · 2020-01-17 15:47
 精彩回答 2  元偷偷看……
ZJetWay
4楼-- · 2020-01-17 18:25
不错,要好好学习下,以前曾想出这个办法,但没能用C写出来。
qd118118
5楼-- · 2020-01-17 22:07
这仅仅是种想法,应该实际测试才能ok,相当于PID的P吧
qaya
6楼-- · 2020-01-17 22:53
qd118118 发表于 2016-11-18 15:07
这仅仅是种想法,应该实际测试才能ok,相当于PID的P吧

看帖不仔细

一周热门 更多>