ibichao 发表于 2012-5-26 13:21:12

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大于给定值,那么当前值赋给前一次值。最后返回前一次值。

其实就是计算当前值与前一次值大小的概率,哪个概率大,值就等于哪个。


zcx2012 发表于 2012-5-26 13:35:30

这个靠谱不?。

anxiangbo 发表于 2013-11-24 18:39:08

楼主程序很好的。谢谢了。

HZY//123456 发表于 2016-5-18 09:10:32

我也在解决这个问题,我也试试你的方法
页: [1]
查看完整版本: AD采样滤波显示