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

395 阅读1分钟

        限幅滤波法就是通过软件来限制本次采样值的上次采样值的偏差,若本次采样值和上次采样值的偏差超过了设定的最大偏差值,则丢弃本次的采样值。

       下面看C代码的实现

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


#define A 200                    //允许最大误差值

unsigned int  filter1( void )                  
{
    static unsigned int  value;
    unsigned int  new_value;
    new_value = ReadVol_CH2();
    if( num_sub( new_value, value ) > A )
    {
        return value;
    }
    value = new_value;
    return new_value;
}

 A为连续两次采样的最大误差值,若两次采样值的差超过了允许最大误差,则丢弃本次采样值。若误差小于允许最小误差,则认为本次采样值有效。

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

主程序中循环读取AD口的采样值,并将采样值通过限幅滤波算法进行滤波,通过串口分别打印原始采样值和滤波后的值,并通过串口将数据打印来,并在串口波形软件上显示。

    蓝色曲线为采样的原始数据波形图,橙色曲线为经过限幅滤波算法滤波后的波形图。通过两组曲线可以看出,经过限幅滤波算法后,将原始曲线中的尖峰数据滤除掉了,使得采样数据更加平滑。

     限幅滤波法可以滤除偶然因素引起的脉冲干扰,但是要求对系统的采样数据范围要有准确的判断,否则如果允许误差值设置不合理,可能会将系统中正常的数据滤掉。