“本文将讨论生物传感器和可穿戴设备的发展趋势以及设计人员所面临的挑战。然后介绍来自 Maxim Integrated 的心率和外周血氧饱和度 (SpO2) 生物传感器模块,并向开发人员展示如何使用该模块更有效地设计可穿戴设备,从而既能提供精确的心率和其他测量值,同时又不影响电池供电型移动产品紧张的功耗预算。
”
作者:Stephen Evanczuk
新冠病毒让人们提高了对健康的关注度,这在某种程度上促使人们对生物传感可穿戴设备产生极大兴趣,进而又推动人们对更有效的解决方案的需求。人们需要更小的外形尺寸、更多的功能、更高的精度、更低的成本以及更长的电池续航时间。对于设计人员来说,这会带来一系列持续的挑战,因为他们需要应对紧迫的上市时间窗口和预算。有利的是,生物传感技术取得了进步,市面上出现了功能集成度更高的产品和更全面的设计解决方案。
本文将讨论生物传感器和可穿戴设备的发展趋势以及设计人员所面临的挑战。然后介绍来自 Maxim Integrated 的心率和外周血氧饱和度 (SpO2) 生物传感器模块,并向开发人员展示如何使用该模块更有效地设计可穿戴设备,从而既能提供精确的心率和其他测量值,同时又不影响电池供电型移动产品紧张的功耗预算。
生物传感设计要求
虽然心率监测是各种消费类可穿戴设备的核心要求,但人们对 SpO2 测量的兴趣不断增加。SpO2 测量曾经主要是由运动员用来优化其健身计划的,现在已经发现了更广泛的应用,特别是自我监测与新冠病毒疾病相关的呼吸功能下降迹象。对于开发人员来说,若要为习惯于使用可穿戴电子产品且注重健康的人群提供合适的解决方案,在成本、功耗、外形尺寸和重量方面都面临着巨大的挑战。
现在,许多生物传感器都集成了模拟前端子系统,因此开发人员不必构建健康与保健测量所需的信号链和后处理子系统。但在这些先进的设备中,很少有设备正好具备适合可穿戴设备的功能组合。因此,它们并没有解决在满足用户对微型生物传感可穿戴设备的期望方面出现的设计挑战,这些可穿戴设备要与其他类型的领先可穿戴设备一样不显眼,其中包括智能手表、健身腕带和真无线耳机。
当开发人员需要为这些流行的可穿戴设备类型增加一种或多种生物传感功能时,可能会出现与设计集成相关的更多挑战。与所有其他类型的电池供电型个人移动电子产品一样,即使对最小的产品,消费者也会隐含地要求延长电池续航时间,他们通常会根据电池续航时间以及成本和功能来选择这些产品。
为了满足这些组合的需求,开发人员可以转而使用 Maxim Integrated 的 MAXM86146 生物传感模块来设计定制设备,并使用基于 MAXM86146 的 MAXM86146EVSYS 评估系统来进行快速原型开发。
生物传感模块提供了直接替代式解决方案
Maxim Integrated 的 MAXM86146 生物传感模块采用 4.5 x 4.1 x 0.88 毫米 (mm) 38 引脚封装,是一款直接替代式解决方案,旨在帮助加快开发电池供电型紧凑型健康与保健可穿戴设备。为了同时满足对延长电池续航时间和生物传感功能的需求,该模块在将功耗降至最低的同时,保持着对心率和 SpO2 的快速准确测量。
除了两个集成光电二极管,该模块还包括 Maxim Integrated 的 MAX86141 双通道光学模拟前端 (AFE) 和基于 Arm Cortex-M4 的微,后者是 Maxim Integrated 的 MAX32660 Darwin 微的生物传感优化版(图 1)。
图 1:Maxim Integrated 的 MAX86146 生物传感模块在紧凑型封装中集成了光学 AFE、微和光电二极管。(图片来源:Maxim Integrated)
集成式 MAX86141 每秒采集 25 个样本 (sps) 时,功耗仅为 10 微安 (μA),它提供了一个综合光学 AFE 子系统,旨在控制用于测量心率和 SpO2 的多个发光二极管。光学心率监测器通常使用光电容积描记法 (PPG),可监测与每次心脏搏动相关的外周血容量变化。对于这种测量,这些设备通常使用波长为 540 纳米 (nm) 的绿光,这种光会被血液吸收,并且由于绿光穿透组织的深度比许多其他波长要浅,所以产生的伪影比较少。光学脉搏血氧计使用红色 LED(通常为 660 nm)和红外 (IR) LED(通常为 940 nm)来测量血红蛋白和脱氧血红蛋白之间的吸收差异,这是光学 SpO2 测量法的基础技术(请参阅利用现成元器件设计低成本脉搏血氧仪)。
为了执行这些光学测量,开发人员必须确保光电二极管信号采集与来自相应 LED 的光输出脉冲精确同步。MAXM86146 模块集成的 MAX86141 AFE 提供了独立的信号链,分别用于 LED 控制和光电二极管信号采集。在输出端,AFE 包括三个大电流、低噪声 LED 驱动器,可将脉冲传输到用于心率测量的绿色 LED 以及用于 SpO2 测量的红色和红外 LED。在输入端,AFE 提供两个光电二极管信号采集通道,每个通道都有一个专用的 19 位模数转换器 (ADC)。这两个读出通道可以单独操作,也可以组合使用,以提供更大的辐射面积。
为控制 AFE LED 和光电二极管信号链,板载微上运行的固件可调整 AFE 设置,以最大程度提高信噪比 (SNR) 并降低功耗。随着环境光的变化,集成式 MAX86141 中内置的环境光校正 (ALC) 电路会对光照条件的逐渐变化作出响应。但是,在某些情况下,例如当用户在阴影区域和明亮的阳光间快速穿过时,环境光可能会快速变化,从而导致 ALC 故障。考虑到这种常见的情况,MAX86141 加入了栅栏检测和替换功能。在这里,该器件会识别环境测量值与先前样本的较大偏差,并将个别外围环境光数据样本替换为与环境水平相对缓慢变化相一致的外推值。
由于该模块的微使用其固件来管理 AFE 操作,因此执行精确的心率和 SpO2 测量所需的详细操作对于开发人员来说是透明的。该模块使用固件设置自动执行这些测量,将原始数据和计算结果存储在先进先出 (FIFO) 缓冲区中,供系统主处理器通过模块的 I2C 串行接口访问。
MAX86146 如何简化可穿戴设备的硬件设计
凭借广泛的集成功能,MAX86146 生物传感模块只需要相对较少的额外元器件,就可以完成能够提供精确心率和 SpO2 测量的设计。若要同步进行心率和 SpO2 测量,MAX86146 可以与外部低噪声模拟多路复用器集成,例如连接到分立式绿色、红色和红外 LED 的 Maxim Integrated MAX14689 开关(图 2)。
图 2:要同步执行心率和 SpO2 测量,除了合适的 LED、模拟多路复用器(MAX14689,左侧)和加速计,Maxim Integrated 的 MAX86146 生物传感模块几乎不需要其他元器件,就可以在测量的同时检测运动。(图片来源:Maxim Integrated)
此外,MAXM86146 还设计成使用来自三轴加速计的运动数据,以在心率测量期间校正用户的运动,并在 SpO2 测量期间检测运动,后者需要用户在测量的短时间内保持静止状态。在这里,开发人员可以将固件支持的加速计直接连接到 MAXM86146 的 SPI 端口,或者将通用加速计连接到主机处理器。
主机连接选项为器件选择提供了更大的灵活性,只需要一个通用三轴加速计,例如 Memsic 的 MC3630,采样速度可达 25 sps。尽管如此,开发人员仍需要确保加速计数据与心率数据采样同步。为此,板载微根据需要对加速计样本进行内部抽取或插补,以补偿心率数据和加速计数据之间的漂移。
快速启动 MAXM86146 评估和快速原型开发
虽然 MAXM86146 简化了系统硬件设计,但对于希望评估 MAXM86146 或快速开发其应用原型的开发人员来说,他们可以跳过硬件设计,通过 MAXM86146EVSYS 评估系统立即开始使用该器件。MAXM86146EVSYS 通过 USB 或 3.7 V 锂聚合物 (LiPo) 电池供电,包括一个基于 MAXM86146 的 MAXM86146_OSB 光学传感器板 (OSB),并通过软线连接到支持低功耗蓝牙 (BLE) 的 MAXSensorBLE 主数据采集板(图 3)。
图 3:Maxim Integrated 的 MAXM86146EVSYS 评估系统包括支持 BLE 的主处理器板和基于 MAXM86146 的传感器板(用软线连接)。(图片来源:Maxim Integrated)
MAXSensorBLE 板集成了 Maxim Integrated 的 MAX32620 主机微,以及 Nordic Semiconductor 的 NRF52832 蓝牙微。实际上,MAXSensorBLE 板可作为支持 BLE 的可穿戴式设计的完整参考设计。除了支持有源和无源元器件外,MAXSensorBLE 板设计还配备 Maxim Integrated 的 MAX20303 电源管理集成电路 (PMIC),该电路专为延长可穿戴设备的电池续航时间而设计。
MAXM86146_OSB 光学传感器板将 MAXM86146 生物传感模块与 MAX14689 模拟开关和同步执行心率和 SpO2 测量所需的整套 LED 组合在一起。此外,该板集成了一个支持固件的三轴加速计,直接连接到 MAXM86146 模块。
要使用 MAXM86146EVSYS 评估系统评估 MAXM86146 模块,开发人员使用 USB-C 或 LiPo 电池为系统供电,并根据需要将 BLE USB 加密狗插入运行 Maxim Integrated MAXM86146 EV 系统软件应用程序的个人计算机。该 Windows 应用程序提供了一个图形用户界面 (GUI),让开发人员能够轻松修改 MAXM86146 设置,并能立即观察以数据曲线图形式呈现的结果。除了提供对 MAXM86146 寄存器的访问,该 GUI 还提供了直观菜单,以供设置不同的操作模式和配置。例如,开发人员可以使用 GUI 模式选项卡设置不同的 LED 序列(图 4,上图),使用 GUI 配置选项卡将这些 LED 序列应用于心率和 SpO2 测量(图 4,下图)。
图 4:Maxim Integrated 的 MAXM86146 EV 系统软件 GUI 允许开发人员通过定义不同的操作模式来评估 MAXM86146 的性能,例如定义 LED 序列(上图),然后将这些序列应用于心率和 SpO2 测量(下图)。(图片来源:Maxim Integrated)。
对于自定义软件开发,Maxim Integrated 提供了 MAXM86146 适用的可穿戴设备 HRM 和 SpO2 算法软件包。由于 MAXM86146 使用其集成微固件提供心率和 SpO2 测量,因此从设备提取数据的过程非常简单。Maxim Integrated 软件包演示了初始化设备,最后从 MAXM86146 FIFO 读取数据并解析出各个数据项的过程(清单 1)。
副本
typedef struct{
uint32_t green_led_cnt;
uint32_t ir_led_cnt;
uint32_t red_led_cnt;
uint32_t hr;
uint32_t hr_conf;
uint32_t spo2;
uint32_t spo2_conf;
uint32_t scd_state;
} mes_repor_t;
typedef struct {
uint32_t led1;
uint32_t led2;
uint32_t led3;
uint32_t led4;
uint32_t led5;
uint32_t led6;
} max8614x_mode1_data;
typedef struct {
int16_t x;
int16_t y;
int16_t z;
} accel_mode1_data;
typedef struct __attribute__((packed)){
uint8_t current_operating_mode; // mode 1 & 2
// WHRM data
uint16_t hr; // mode 1 & 2
uint8_t hr_conf; // mode 1 & 2
uint16_t rr; // mode 1 & 2
uint8_t rr_conf; // mode 1 & 2
uint8_t activity_class; // mode 1 & 2
// WSPO2 data
uint16_t r; // mode 1 & 2
uint8_t spo2_conf; // mode 1 & 2
uint16_t spo2; // mode 1 & 2
uint8_t percentComplete; // mode 1 & 2
uint8_t lowSignalQualityFlag; // mode 1 & 2
uint8_t motionFlag; // mode 1 & 2
uint8_t lowPiFlag; // mode 1 & 2
uint8_t unreliableRFlag; // mode 1 & 2
uint8_t spo2State; // mode 1 & 2
uint8_t scd_contact_state;
} whrm_wspo2_suite_mode1_data;
void execute_data_poll( mes_repor_t* mesOutput ) {
[deleted lines of code]
status = read_fifo_data(num_samples, WHRMWSPO2_FRAME_SIZE, &databuf[0], sizeof(databuf));
if(status == SS_SUCCESS && num_samples > 0 && num_samples < MAX_WHRMWSPO2_SAMPLE_COUNT){
max8614x_mode1_data ppgDataSample;
accel_mode1_data accelDataSamp;
whrm_wspo2_suite_mode1_data algoDataSamp;
int sampleIdx = 0;
int ptr =0;
while( sampleIdx < num_samples ) {
ppgDataSample.led1 = (databuf[ptr+1] << 16) + (databuf[ptr+2] << 8) + (databuf[ptr+3] << 0);
ppgDataSample.led2 = (databuf[ptr+4] << 16) + (databuf[ptr+5] << 8) + (databuf[ptr+6] << 0);
ppgDataSample.led3 = (databuf[ptr+7] << 16) + (databuf[ptr+8] << 8) + (databuf[ptr+9] << 0);
ppgDataSample.led4 = (databuf[ptr+10] << 16)+ (databuf[ptr+11] << 8)+ (databuf[ptr+12] << 0);
ppgDataSample.led5 = (databuf[ptr+13] << 16)+ (databuf[ptr+14] << 8)+ (databuf[ptr+15] << 0);
ppgDataSample.led6 = (databuf[ptr+16] << 16)+ (databuf[ptr+17] << 8)+ (databuf[ptr+18] << 0);
accelDataSamp.x = (databuf[ptr+19] << 8) + (databuf[ptr+20] << 0);
accelDataSamp.y = (databuf[ptr+21] << 8) + (databuf[ptr+22] << 0);
accelDataSamp.z = (databuf[ptr+23] << 8) + (databuf[ptr+24] << 0);
algoDataSamp.current_operating_mode= (databuf[ptr+25]);
algoDataSamp.hr = (databuf[ptr+26] << 8) + (databuf[ptr+27] << 0);
algoDataSamp.hr_conf = (databuf[ptr+28]);
algoDataSamp.rr = (databuf[ptr+29] << 8) + (databuf[ptr+30] << 0);
algoDataSamp.rr_conf = (databuf[ptr+31]);
algoDataSamp.activity_class = (databuf[ptr+32]);
algoDataSamp.r = (databuf[ptr+33] << 8) + (databuf[ptr+34] << 0);
algoDataSamp.spo2_conf = (databuf[ptr+35]);
algoDataSamp.spo2 = (databuf[ptr+36] << 8) + (databuf[ptr+37] << 0);
algoDataSamp.percentComplete = (databuf[ptr+38]);
algoDataSamp.lowSignalQualityFlag = (databuf[ptr+39]);
algoDataSamp.motionFlag = (databuf[ptr+40]);
algoDataSamp.lowPiFlag = (databuf[ptr+41]);
algoDataSamp.unreliableRFlag = (databuf[ptr+42]);
algoDataSamp.spo2State = (databuf[ptr+43]);
algoDataSamp.scd_contact_state = (databuf[ptr+44]);
mesOutput->green_led_cnt = ppgDataSample.led1;
mesOutput->ir_led_cnt = ppgDataSample.led2;
mesOutput->red_led_cnt = ppgDataSample.led3;
mesOutput->hr = algoDataSamp.hr / 10;
mesOutput->hr_conf = algoDataSamp.hr_conf;
mesOutput->spo2 = algoDataSamp.spo2 / 10;
mesOutput->spo2_conf = algoDataSamp.spo2_conf;
mesOutput->scd_state = algoDataSamp.scd_contact_state;
/* printf( greenCnt= %d , irCnt= %d , redCnt = %d ,
hr= %d , hr_conf= %d , spo2= %d , spo2_conf= %d , skin_contact = %d
, mesOutput->green_led_cnt , mesOutput->ir_led_cnt , mesOutput->red_led_cnt
, mesOutput->hr , mesOutput->hr_conf , mesOutput->spo2 , mesOutput->spo2_conf , mesOutput->scd_state);
*/
[deleted lines of code]
清单 1:Maxim Integrated 的软件包一段代码展示了从生物传感模块提取测量值和其他数据的基本技术。(代码来源:Maxim Integrated)
清单 1 演示了如何使用 C 语言例程 execute_data_poll() 从 MAXM86146 返回一些心率和 SpO2 读数。在这里,该代码将设备的 FIFO 读入本地缓存 databuf,然后将 databuf 的内容映射到几个不同 C 语言软件结构的实例。除了将配置数据和其他元数据存储到这些结构实例中,该例程最后还在 mesOutput(mes_repor_t 结构的一个实例)中提供心率和 SpO2 测量值。开发人员只需取消对最后 printf 语句的注释,即可在控制台上显示结果。
为了实现健康与保健可穿戴设计,MAXM86146 的软硬件大幅简化了开发。但是,对于旨在获得美国食品药品监督管理局 (FDA) 批准的设备,开发人员必须进行适当的测试,以验证最终产品的 FDA 级性能。虽然 Maxim Integrated 的 MAXM86146 及其嵌入式算法提供了 FDA 级测量性能,但开发人员需要确保整个系统满足 FDA 的性能要求,而不仅仅是传感器满足该要求。
结语
人们对能够提供精确心率和 SpO2 测量的可穿戴设备的兴趣不断增加,最近 SpO2 数据在监测新冠病毒疾病症状中显现的作用进一步推波助澜。虽然专用生物传感器可以提供这些测量,但现有可用于可穿戴设备的解决方案很少能够满足设备更小、电池续航时间更长、功能更多样和结构更紧凑的要求。如上所述,来自 Maxim Integrated 的微型生物传感模块在快速原型开发套件的支持下,提供了一种高效的替代方案,以最小的功耗实现 FDA 级的测量结果。