20120703 发表于 2012-9-14 23:52

AD采集问题

现在单纯AD采集没有什么问题,主要问题是在实际应用中需要对AD采集的数据进行一下处理。

比如,做一个充电指示灯,我希望当电压充到某个电压点的时候指示灯从红色变为绿色。这个时候会产生一个问题。

我用C程序通常是这么处理的。



if(AD_RESULT<=100)
{
      LED=RED;
      
}
else if(AD_RESULT>100&&<=150)
{
      LED=GREEN;
}
else
{
//……
}



现在问题出现了,当AD_RESULT到100这个临界点的时候往往会出现 指示灯在红绿之间跳的现象。感觉给人的感觉不是很好,我希望指示灯不会出现这种跳的现象。也就是说从红灯变为绿灯之后就不会再跳为红灯了。



有时候我还需要通过判断AD的结果范围来操作继电器,继电器就会出现频繁开关的现象。


请问大家一般都是怎么处理这个问题的呢。

chenyu988 发表于 2012-9-15 00:03

感觉跟按键消抖是类似的,可以加点延时。

20120703 发表于 2012-9-15 00:06

感觉跟按键消抖是类似的,可以加点延时。
chenyu988 发表于 2012-9-15 00:03 https://bbs.21ic.com/images/common/back.gif

你的意思是不要频繁的AD采集,间隔时间长一点采集,然后在判断范围?

Cortex-M0 发表于 2012-9-15 03:22

本帖最后由 Cortex-M0 于 2012-9-15 03:26 编辑

加个施密物触发器即可!

可硬件加,也可用软件模拟实现,如AD_RESULT上升到100这个临界点时,绿灯亮且自锁,当AD_RESULT下升到100-x(例如x=5, 参考值=95)这个临界点时,红灯亮且自锁,就可避免在红绿灯之间反复跳的现象。

Cortex-M0 发表于 2012-9-15 03:25

if(AD_RESULT<=95)

{

      LED=RED;

      

}

else if(AD_RESULT>100&&<=150)

{

      LED=GREEN;

}

else ;

20120703 发表于 2012-9-15 07:38

if(AD_RESULT100&&
Cortex-M0 发表于 2012-9-15 03:25 https://bbs.21ic.com/images/common/back.gif

也就是中间96到100这几个点不管他

zd420325 发表于 2012-9-15 10:18

加个锤子,用个标志位就行了,超临界点就置位,不再显示红色LED就OK了

zd420325 发表于 2012-9-15 10:19

加个锤子,用个标志位就行了,超临界点就置位,不再显示红色LED就OK了

hizog 发表于 2012-9-15 13:07

哥们,在软件里面设计个临界阈值。假设临界值是10,大概意思就是红色要往绿色跳时,值需要大于12;绿色往红色跳,值要小于8。在8~12中间,LED等保持上一个状态值不变。8~12就相当于施密特触发器的回滞区间。

hizog 发表于 2012-9-15 13:12

上面是假定你硬件电路稳定、AD的码值跳动在正常范围内的做法。否则,还得首先保证检测电路稳定。增加滤波器啊,提高采样次数,再平均得结果之类的措施。

hizog 发表于 2012-9-15 13:12

上面是假定你硬件电路稳定、AD的码值跳动在正常范围内的做法。否则,还得首先保证检测电路稳定。增加滤波器啊,提高采样次数,再平均得结果之类的措施。

20120703 发表于 2012-9-15 19:06

上面是假定你硬件电路稳定、AD的码值跳动在正常范围内的做法。否则,还得首先保证检测电路稳定。增加滤波器啊,提高采样次数,再平均得结果之类的措施。 ...
hizog 发表于 2012-9-15 13:12 https://bbs.21ic.com/images/common/back.gif

AD电路稳定,是数据本身在跳动,所以会指示灯跳动,而我又想避免指示灯跳动。

smartpower 发表于 2012-9-16 10:42

加入滞回算法。

上升时 105才变绿, 下降时95才变红,

if( AD_RESULT < 95 )
{        
     LED=RED;         
}

if( AD_RESULT > 105 &&AD_RESULT < 145 )
{        
LED=GREEN;
}

if(AD_RESULT> 155 )
{ ......}

hjs1618 发表于 2012-9-16 11:20

硬件不用加,加入滞回算法就可以了!也就是在临界点的上下几个AD值不用管他。

siuhiong 发表于 2012-9-19 20:15

延长前后两次比较时间,这样红绿灯变化就不会频繁。
counter++;
if (counter >= 50)//判断条件可根据实际情况设定
{
counter = 0;
if(AD_RESULT<=100)
{
          LED=RED;
         
}
else if(AD_RESULT>100&&<=150)
{
          LED=GREEN;
}
else
{
//……
}
}

加油吧小鱼儿 发表于 2014-4-7 13:45

这个叫滞回算法啊,以前只是用,但不知道是什么。。。哈哈

powerxia 发表于 2014-4-7 17:57

前段时间弄移动电源程序,也碰到楼主的问题,搞了很久才搞定,比如充电时,因为AD取样不可避免的会有跳动,如果刚好在临界点时,两个灯会跳来跳去的,后面也是用的滞回搞定,当时真不知道是这个叫法,只是想办法实现了当AD取样值高于一个点变灯后,如果要再变回来,必须与这个点拉开一段距离就解决了....

junjie55 发表于 2014-4-7 20:31

好高深

rankey 发表于 2021-9-21 14:00

这几天,我捣鼓出了不同与回滞算法的最新算法。这个AD消抖方法,是我查边整个网络也没有看到。
   具体的代码是这样:
/*****对采集的15个AD数据,消抖后赋值给可稳定显示的温度值***/
voidProcess_AD_hot(void)   
{
   staticuchar Digshow_cnt;        
   Degree_Hot=Compare_tempres_hot(Temp_ad_val_hot); //执行AD查表法,更新当前温度值
        if(Degree_Hot==Degree_Hot_last)
           {
             Digshow_cnt++; //温度值前后两次稳定一致,做一次稳定度增加   
             if(Digshow_cnt>=15)//15次的温度值都一样,表示温度确实稳定了
                {
         Digshow_cnt=0;
           Digshow_Hot_enable=1;
          Degree_Hot_show = Degree_Hot; //赋值给可以显示的稳定的Hot温度值
             }                                       
           }
       else //温度值有抖动,做一次稳定度消减,这一步非常厉害,是我实战搞出来的,消抖效果增加100倍
               {
                       Digshow_cnt--;
                       if(Digshow_cnt<=0)
                       {
                           Digshow_cnt = 0;
                       }
               }

}

qin552011373 发表于 2021-10-15 10:50

去抖动后再用上下限锁住就好了
页: [1]
查看完整版本: AD采集问题