基于BH1790GLC脉搏数据采集的设计方案

描述

硬件组成与连接

1、ROHM的传感器底板Sensor Shield

2、BH1790GLC传感器

3、ArduinoNANO电路板。

数据采集

连接关系如上图所示

程序解读

ROHM官方提供的BH1790GLC_HeartRate例程是基于arduino写的,文件结构如下图:

数据采集

这样的程序目录,显然很不合适使用arduino IDE去查阅,这里推荐大家使用Source Insight的软件去查看代码。需要注意的是,Source Insight不支持.ino文件,为了方便,将HeartRate.ino另存为一个.c的文件,方便Source Insight查看。

将程序烧录到硬件中运行如下:

数据采集

当前心率为70,反复测试几次,数值都在70-75,看来一致性还是不错。

废话不多说,先看看ROHM怎么写的,下面开始直接上代码:

数据采集

在setup()函数中,有两个比较关键的函数hr_bh1790_Init()和hr_bh1790_StartMeasure()函数

其中hr_bh1790_Init()并没有对bh1790硬件进行初始化,只是简单的读取了传感器的两个ID寄存器,验证了一下传感器的身份,同时让硬件进行复位。

数据采集

其主要的工作还是去初始化程序定义的结构体,给这些结构体赋上初值。

其中pwCalc_Init(void)函数也很重要,程序中定义了两个IIR数字滤波器,这个函数是将这个数字滤波器进行初始化。

两个IIR数字滤波器是3.5HZ的高通滤波器和0.5HZ的低通滤波器。

小知识:

在律规则的情况下,心率和脉搏是一致的。如果有心律不齐的人,会测到心率和脉率不一致,脉率少于心率。正常人心率在60—100次/分钟,在此范围有波动都是正常的

所以将两个数字滤波器设置在这个这个范围是合适的。

接下来就是在setup()函数中的另外一个函数hr_bh1790_StartMeasure (void)

数据采集

在这个函数中程序对MEAS_CTRL1、MEAS_CTRL2、MEAS_START寄存器进行了操作

接下来就是最关键的loop()函数,看看ROHM官方是怎么将波形数据进行处理的。

数据采集

在loop函数中,timer_flg是一个32HZ的计时标志,每隔31.25MS,就读一次传感器的数据,并进行计算。

其中hr_bh1790_Calc(s_cnt_freq)是本次分析的关键函数,在这个函数中,程序将传感器数据进行读取,滤波,判断,最后计算出心率值;而hr_bh1790_GetData()仅仅是将心率结果数据和判断读出来,方便串口打印而已。

直接查看hr_bh1790_Calc()函数:

数据采集

在这个函数中,程序通过pw_GetMeasureData(&s_pwData);将寄存器DATAOUT_LEDOFF和DATAOUT_LEDON的数据读出来保存到s_pwData结构体中。

pwCalc(&s_pwData,&pw);及将s_pwData数据传入到IIR滤波器中,经过高通和低通滤波器之后,得到的数据保存到PW变量中。

数据采集

ma_AverageF()滑动求平均,

iir_Filter()即数字滤波器,先后经过s_iirPrm_hpf高通数字滤波器和s_iirPrm_lpf低通数字滤波器。

我在BH1790GLC_HeartRate例程上插入自己的代码,将s_pwData(红色DATAOUT_LEDON,蓝色DATAOUT_LEDOFF)以及经过IIR滤波之后的数据 pw(绿色)绘制出来。

数据采集

将绿色图形放大:

数据采集

可以看到,经过IIR滤波之后,pw几乎呈现很规律的正弦波。

并且,这个波形与s_pwData的幅值大小没太大的关系。所以,最这样的波形进行统计和判断是就比之前要容易很多了。

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分