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

643 阅读1分钟

        消抖滤波法的实现步骤为:设置一个滤波计数器,将每次采样值与当前有效值比较,如果采样值等于当前有效值,则计数器清零。如果采样值不等于当前有效值,则计数器+1,并判断计数器是否>=上限N(溢出),如果计数器溢出,则将本次值替换当前有效值,并清计数器。也就是只有采样值连续变化N次之后,才将采样值做为有效值。

      下面直接看C代码的实现

define N 12
unsigned int filter9( void )
{
    unsigned int count = 0;
    unsigned int new_value = 0, value = 0;
    new_value = ReadVol_CH2();
    while( value != new_value )
    {
        count++;
        if( count >= N )
        {
            value = new_value;
            return new_value;
        }
        new_value = ReadVol_CH2();
    }
    return value;
}

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

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

 

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

消抖滤波法对于变化缓慢的被测参数有较好的滤波效果,可避免在临界值附近控制器的反复开/关跳动或显示器上数值抖动。
但是对于快速变化的参数不宜,如果在计数器溢出的那一次采样到的值恰好是干扰值,则会将干扰值当作有效值导入系统。