上面是我的微信和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个数据位的时候,重新拿两次数据,像图里面,将会有两个高电平
那这个时候,就可以下结论检测到数据了
当然也有人会说遇到下面情况怎么办
其实很简单,东西坏了,换新的
抗干扰不意味着要抵抗所有异常数据,只有大部分是正常的数据,中间出现几个异常状态,抗干扰才有意义
否则连人都不能分辨干扰和数据,机器又怎么去分析数据