Maxim Integrated 的 MAXM86146 生物傳感模塊采用 4.5 x 4.1 x 0.88 毫米 (mm) 38 引腳封裝,是一款直接替代式解決方案,旨在幫助加快開發(fā)電池供電型緊湊型健康與保健可穿戴設備。為了同時滿足對延長電池續(xù)航時間和生物傳感功能的需求,該模塊在將功耗降至最低的同時,保持著對心率和 SpO2 的快速準確測量。
除了兩個集成光電二極管,該模塊還包括 Maxim Integrated 的 MAX86141 雙通道光學模擬前端 (AFE) 和基于?Arm?Cortex-M4 的微控制器,后者是 Maxim Integrated 的 MAX32660 Darwin 微控制器的生物傳感優(yōu)化版(圖 1)。
圖 1:Maxim Integrated 的 MAX86146 生物傳感模塊在緊湊型封裝中集成了光學 AFE、微控制器和光電二極管。(圖片來源:Maxim Integrated)
集成式 MAX86141 每秒采集 25 個樣本 (sps) 時,功耗僅為 10 微安 (μA),它提供了一個綜合光學 AFE 子系統(tǒng),旨在控制用于測量心率和 SpO2 的多個發(fā)光二極管。光學心率監(jiān)測器通常使用光電容積描記法 (PPG),可監(jiān)測與每次心臟搏動相關的外周血容量變化。對于這種測量,這些設備通常使用波長為 540 納米 (nm) 的綠光,這種光會被血液吸收,并且由于綠光穿透組織的深度比許多其他波長要淺,所以產(chǎn)生的偽影比較少。光學脈搏血氧計使用紅色?LED(通常為 660 nm)和紅外?(IR) LED(通常為 940 nm)來測量血紅蛋白和脫氧血紅蛋白之間的吸收差異,這是光學 SpO2 測量法的基礎技術(請參閱利用現(xiàn)成元器件設計低成本脈搏血氧儀)。
為了執(zhí)行這些光學測量,開發(fā)人員必須確保光電二極管信號采集與來自相應 LED 的光輸出脈沖精確同步。MAXM86146 模塊集成的 MAX86141 AFE 提供了獨立的信號鏈,分別用于 LED 控制和光電二極管信號采集。在輸出端,AFE 包括三個大電流、低噪聲 LED 驅動器,可將脈沖傳輸?shù)接糜谛穆蕼y量的綠色 LED 以及用于 SpO2 測量的紅色和紅外 LED。在輸入端,AFE 提供兩個光電二極管信號采集通道,每個通道都有一個專用的 19 位模數(shù)轉換器?(ADC)。這兩個讀出通道可以單獨操作,也可以組合使用,以提供更大的輻射面積。
為控制 AFE LED 和光電二極管信號鏈,板載微控制器上運行的固件可調整 AFE 設置,以最大程度提高信噪比 (SNR) 并降低功耗。隨著環(huán)境光的變化,集成式 MAX86141 中內(nèi)置的環(huán)境光校正 (ALC)?電路會對光照條件的逐漸變化作出響應。但是,在某些情況下,例如當用戶在陰影區(qū)域和明亮的陽光間快速穿過時,環(huán)境光可能會快速變化,從而導致 ALC 故障。考慮到這種常見的情況,MAX86141 加入了柵欄檢測和替換功能。在這里,該器件會識別環(huán)境測量值與先前樣本的較大偏差,并將個別外圍環(huán)境光數(shù)據(jù)樣本替換為與環(huán)境水平相對緩慢變化相一致的外推值。
由于該模塊的微控制器使用其固件來管理 AFE 操作,因此執(zhí)行精確的心率和 SpO2 測量所需的詳細操作對于開發(fā)人員來說是透明的。該模塊使用固件設置自動執(zhí)行這些測量,將原始數(shù)據(jù)和計算結果存儲在先進先出 (FIFO) 緩沖區(qū)中,供系統(tǒng)主處理器通過模塊的?I2C?串行接口訪問。
憑借廣泛的集成功能,MAX86146 生物傳感模塊只需要相對較少的額外元器件,就可以完成能夠提供精確心率和 SpO2 測量的設計。若要同步進行心率和 SpO2 測量,MAX86146 可以與外部低噪聲模擬多路復用器集成,例如連接到分立式綠色、紅色和紅外 LED 的 Maxim Integrated MAX14689?開關(圖 2)。
圖 2:要同步執(zhí)行心率和 SpO2 測量,除了合適的 LED、模擬多路復用器(MAX14689,左側)和加速計,Maxim Integrated 的 MAX86146 生物傳感模塊幾乎不需要其他元器件,就可以在測量的同時檢測運動。(圖片來源:Maxim Integrated)
此外,MAXM86146 還設計成使用來自三軸加速計的運動數(shù)據(jù),以在心率測量期間校正用戶的運動,并在 SpO2 測量期間檢測運動,后者需要用戶在測量的短時間內(nèi)保持靜止狀態(tài)。在這里,開發(fā)人員可以將固件支持的加速計直接連接到 MAXM86146 的 SPI?端口,或者將通用加速計連接到主機處理器。
主機連接選項為器件選擇提供了更大的靈活性,只需要一個通用三軸加速計,例如 Memsic 的 MC3630,采樣速度可達 25 sps。盡管如此,開發(fā)人員仍需要確保加速計數(shù)據(jù)與心率數(shù)據(jù)采樣同步。為此,板載微控制器根據(jù)需要對加速計樣本進行內(nèi)部抽取或插補,以補償心率數(shù)據(jù)和加速計數(shù)據(jù)之間的漂移。
雖然 MAXM86146 簡化了系統(tǒng)硬件設計,但對于希望評估 MAXM86146 或快速開發(fā)其應用原型的開發(fā)人員來說,他們可以跳過硬件設計,通過 MAXM86146EVSYS 評估系統(tǒng)立即開始使用該器件。MAXM86146EVSYS 通過?USB?或 3.7 V 鋰聚合物 (LiPo) 電池供電,包括一個基于 MAXM86146 的 MAXM86146_OSB?光學傳感器板 (OSB),并通過軟線連接到支持低功耗藍牙?(BLE) 的 MAXSensorBLE 主數(shù)據(jù)采集板(圖 3)。
圖 3:Maxim Integrated 的 MAXM86146EVSYS 評估系統(tǒng)包括支持 BLE 的主處理器板和基于 MAXM86146 的傳感器板(用軟線連接)。(圖片來源:Maxim Integrated)
MAXSensorBLE 板集成了 Maxim Integrated 的 MAX32620 主機微控制器,以及 Nordic Semiconductor 的 NRF52832 藍牙微控制器。實際上,MAXSensorBLE 板可作為支持 BLE 的可穿戴式設計的完整參考設計。除了支持有源和無源元器件外,MAXSensorBLE 板設計還配備 Maxim Integrated 的 MAX20303?電源管理集成電路?(PMIC),該電路專為延長可穿戴設備的電池續(xù)航時間而設計。
MAXM86146_OSB 光學傳感器板將 MAXM86146 生物傳感模塊與 MAX14689 模擬開關和同步執(zhí)行心率和 SpO2 測量所需的整套 LED 組合在一起。此外,該板集成了一個支持固件的三軸加速計,直接連接到 MAXM86146 模塊。
要使用 MAXM86146EVSYS 評估系統(tǒng)評估 MAXM86146 模塊,開發(fā)人員使用 USB-C 或 LiPo 電池為系統(tǒng)供電,并根據(jù)需要將 BLE USB 加密狗插入運行 Maxim Integrated MAXM86146 EV 系統(tǒng)軟件應用程序的個人計算機。該 Windows 應用程序提供了一個圖形用戶界面 (GUI),讓開發(fā)人員能夠輕松修改 MAXM86146 設置,并能立即觀察以數(shù)據(jù)曲線圖形式呈現(xiàn)的結果。除了提供對 MAXM86146?寄存器的訪問,該 GUI 還提供了直觀菜單,以供設置不同的操作模式和配置。例如,開發(fā)人員可以使用 GUI 模式選項卡設置不同的 LED 序列(圖 4,上圖),使用 GUI 配置選項卡將這些 LED 序列應用于心率和 SpO2 測量(圖 4,下圖)。
圖 4:Maxim Integrated 的 MAXM86146 EV 系統(tǒng)軟件 GUI 允許開發(fā)人員通過定義不同的操作模式來評估 MAXM86146 的性能,例如定義 LED 序列(上圖),然后將這些序列應用于心率和 SpO2 測量(下圖)。(圖片來源:Maxim Integrated)。
對于自定義軟件開發(fā),Maxim Integrated 提供了 MAXM86146 適用的可穿戴設備 HRM 和 SpO2 算法軟件包。由于 MAXM86146 使用其集成微控制器固件提供心率和 SpO2 測量,因此從設備提取數(shù)據(jù)的過程非常簡單。Maxim Integrated 軟件包演示了初始化設備,最后從 MAXM86146 FIFO 讀取數(shù)據(jù)并解析出各個數(shù)據(jù)項的過程(清單 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 的軟件包一段代碼展示了從生物傳感模塊提取測量值和其他數(shù)據(jù)的基本技術。(代碼來源:Maxim Integrated)
清單 1 演示了如何使用 C 語言例程 execute_data_poll() 從 MAXM86146 返回一些心率和 SpO2 讀數(shù)。在這里,該代碼將設備的 FIFO 讀入本地緩存 databuf,然后將 databuf 的內(nèi)容映射到幾個不同 C 語言軟件結構的實例。除了將配置數(shù)據(jù)和其他元數(shù)據(jù)存儲到這些結構實例中,該例程最后還在 mesOutput(mes_repor_t 結構的一個實例)中提供心率和 SpO2 測量值。開發(fā)人員只需取消對最后 printf 語句的注釋,即可在控制臺上顯示結果。
為了實現(xiàn)健康與保健可穿戴設計,MAXM86146 的軟硬件大幅簡化了開發(fā)。但是,對于旨在獲得美國食品藥品監(jiān)督管理局 (FDA) 批準的設備,開發(fā)人員必須進行適當?shù)?u>測試,以驗證最終產(chǎn)品的 FDA 級性能。雖然 Maxim Integrated 的 MAXM86146 及其嵌入式算法提供了 FDA 級測量性能,但開發(fā)人員需要確保整個系統(tǒng)滿足 FDA 的性能要求,而不僅僅是傳感器滿足該要求。