MAX30102采集心率数据

一个100行的代码调试都可能会让程序员遇到很多挫折,所以,面对挫折,我们永远不能低头。

关于MAX30102驱动配置程序,网上搜索博客有一堆资料,c/c++写的驱动代码都有,

可参考博客:

MAX30102 血氧调试笔记

以及官方数据手册

软件流程:

*  中断向量初始化

*  串口初始化

*  定时器初始化

*  IIC初始化

*  max30102初始化

*  循环读取max30102数据寄存器的值

*  每隔10s计算一次心率值

基本的单片机配置不用多说,不会的可以区正点原子官网下载例程好好学一学

正点原子资料链接

stm32系列基本上都是库函数,非常适合新手上手

我这里使用的是stm32f405单片机

单片机调试会出现很多莫名其妙的bug,有软件产生的,有硬件产生的,要学会逐个问题的分析排查

调试max30102尤其要注意的点;

*  搞清楚测心率是红灯还是红外,官方英文手册有写:红灯是心率模式,红灯+红外是血氧模式

*  一定要保证IIC配置正确,这样才能读到数据

*  一定要注意max30102的采样频率,采样频率的设置直接关系到心率计算的准确度

*  根据采样频率如设置100hz,说明每10ms采样一个数据,那么就可以采用定时器每定时10ms设置标志位,然后再在应用程序里判断标志位从而把数据读出来

*  读取数据可采用fifo模式,需看懂官方手册,如何利用fifo读取数据以及每个数据是如何组成的,如心率模式下,读FIFO是六个字节,前后三个字节都是红灯数据 

*  10s即可读到1000个数据,利用此1000个数据即可计算心率值

硬件准备就绪,软件驱动配置正确的情况下,将手指头贴在max30102上面静止不动,采集数据如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
112539
112514
112534
112523
112548
112631
112578
112663
112591
112636
112669
112644
112436
112386
112262
112296
112183
112234
112138
112155
112143
112205
112162
112158
112178 

 采集到数据后需要对数据进行预处理,再经过心率提取算法,计算出心率值,可先离线分析,再将代码实现在单片机上。

数据预处理部分基本上包含如下:

*  环境光处理(硬件处理)

*  去除运动伪影

*  三轴加速度数据估计噪声(运动下配合维纳滤波器,可搜索相关论文

*  维纳滤波衰减噪声(适合运动下测量)

*  巴特沃兹去低频噪声

*  rolling去除基线漂移,只能线性补偿,非线性待测试解决

*  均值滤波->滑动平均使波形更平滑

python实现效果如下:

 

经过和华为watch测试对比,静止情况下,误差在1%之内

 

posted @   念经似的zzz  阅读(7051)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· 百万级群聊的设计实践
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性
点击右上角即可分享
微信分享提示