打印

AD采集问题

[复制链接]
7401|19
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
20120703|  楼主 | 2012-9-14 23:52 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
现在单纯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


你的意思是不要频繁的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)这个临界点时,红灯亮且自锁,就可避免在红绿灯之间反复跳的现象。

使用特权

评论回复
5
Cortex-M0| | 2012-9-15 03:25 | 只看该作者
if(AD_RESULT<=95)

{

        LED=RED;

        

}

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

{

        LED=GREEN;

}

else ;

使用特权

评论回复
6
20120703|  楼主 | 2012-9-15 07:38 | 只看该作者
if(AD_RESULT100&&
Cortex-M0 发表于 2012-9-15 03:25


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

使用特权

评论回复
7
zd420325| | 2012-9-15 10:18 | 只看该作者
加个锤子,用个标志位就行了,超临界点就置位,不再显示红色LED就OK了

使用特权

评论回复
8
zd420325| | 2012-9-15 10:19 | 只看该作者
加个锤子,用个标志位就行了,超临界点就置位,不再显示红色LED就OK了

使用特权

评论回复
9
hizog| | 2012-9-15 13:07 | 只看该作者
哥们,在软件里面设计个临界阈值。假设临界值是10,大概意思就是红色要往绿色跳时,值需要大于12;绿色往红色跳,值要小于8。在8~12中间,LED等保持上一个状态值不变。8~12就相当于施密特触发器的回滞区间。

使用特权

评论回复
10
hizog| | 2012-9-15 13:12 | 只看该作者
上面是假定你硬件电路稳定、AD的码值跳动在正常范围内的做法。否则,还得首先保证检测电路稳定。增加滤波器啊,提高采样次数,再平均得结果之类的措施。

使用特权

评论回复
11
hizog| | 2012-9-15 13:12 | 只看该作者
上面是假定你硬件电路稳定、AD的码值跳动在正常范围内的做法。否则,还得首先保证检测电路稳定。增加滤波器啊,提高采样次数,再平均得结果之类的措施。

使用特权

评论回复
12
20120703|  楼主 | 2012-9-15 19:06 | 只看该作者
上面是假定你硬件电路稳定、AD的码值跳动在正常范围内的做法。否则,还得首先保证检测电路稳定。增加滤波器啊,提高采样次数,再平均得结果之类的措施。 ...
hizog 发表于 2012-9-15 13:12


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

使用特权

评论回复
13
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 )
{ ......}

使用特权

评论回复
14
hjs1618| | 2012-9-16 11:20 | 只看该作者
硬件不用加,加入滞回算法就可以了!也就是在临界点的上下几个AD值不用管他。

使用特权

评论回复
15
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
  {
  //……
  }
}

使用特权

评论回复
16
加油吧小鱼儿| | 2014-4-7 13:45 | 只看该作者
这个叫滞回算法啊,以前只是用,但不知道是什么。。。哈哈

使用特权

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

使用特权

评论回复
18
junjie55| | 2014-4-7 20:31 | 只看该作者
好高深

使用特权

评论回复
19
rankey| | 2021-9-21 14:00 | 只看该作者
这几天,我捣鼓出了不同与回滞算法的最新算法。  这个AD消抖方法,是我查边整个网络也没有看到。
   具体的代码是这样:
/*****对采集的15个AD数据,消抖后赋值给可稳定显示的温度值***/
void  Process_AD_hot(void)   
{
   static  uchar 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;
                         }
                 }

}

使用特权

评论回复
20
qin552011373| | 2021-10-15 10:50 | 只看该作者
去抖动后再用上下限锁住就好了

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

21

主题

263

帖子

3

粉丝