消抖滤波法的实现步骤为:设置一个滤波计数器,将每次采样值与当前有效值比较,如果采样值等于当前有效值,则计数器清零。如果采样值不等于当前有效值,则计数器+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端口的波形值,然后将采样值经过消抖滤波法进行滤波,然后用串口输出原始采样值和滤波后的值,并在串口波形软件上显示采样的数据波形。
图中蓝色曲线为原始数据曲线,橙色曲线为经过滤波算法后的曲线。
消抖滤波法对于变化缓慢的被测参数有较好的滤波效果,可避免在临界值附近控制器的反复开/关跳动或显示器上数值抖动。
但是对于快速变化的参数不宜,如果在计数器溢出的那一次采样到的值恰好是干扰值,则会将干扰值当作有效值导入系统。