消抖滤波法

大家经常可以看到两种情况:一种是传感器采样的时候数据会抖动,会跳动,另一种是单片机按键时去抖。两种情况原因都很简单,可以用去抖滤波法解决。

首先先说一下传感器采样的时候在临界线的时候可能前一帧采集到数据,然后下一帧采集不到数据了,后面一直采集到数据。然后数据简单的模拟就是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();
		}
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

生命如歌,代码如诗

听说,打赏我的人都找到了真爱!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值