标题: 请教一下单片机大神,关于温度逻辑判断怎么温度防抖,还有定时器做延迟问题? [打印本页]

作者: shijie240    时间: 2020-6-30 16:40
标题: 请教一下单片机大神,关于温度逻辑判断怎么温度防抖,还有定时器做延迟问题?
请教一下大神,关于温度逻辑判断怎么温度防抖,还有定时器做延迟问题 ,用定时器可以做类似下面程序功能吗?
检测到温度界限 拉低io口持续一段时间 用定时器方法不影响主程序运作

单片机源程序如下:
if(A>=31)//温度大于31度
                 {
                  LED1=1;
                  LED2=1;
                  AR1=0;//拉低下面io口持续2s
                  AR2=0;
                  AR3=0;
                  AR4=0;
                  AR5=0;
                  AR6=0;
                  AR7=0;
                  Delay2000ms();
                    }
          else if(A<31)
                 {
                  AR1=1;
                  AR2=1;
                  AR3=1;
                  AR4=1;
                  AR5=1;
                  AR6=1;
                  AR7=1;
                  LED1=~LED1;
                  LED2=~LED2;
            }


作者: 黄youhui    时间: 2020-7-1 10:33
基本上都市ADC采集然后ADC滤波,求得答案,
以前做adc从51下载的资料,忘了那个大佬的分享的了,希望能帮到你

十大滤波.rar

313.45 KB, 下载次数: 10


作者: shijie240    时间: 2020-7-1 10:33
会了,摸索出来了
作者: xxpp2011    时间: 2020-7-1 11:00
while(A>=31)//温度大于31度
                 {                   delay(50);
                while(A>=31)//温度大于31度
                  {
                  LED1=1;
                  LED2=1;
                  AR1=0;//拉低下面io口持续2s
                  AR2=0;
                  AR3=0;
                  AR4=0;
                  AR5=0;
                  AR6=0;
                  AR7=0;
                    }
                if(A<31)//温度小于31度
                delay(50);
                 }
                  AR1=1;
                  AR2=1;
                  AR3=1;
                  AR4=1;
                  AR5=1;
                  AR6=1;
                  AR7=1;
                  LED1=~LED1;
                  LED2=~LED2;



作者: xujiabin    时间: 2020-7-1 11:23
xxpp2011 发表于 2020-7-1 11:00
while(A>=31)//温度大于31度
                 {                   delay(50);
                while(A ...

你这程序写的下面应该进不去吧,编译器没报警
作者: xujiabin    时间: 2020-7-1 11:24
xxpp2011 发表于 2020-7-1 11:00
while(A>=31)//温度大于31度
                 {                   delay(50);
                while(A ...

就是if(A<31)根本进不去
作者: shijie240    时间: 2020-7-1 11:24
xxpp2011 发表于 2020-7-1 11:00
while(A>=31)//温度大于31度
                 {                   delay(50);
                while(A ...

不要延迟函数,会拉低单片机处理速度
作者: xujiabin    时间: 2020-7-1 11:27
定时器里面加一个计数标志,等到计数到2秒给主循环一个标志位,再拉低或者拉高引脚,就可以了。温度防抖是不是采样会有误差,可以加个电容滤波,然后定时器延时采样一下,不建议在主函数里面加延时。
作者: xxpp2011    时间: 2020-7-1 11:41
xujiabin 发表于 2020-7-1 11:24
就是if(A

if只是防抖,如果50ms后仍然低于31度就会跳出上面的while语句,执行下面的LED状态还原
作者: shijie240    时间: 2020-7-1 11:50
自己想了一下搞定了
if((((AB[M]-N)>TM[4])&&((AB[M+1]-N)>TM[4]))||(((AB[M]-N)>TM[4])&&((AB[M-1]-N)>TM[4]))||(((AB[M]-N)>TM[4])&&((AB[M+2]-N)>TM[4]))||(((AB[M]-N)>TM[4])&&((AB[M-2]-N)>TM[4])))        //判断检测数据
          {
           HAD=1;
           WM=1;
           GM=1;
          }
        else                   //延迟切换时间
        {
          if(GM==0)
                   {
                  HAD=0;
                }
         }
}
void IO_handle()   //LED IO口处理
{
                if(HAD==1)
                {
                  LED1=1;
                  LED2=1;
                  AR1=0;
                  AR2=0;
                  AR3=0;
                  AR4=0;
                  AR5=0;
                  AR6=0;
                  AR7=0;
                    }
          else if(HAD==0)
                 {
                  AR1=1;
                  AR2=1;
                  AR3=1;
                  AR4=1;
                  AR5=1;
                  AR6=1;
                  AR7=1;
                 if(HAV==1)
                   {
                         HAV=0;
                        LED1=~LED1;
                    LED2=~LED2;
               }
            }
}

void Timer0Init(void)                //50毫秒@11.0592MHz
{
        AUXR &= 0x7F;                //定时器时钟12T模式
        TMOD &= 0xF0;                //设置定时器模式
        TL0 = 0x00;                //设置定时初值
        TH0 = 0x4C;                //设置定时初值
        TF0 = 0;                //清除TF0标志
        TR0 = 1;                //定时器0开始计时
        EA = 1;                        //开总中断
        ET0 = 1;           //开定时器T0中断
}

void Timer0(void) interrupt 1
  {
    TL0 = 0x00;                //设置定时初值
        TH0 = 0x4C;                //设置定时初值
        tewp++;
   if(tewp>=20)                 //LED灯闪时间处理
         {
          tewp=0;
          HAV=1;
         }
        if(WM==1)                        //开关延迟10s
          {
           temp++;
           if(temp>=20)
                  {
                  temp=0;
                  time++;
                  if(time>=10)
                         {
                          time=0;
                           WM=0;
                       GM=0;
                         }
                   }
           }

}

作者: naqishuben    时间: 2020-7-1 12:10
延时判断,这是比较简单的办法
作者: 随风飘远    时间: 2020-7-1 12:20
温度  应该要设置一个窗口值,升温后报警  降到一定温度值后再解除报警  就是有一个温度范围。 定时也要的,定义一个时间相关的变量, 降温后 需要定时时间到了才解除报警
作者: shijie240    时间: 2020-7-1 12:30
xujiabin 发表于 2020-7-1 11:27
定时器里面加一个计数标志,等到计数到2秒给主循环一个标志位,再拉低或者拉高引脚,就可以了。温度防抖是 ...

你这个是定时去处理 我想要的是定时器直接做延迟
作者: SKYLAR123    时间: 2020-7-1 13:34
shijie240 发表于 2020-7-1 12:30
你这个是定时去处理 我想要的是定时器直接做延迟

那你就在想要延时的下面做个标志位,标志位为1,定时器给标志位里面的变量累计加一,到了你想要延时的时间在做一个标志位这个标志位为1,说明,延时时间到了
作者: qyqx01    时间: 2020-7-1 18:07
不能在AD转温度时候作么,比如AD转换后取平均值,然后作个定时标记,多少时间内刷新一次温度值.剩下的温度控制程序就完全可以直接一次性判断了
if(ADCokF&&Flag2s)
{
    ADCokF=0;
   Flag2s=0;
    //温度转换;
   A=温度;
}

控制程序直接去掉延时等待
if(A>=31)//温度大于31度
                 {
                  LED1=1;
                  LED2=1;
                  AR1=0;//拉低下面io口持续2s
                  AR2=0;
                  AR3=0;
                  AR4=0;
                  AR5=0;
                  AR6=0;
                  AR7=0;
                    }
          else if(A<31)
                 {
                  AR1=1;
                  AR2=1;
                  AR3=1;
                  AR4=1;
                  AR5=1;
                  AR6=1;
                  AR7=1;
                  LED1=~LED1;
                  LED2=~LED2;
            }


作者: wxs732    时间: 2020-7-1 19:06
你应该想实现的是,温度自动控制 !
    最长见的就是  “恒温电烙铁”  
这个需要PID 来实现。
    如果用继电器 是不行的,因为在接近温度值得时候开关频繁。
    如果加热水的话,还需要考虑水量减少时,这个开时间加热的判断。
    希望能帮到
   




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1