单片机ADC采样算法----限幅消抖滤波法

限幅消抖滤波法相当于“限幅滤波法”+“消抖滤波法”    。   

      下面直接看C代码的实现

#define A 200
#define N 20
//返回两个整数差
unsigned int num_sub( unsigned int a, unsigned int b )
{
    return ( a >= b ? ( a - b ) : ( b - a ) );
}

unsigned int filter10( void )
{
    unsigned int count = 0;
    unsigned int new_value = 0;
    static unsigned int last_value = 0;
    new_value = ReadVol_CH2();
    if( num_sub( new_value, last_value ) < A )
    {
        new_value = new_value;
    }
    else
    {
        new_value = last_value;
    }
    
    
    while( new_value !=  last_value)
    {
        count++;
        if( count >= N )
        {
            last_value = new_value;
            return new_value;
        }
        new_value = ReadVol_CH2();
        if( num_sub( new_value, last_value ) < A )
        {
            new_value = new_value;
        }
        else
        {
            new_value = last_value;
        }
    }
    return last_value;
}



void main( void )
{
    while( 1 )
    {
        val = ReadVol_CH2();        //读取AD采样值
        val1 =  filter10();
        printf( "A%d\r\n", val );
        printf( "B%d\r\n", val1 );
    }
}

主函数中实时采样AD端口的波形值,然后将采样值经过限幅消抖滤波法进行滤波,然后用串口输出原始采样值和滤波后的值,并在串口波形软件上显示采样的数据波形。

图中蓝色曲线为原始数据曲线,橙色曲线为经过滤波算法后的曲线。

限幅消抖滤波法继承了“限幅”和“消抖”的优点,改进了“消抖滤波法”中的某些缺陷,避免将干扰值导入系统。

发布了76 篇原创文章 · 获赞 30 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qq_20222919/article/details/105164526