一个很有意思的传感器,BH1790GLC心率传感器,这个传感器是ROHM生产的,一个日本的厂家。其他的不说,就说说这个传感器吧。
作为一名硬件开发设计人员,我拿到这个模块第一反映是去官网下载其数据手册,通过数据手册去了解这个传感器的特性。
当有一个脉搏信号传递过来时,会造成血管的体积发生变化,如上图所示。传感器就通过采集血管的变化来检测脉搏。
整个传感器框图如下:
传感器需要外接两个绿色的LED灯珠,这个LED普通的还真不行,模块使用的是SML-M13MT这个型号,它与普通的LED的区别是,其通过反射的方式,将光强在一定范围内实现等效分布。
芯片内部有绿色LED的驱动电路,另外在传感器的外部,有一组IRCUT滤波器,将外部的其它光线以及红外光线滤除,让绿光通过IRCUT,进入ADC去采集。最后数据通过IIC传输出来。
整个传感器也没有几个用到几个器件,但是我查了,这个模块还真不便宜,网上报价是在100左右。
模块的电路如下:
其他参数就不多少了,详情可以查看传感器的数据手册,
整个传感器的寄存器也没有几个,除了ID寄存器外,剩下就是控制寄存器,采集到的数据也是保存到DATOUT_LEDON 、DATOUT_OFF这两组数据寄存器中。
还在手册上有测量控制说明,不至于让我感到太迷茫:
按照这个时序,我对0x41– 0x43寄存器进行了如下设置。
最后按照时序要求就,读出DATOUT_LEDON 、DATOUT_OFF
我将读出的DATOUT_LEDON 、DATOUT_OFF值通过串口打印出来,并画了线。
下图为我手指没有放上去的时候的数据波形:
DATAOUT_LEDOFF(红色)、DATAOUT_LEDON(蓝色)的值几乎保持稳定,在室内数据处在260左右。
放上手指,波形马上发生了变化。
DATAOUT_LEDOFF(红色)马上下降到20附近、而DATAOUT_LEDON(蓝色)有了很明显跳动,跳动的幅度很小,而且DATAOUT_LEDON(蓝色)值一直上升。
这样的一个波形,当然如何去提取出脉搏数据?
又需要一个怎样的算法?
IIR滤波器应该是比较适合的一种方案。
说到IIR滤波器,那就不得不说FIR滤波器,这两个都是一种数字的线性滤波器,其两者最大的区别是:
1、在相同的技术指标下, IIR滤波器由于存在着输出对输入的反馈,因而可用比FIR滤波器需要更少的参数和资源。
2、FIR滤波器可得到严格的线性相位, 而IIR滤波器则做不到这一点。
3、IIR滤波器可以设计成标准低通、高通、带通、带阻、全通滤波器,而FIR滤波器则要灵活得多,可以设计出理想正交变换器、理想微分器、线性调频器等
所以在我们的应用中,考虑IIR滤波器就可以了。相位移位对我来说,没有任何问题。
针对上图中,当手指按下时的波形,需要对这个波形进行低通+高通的滤波。人体的脉搏正常范围在60-100之间。考虑到极端情况下,所以设置一个3.5HZ的低通滤波器和0.5HZ的高通滤波器,只需要截取0.5HZ - 3.5HZ范围的信号。
先说说IIR滤波器,我这里选择的是直接I型IIR滤波器,其基于二阶Biquad级联的方式来实现的。每个Biquad由一个二阶的滤波器组成:
y[n] = b0 * x[n] + b1 * x[n-1] + b2 *x[n-2] + a1 * y[n-1] + a2 * y[n-2]
直接 I 型算法每个阶段需要 5 个系数和 4 个状态变量,如下图。
x[n]就是输入变量,y[n]就是基于IIR滤波之后的输出值。
按照这样的公式,就是可以实现一个1阶的IIR滤波器,如果你在这个滤波器后面多加几个这样的滤波器,就可以实现多阶的IIR滤波器。
公式有了,但是上面公式中的b0 、b1、 b2、a1、a2这些参数当怎么确定??
答案是:使用MATLAB
使用fdatool打开滤波器设计工具箱
设置滤波器参数:
注意的是:我们配置的BH1790GLC心率传感器输出数据是按照32HZ的,所以滤波器的采样频率是32HZ,截至频率是3.5HZ,
滤波器参数使用MATLAB输出如下:
得到了滤波器的参数,开始写代码吧。
定义IIR滤波器参数结构体:
IIR滤波器初始化
IIR滤波器计算实现代码如下:
关于滤波器的部分基本上 就是这么回事。
剩下的就是使用IIR滤波器。
程序按照32HZ的频率去读取传感器的数据。
pw_GetMeasureData(&s_pwData);读取传感器的数据保存到s_pwData
pwCalc(&s_pwData,&pw); 数据经过IIR滤波之得到PW数据
滤波方式如下:
首先原始数据先经过滑动求平均之后,经过高通滤波器之后,在经过低通滤波器,最后输出dataOut
现在我将原始数据和滤波之后的数据通过串口传出来,波形显示如下:
红色DATAOUT_LEDON,蓝色DATAOUT_LEDOFF,以及经过IIR滤波之后的数据 pw绿色
将PW波形放大之后:
可以看到,经过IIR滤波之后,pw几乎呈现很规律的正弦波,这样就可以很方便的统计出传感器的脉搏心跳。
最后统计心跳,通过串口显示如下:
当前心率为71,反复测试几次,数值都在70-75,看来一致性还是不错。
评论
查看更多