数字滤波 - 振动传感器滤波处理

一、创作思路

        二维振动传感器工作原理类似于一个开关,当磁珠滚向左边时输出高电平,滚向右边时输出低电平(也可能反过来,看采集结果而定)。由于工作环境会存在一些微小振动,可能会出现高低电平的不断输出,影响采样结果,所以对采样结果做一个滤波处理。

 二、代码编写

#include "user_shock.h"

#define SHOCK_SENSITIVITY    15    //150ms,输出电平的时间持续时间大于150ms,认定状态稳定。

unsigned char old_state = 0;//定义一个变量存放老的状态,用来对比。
unsigned char new_state = 0;//定义一个变量存放新采集到的状态,用来与老状态对比。
unsigned int shock_high_cnt = 0;//低电平的持续时间
unsigned int shock_low_cnt = 0;//高电平的持续时间


void shock_init(void)
{
	GPIO_InitTypeDef GPIO_InitStruct;
	GPIO_InitStruct.GPIO_Pin    = GPIO_Pin_0;
  GPIO_InitStruct.GPIO_Mode   = GPIO_Mode_IN;
  GPIO_InitStruct.GPIO_Ctrl  = GPIO_Control_DIG;
  GPIO_InitStruct.GPIO_PuPd  = GPIO_PuPd_NOPULL;//不进行上下拉,电平取决于外部电压
	GPIO_Init(GPIO_PORT12, &GPIO_InitStruct);
	old_state = GPIO_ReadInputDataBit(GPIO_PORT12,GPIO_Pin_0);//读取一个状态作为老状态。
	new_state = old_state;//将新老状态同步,作为一个判断标准。
}




//10ms扫描一次
//返回稳定状态
unsigned char shock_scan(void)
{
	unsigned char state = 0;
	if(GPIO_ReadInputDataBit(GPIO_PORT12,GPIO_Pin_0) == 0)//获取状态
	{
		//滤波处理
		if(shock_low_cnt < SHOCK_SENSITIVITY)   
		{
			shock_low_cnt++;
		}
		else                       
		{
			shock_low_cnt = 3000;//表示稳定
			shock_high_cnt = 0;
		}
	}
	else //获取状态
	{
		//滤波处理
		if(shock_high_cnt < SHOCK_SENSITIVITY)   //高电平的时间超过了预设值,认定稳定。
		{
			shock_high_cnt++;//高电平的时间自增
		}
		else                       	
		{
			shock_high_cnt = 3000;//表示稳定
			shock_low_cnt = 0;
		}
	}
	
	//判断滤波后的状态
	if(shock_high_cnt >= SHOCK_SENSITIVITY)  state = 1;
	if(shock_low_cnt  >= SHOCK_SENSITIVITY)  state = 0;
	
	//输出结果
	return state;
}


//10ms获取一次传感器状态
unsigned char shock_state(void)
{
	unsigned char state = 0;
	new_state = shock_scan();//获取滤波后的状态
	if(new_state != old_state) state = 1;//如果状态与初状态不一样,表示设备移动。
	else                       state = 0;//设备没动
	return state;//输出判断结果。
}







三、程序说明

        传感器函数初始化后,要将shock_state()函数放到10ms轮询一次的代码中,以确保稳定。shock_state()的输出结果是状态有没有进行反转。

        优势:过滤掉一些短时间的振动,避免误报。

  • 10
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
要理解逻辑分析仪抓取的数据,可以按照以下步骤进行: 1. 确定抓取的信号类型:首先要确定你正在分析的信号类型,如时钟信号、数据信号、控制信号等。这有助于你理解数据的含义和关系。 2. 确定抓取的时间范围:逻辑分析仪通常可以捕获一定时间范围内的信号。确定你所关注的时间段,以便针对该时间段进行数据分析。 3. 分析信号波形:通过查看抓取的信号波形,可以观察信号的变化、周期性、电平变化等信息。可以注意以下几个方面: - 信号的周期和频率:观察信号的高低电平持续时间和周期,以确定其频率和工作模式。 - 电平变化:观察信号在高电平和低电平之间的变化,以确定数据的传输方式和编码格式。 - 噪声和干扰:注意是否存在噪声和干扰信号,可能需要进行滤波处理- 各个信号之间的关系:观察不同信号之间的相对时间关系,确定它们之间的交互模式。 4. 解码数据:根据信号的特征和协议规范,对抓取的数据进行解码。这可能需要参考相关的协议文档或手册,以确定数据的含义和格式。例如,可以识别不同的数据包、命令或状态信息。 5. 数据分析和验证:根据你的需求,对解码后的数据进行分析和验证。这可能包括验证数据的正确性、判断传输是否存在错误或丢失,或者提取特定的信息进行后续处理。 注意,逻辑分析仪抓取的数据通常是二进制格式或者原始信号波形,需要进行进一步的解码和分析才能得到有意义的信息。具体的分析方法和工具可能会根据你所使用的逻辑分析仪和信号类型而有所不同。参考逻辑分析仪的用户手册和相关资料,可以更加深入地了解数据分析的方法和技巧。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值