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 生物传感模块只需要相对较少的额外元器件,就可以完成能够提供精确心率和 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 或快速开发其应用原型的开发人员来说,他们可以跳过硬件设计,通过 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 \r\n"
, 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 的性能要求,而不仅仅是传感器满足该要求。