AD采样滤波显示
最近做了一个AD采样电压并显示出来的东西,发现显示值的最后一位闪的厉害,上网搜了一下资料,网上说的方法挺多的,但效果不是很理想,偶然之间我想道了一种办法,效果非常好,不敢独享特与大家共享。如有雷同,请见谅,这的确是我自己想出来的。高手大侠就不要喷我了。废话不多说,上滤波代码。
unsigned char hCount;//高计数
unsigned char lCount;//低计数
unsigned char cv; //当前采样值
unsigned char pv; //前一次采样值
#define FILTER_TIME 2000 //滤波时间
void AD_Filter(void){
if(cv > pv){
if(lCount > 0){
lCount--;
}
hCount++;
if(hCount > FILTER_TIME){
pv = cv;
hCount = 0;
lCount = 0;
}
}
else if(cv < pv){
if(hCount > 0){
hCount--;
}
lCount++;
if(lCount > FILTER_TIME){
pv = cv;
lCount = 0;
hCount = 0;
}
}
else{
hCount = 0;
lCount = 0;
}
}
思路是这样的,拿当前值与前一次值比较,如果当前值大于前一次值,hCount加一,lCount减一;如果小于lCount加一,hCount减一;等于hCount,lCount清零。
如果hCount或者lCount大于给定值,那么当前值赋给前一次值。最后返回前一次值。
其实就是计算当前值与前一次值大小的概率,哪个概率大,值就等于哪个。
这个靠谱不?。 楼主程序很好的。谢谢了。 我也在解决这个问题,我也试试你的方法
页:
[1]