分享一个温控程序

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条回答
minicatcatcn
1楼-- · 2020-01-19 14:55
我估计在一定范围内,那个风扇打开的机会都很少。。
qaya
2楼-- · 2020-01-19 16:51
河图洛书 发表于 2016-12-19 13:12
这个程序类似的5点控制法,或者9点控制法,西门子工业上的产品有使用。

没有了解过,请详细说说
qaya
3楼-- · 2020-01-19 17:14
minicatcatcn 发表于 2016-12-19 14:31
我估计在一定范围内,那个风扇打开的机会都很少。。

可以说基本上没有启动过,风扇是防止温度万一过冲而设置的,实际测试发现没有过冲的情况出现
河图洛书
4楼-- · 2020-01-19 18:28
qaya 发表于 2016-12-20 09:41
可以说基本上没有启动过,风扇是防止温度万一过冲而设置的,实际测试发现没有过冲的情况出现 ...

五点控制,分为正大、正中、死区、负中、负大  在每个状态采用不同的脉宽或电流来控制,就达到了快速稳定的控制,9点和这个类似,只是增加了几个点,更加精细。
ponder2077
5楼-- · 2020-01-19 23:52
 精彩回答 2  元偷偷看……
qaya
6楼-- · 2020-01-20 04:04
河图洛书 发表于 2016-12-20 10:03
五点控制,分为正大、正中、死区、负中、负大  在每个状态采用不同的脉宽或电流来控制,就达到了快速稳定 ...

明白了,差不多的道理了

一周热门 更多>