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 https://bbs.21ic.com/images/common/back.gif
你的意思是不要频繁的AD采集,间隔时间长一点采集,然后在判断范围? 本帖最后由 Cortex-M0 于 2012-9-15 03:26 编辑
加个施密物触发器即可!
可硬件加,也可用软件模拟实现,如AD_RESULT上升到100这个临界点时,绿灯亮且自锁,当AD_RESULT下升到100-x(例如x=5, 参考值=95)这个临界点时,红灯亮且自锁,就可避免在红绿灯之间反复跳的现象。 if(AD_RESULT<=95)
{
LED=RED;
}
else if(AD_RESULT>100&&<=150)
{
LED=GREEN;
}
else ; if(AD_RESULT100&&
Cortex-M0 发表于 2012-9-15 03:25 https://bbs.21ic.com/images/common/back.gif
也就是中间96到100这几个点不管他 加个锤子,用个标志位就行了,超临界点就置位,不再显示红色LED就OK了 加个锤子,用个标志位就行了,超临界点就置位,不再显示红色LED就OK了 哥们,在软件里面设计个临界阈值。假设临界值是10,大概意思就是红色要往绿色跳时,值需要大于12;绿色往红色跳,值要小于8。在8~12中间,LED等保持上一个状态值不变。8~12就相当于施密特触发器的回滞区间。 上面是假定你硬件电路稳定、AD的码值跳动在正常范围内的做法。否则,还得首先保证检测电路稳定。增加滤波器啊,提高采样次数,再平均得结果之类的措施。 上面是假定你硬件电路稳定、AD的码值跳动在正常范围内的做法。否则,还得首先保证检测电路稳定。增加滤波器啊,提高采样次数,再平均得结果之类的措施。 上面是假定你硬件电路稳定、AD的码值跳动在正常范围内的做法。否则,还得首先保证检测电路稳定。增加滤波器啊,提高采样次数,再平均得结果之类的措施。 ...
hizog 发表于 2012-9-15 13:12 https://bbs.21ic.com/images/common/back.gif
AD电路稳定,是数据本身在跳动,所以会指示灯跳动,而我又想避免指示灯跳动。 加入滞回算法。
上升时 105才变绿, 下降时95才变红,
if( AD_RESULT < 95 )
{
LED=RED;
}
if( AD_RESULT > 105 &&AD_RESULT < 145 )
{
LED=GREEN;
}
if(AD_RESULT> 155 )
{ ......} 硬件不用加,加入滞回算法就可以了!也就是在临界点的上下几个AD值不用管他。 延长前后两次比较时间,这样红绿灯变化就不会频繁。
counter++;
if (counter >= 50)//判断条件可根据实际情况设定
{
counter = 0;
if(AD_RESULT<=100)
{
LED=RED;
}
else if(AD_RESULT>100&&<=150)
{
LED=GREEN;
}
else
{
//……
}
} 这个叫滞回算法啊,以前只是用,但不知道是什么。。。哈哈 前段时间弄移动电源程序,也碰到楼主的问题,搞了很久才搞定,比如充电时,因为AD取样不可避免的会有跳动,如果刚好在临界点时,两个灯会跳来跳去的,后面也是用的滞回搞定,当时真不知道是这个叫法,只是想办法实现了当AD取样值高于一个点变灯后,如果要再变回来,必须与这个点拉开一段距离就解决了.... 好高深 这几天,我捣鼓出了不同与回滞算法的最新算法。这个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;
}
}
} 去抖动后再用上下限锁住就好了
页:
[1]