赞
踩
大家经常可以看到两种情况:一种是传感器采样的时候数据会抖动,会跳动,另一种是单片机按键时去抖。两种情况原因都很简单,可以用去抖滤波法解决。
首先先说一下传感器采样的时候在临界线的时候可能前一帧采集到数据,然后下一帧采集不到数据了,后面一直采集到数据。然后数据简单的模拟就是1-0-1-1-1-1,多了个1-0-1的变化,这个是我们不需要的,这就可以采取滤波算法进行处理了。
滤波算法都十几种,比如中位值滤波法、算术平均滤波法、加权递推平均滤波法等等,下面介绍的是消抖滤波法。
消抖滤波法
方法:
设置一个滤波计数器
将每次采样值与当前有效值比较:
如果采样值=当前有效值,则计数器清零
如果采样值<>当前有效值,则计数器+1,并判断计数器是否>=上限N(溢出)
如果计数器溢出,则将本次值替换当前有效值,并清计数器
优点:
对于变化缓慢的被测参数有较好的滤波效果,
可避免在临界值附近控制器的反复开/关跳动或显示器上数值抖动
缺点:
对于快速变化的参数不宜
如果在计数器溢出的那一次采样到的值恰好是干扰值,则会将干扰值当作有效值导入系统
#define N 6
int filter(bool state)
{
static count = 0;
static lastState = 0;
if(!state)
{
if((++count)<N)
return lastState;
}
count = 0;
lastState = state;
}
下面说一下单片机的按键去抖。原理也是一样,都一点小小的改变就是没用计数器的方式,而是采用delay延迟的方式:
#include<reg52.h> sbit K1 = P1^0; void delay(unsigned int x) //延时 x ms { unsigned int i,j; for(i=x; i>0; i--) for(j=110; j>0; j--); } void main() { unsigned int i; if(K1==0) { delay1ms(10); if(K1==0) // { for(i=0; i<100; i++) //此处消抖程序非常经典,怎么按都绝对不会产生抖动。 { if(K1==0) i=0; } //在这儿添加按键按下后要执行的功能。 function(); } } }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。