硬件组成与连接
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的幅值大小没太大的关系。所以,最这样的波形进行统计和判断是就比之前要容易很多了。
全部0条评论
快来发表一下你的评论吧 !