在上一篇中简单对MAX30102进行了读写并解释了其测量心率和血氧饱和度的原理。这篇主要写MAX32630FTHR板和MAX30102具体配合测量心率和血氧的步骤。
1.
硬件改进
上一篇中已经提到目前淘宝上卖的MAX30102模块存在明显的硬件错误,其将I2C的上拉电压固定在了1.8V稳压器的输出端,导致与其他I2C电平不兼容,比如一些常用的arduino板和STM32板都不能与其进行正常的通信。想做实验还要先飞线。
美信官方也推出了一个基于MAX30102的模块设计MAXREFDES117。模块很小巧,图1就是实物图,图2是原理框图。可以看出官方很明智地选用一片电平转换芯片MAX14595来
解决I2C总线电平不兼容的问题。但是无奈这个设计成本有点高,况且芯片不好买。
图1. MAXREFDES117
实物图
图2. MAXREFDES117
结构框图
本着精简够用的原则,我重新设计了原理图并制板实验了一下,效果还是不错的。具体改动很简单,就是将MAX30102的上拉电平连接到了
输入电源同时也是LED供电电源上。这样保证了I2C电平始终和输入电源一样,而绝大多数情况下我们通过单片机开发板提供给MAX30102模块的电源往往也是和单片机本身IO口电源是同一个。同时根据MAX30102的手册,LED的电源要求大于3.1V就可以(见图3),所以输入电源采用3.3V和5V均可。最后修改后的原理图如图4所示。
图3.MAX30102
的LED
电源要求
图4.MAX30102
模块的原理图
图5.
焊接后的实物图(MAX30102
封装不好焊啊)
2.
软件移植
官方的MAXREFDES117套件给出了基于arduino和mbed两种平台的心率和血氧
计算程序,其可以顺利应用于如下6种开发板:
mbed:
- Maxim Integrated MAX32600MBED#
- Freescale FRDM-K64F
- Freescale FRDM-KL25Z
Arduino:
- Adafruit Flora
- Lilypad USB
- Arduino UNO
下图6是
算法程序的流程图
图6.
心率血氧算法流程图
单片机在复位MAX30102后等待串口输入,当串口有任意字符输入,单片机即开始对MAX30102进行功能初始化,RED LED和IR LED交替点亮来检测人体皮肤下血液的搏动和血氧含量。单片机将一段时间内MAX30102采集的LED反射数据储存在内部RAM中,然后分别计算RED LED和IR LED的直流成分(DC)和交流成分(AC),最后算出数值R并通过预先储存在FLASH中的查找表来确定当前的SPO2(图7)。而心率值可以通过对单个LED的交流成分相邻两波峰之间的时间差T来确定,每分钟心跳数BPM=60/T。
图7.R
值与血氧的线性关系图
由于arduino UNO板所使用的mega328p单片机内存只有2KByte, 无法储存长时间的原始数据,因此程序中设定MAX30102的采样率为25HZ,每个数据只有16位(ADC的位数是18位,舍弃了最低2位数据)并只采了4S的数据。而MBED平台下的开发板都具有较大的内存,所以程序中设定MAX30102的采样率为100HZ,数据为32位并始终储存5S的数据进行计算。通过对比可以发现,使用MBED平台下开发板算出的心率和血氧值数值更精确,更稳定,性能超过了arduino UNO板。而本次实验使用的MAX32630FTHR板性能更强,其片上内存有512KB,远远超出了程序需求,编译后的程序RAM只有11.7KB。因此还可以进一步提升算法的性能和复杂度,使可穿戴设备具有更大的发展空间。
图8.程序编译后的空间占用情况
3.实验过程
针对MAX32630FTHR板进行程序的移植,并定义相应接口连接:
MAX32630FTHR<->MAX30102
3V3<->VIN
SCL(P3_5)<->SCL
SDA(P3_4)<->SDA
P3_2<->INT
GND<->GND
程序中使用板上的LED1(红色)来实时模拟心跳强弱。最后导出的keil程序如下
程序通过串口输出REDLED和IR LED的原始数据,还有心率数值和血氧数值及其是否有效标志,如下图:
图9.
串口数据输出
最后附上实验视频:
[media]http://player.youku.com/player.php/sid/XMjk1MjUyOTkzNg==/v.swf[/media]
在视频中可以看到MAX32630FTHR板上的红色LED随心跳强弱变换LED光强弱来模拟心跳(视频中可能不如实际中明显)。在手指接触良好的情况下,使用MAX30102测量的心率值与我左手上的荣耀S1手表测得的心率值接近(大概有2~3beat差别)。至于血氧饱和度,正常人一般都是95%以上,我在测试过程中基本都是99%~100%。但是需要注意的是,因为是基于查找表来确定血氧含量,所以每个血氧传感器都需要和专业仪器进行标定才准确。此外,RED LED的波长尤其容易受到环境温度影响,所以程序上要考虑到温度对血氧精确度的影响,这也是MAX30102本身带有温度传感器功能的主要原因。所以试验中的血氧饱和度是仅供参考,并不准确。
本帖总结:
1.修改后的MAX30102模块能兼容大多数开发板的I2C电平,使用更方便,器件更少
2.MAX30102的心率血氧算法更适合在大内存的单片机中运行,所以拥有512KB RAM的MAX32630FTHR非常合适,而且有更大的扩展潜力
3.实验效果较好,可以较为准确地测出手指的心率和血氧。
到此这篇max30102测量精度(测量仪精度0.1mm)的文章就介绍到这了,更多相关内容请继续浏览下面的相关推荐文章,希望大家都能在编程的领域有一番成就!
版权声明:
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若内容造成侵权、违法违规、事实不符,请将相关资料发送至xkadmin@xkablog.com进行投诉反馈,一经查实,立即处理!
转载请注明出处,原文链接:https://www.xkablog.com/qdvuejs/53945.html