PNI12927磁场强度传感器--金属检测实现方案

上面是我的微信和QQ群,欢迎新朋友的加入。

驱动代码就不共享了,模拟SPI驱动就行

读取数据一共是三步

1.设置时钟周期计数

2.创建一个读取任务,等待芯片处理完成

3.读取数据

本文主要表达我对这个芯片检测金属的几个想法

1.最简单的检测

有金属靠近,传感器输出1,亮灯

没有金属存在,灭灯

这是理想状态的情况,传感器输出认为是一个非此即彼的状态。

代码实现

uint8_t sensor(void)
{
	if("金属靠近")
		return  1;
	else 
		return 0;
}

2.阈值检测

如果编写了传感器的驱动程序,会发现,数据并不是一个非此即彼的简单模型。

传感器在静止的状态下,测量值近乎稳定,但是仍有几个数值的变化

此时就要考虑怎样识别是否有金属靠近。

观察测量数据,当金属靠近的时候,一轴或者多轴会有一个较大的数值变化

假设当前只考虑一轴。

如果正常状态,传感器测量值在3附近变化,有金属靠近时,数值变为50,设定一个阈值,如果超过这阈值,认为是金属靠近,如下,设定阈值为30,超过这个值就认为是存在一个金属物

#define threshold 30
uint8_t sensor(void)
{
	uint8_t res;
	res = 	(sensor_data > threshold)?
			1:0;
}

3.差值阈值

考虑显示条件,我不可能去测不同地点、时间、温度等不同环境下的初始数值,这是一个十分庞大的数据量,不能将阈值设为传感器检测的值

这里可以关注到一件事情,那就是有金属靠近的时候,其实传感器数值是会产生一个变化的

那么,可以以传感器变化的差值作为阈值去检测金属靠近

#define threshold 30
uint8_t sensor(void)
{
	uint8_t res;
	
	//本次测量数据减去之前的测量数据
	res = 	(sensor_data - old_sensor_data > threshold)?
			1:0;
}

4.将时间纳入检测条件

上面的程序其实有个问题,那就是我检测的是本次和上次两次的数据差

那如果我传感器测量的数据是缓慢变化的,阈值不是始终没有过头?

此时,时间也应该是衡量的一个标准

假如下图是测量的数据,在一个时间段的波形图,可以看出,在10左右是有东西靠近的

代码实现

#define THRESHOLD 30
#define ARRY_SIZE 10
uint8_t arry[ARRY_SIZE];
uint8_t arry_ptr = 0;

uint8_t sensor(void)
{
	uint8_t res;
	uint8_t min;
	uint8_t max;
	
	//数据进入缓存区
	arry[arry_ptr] = sensor_data;
	
	//移动读写指针
	arry_ptr++;
	if(arry_ptr >= ARRY_SIZE)
		arry_ptr = 0;
	
	//计算最大最小值
	for(uint8_t i=0;i<ARRY_SIZE;i++)
	{
		min = 	min > arry[i]?
				arry[i]:min;
				
		max = 	max < arry[i]?
				arry[i]:max;
			
	}
	
	//返回状态
	res = 	(max - min) > THRESHOLD?
			1:0;
}

5.阈值也应该是自动获取的

传感器在不同环境下,得到的参数是不一样的

简单点说,我现在阈值是20,跑的很正常,但是如果换个环境,阈值是200,可能都不是一个正常的状态

这个时候,阈值给定值是个很不明智的做法

方法1:

读取一段数据,计算这个时间内出现的最大差值,以它为基数乘一个系数做为阈值

方法2:

将每次的进入的数据记录下来,计算出出现频率最大的数据,这个值作为基准值,乘一个系数作为阈值

方法3:

外部矫正,测量到金属的时候,传递一个信号给MCU,告诉系统,这个时候就是有金属被检测到的

方法4:

初始化置零,在开机的时候,就计算出一个偏移量,这个偏移量加上静止值应该为0,如果有金属靠近,相加的和肯定不是0

6.异常值去除

传感器检测应该是允许存在检测异常的,这个异常可能是电路问题导致,也可能是程序问题导致

但是设备必须能适应各种环境因素,至少能够有能力抵抗一些异常因素

如下图,金属靠近是有个曲线变化过程的

可以将对极值两端做检测,是否有一个曲线变化过程,如下图

测量周期存在一个极小的尖峰值,可以认为是没有金属靠近的

7.类过采样检测

这是参考MCU串口通信检测机制,如果细看芯片数据手册,例如STM32的串口通信部分

会提到一个过采样的理念

大致意思是,见到一个高电平之后,会以当前波特率的倍频去连续检测几次,如果都是高电平,或者大部分是高电平

认为本次拿到的是一个1,否则是0.

但是还有个问题,像按键处理,存在一个抖动的问题,串口在这方面的处理是,不取检测到高电平之后的信号,而是取脉冲中间的数据

来个图

假设这是传感器拿到的数据,在7的时候,拿到了数据,有金属靠近,但是此时程序里面是还没有下定论说金属被检测到了

而是要在第9和第10个数据位的时候,重新拿两次数据,像图里面,将会有两个高电平

那这个时候,就可以下结论检测到数据了

当然也有人会说遇到下面情况怎么办

其实很简单,东西坏了,换新的

抗干扰不意味着要抵抗所有异常数据,只有大部分是正常的数据,中间出现几个异常状态,抗干扰才有意义

否则连人都不能分辨干扰和数据,机器又怎么去分析数据

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值