使用生物感測模組來開發健康與健身穿戴式裝置
資料提供者:DigiKey 北美編輯群
2020-10-21
新冠病毒 (COVID-19) 肆虐造成健康意識高漲,促成人們對生物感測穿戴式裝置產生極大興趣,進而帶動對更高效解決方案的需求,以滿足使用者對功能更強、準確度更高、電池續航力更長的低成本小型裝置的需求。設計人員將不斷面臨一系列挑戰,以期在緊迫的上市時間和有限的預算下完成工作。這些生物感測裝置在更高功能整合度和更全面的設計解決方案等,都有十足進展,有利於設計人員開展工作。
本文將討論生物感測器和穿戴式裝置的趨勢,以及設計人員所面臨的諸多挑戰。接著介紹 Maxim Integrated 的心率和週邊血氧飽和度 (SpO2) 生物感測器模組,並說明開發人員如何利用此模組更有效地實作穿戴式裝置,使其既能提供準確的心率和其他測量值,又不會影響電池供電型行動產品緊縮的功率預算。
生物感測設計要求
雖然心率監測是各種消費性穿戴式裝置的核心要求,但人們對 SpO2 測量的興趣不斷高漲。SpO2 測量曾經主要用於為運動員打造最佳健身方案,如今已衍生出更廣泛的應用,特別是與新冠肺炎 (COVID-19) 相關的自我監測應用,用以發現呼吸功能衰退的跡象。對於開發人員來說,若要向健康意識高、習慣使用穿戴式電子裝置的大眾提供合適的解決方案,無論在成本、功率、外觀尺寸和重量方面都將是個嚴峻的挑戰。
目前的許多生物感測器都整合類比前端子系統,能讓開發人員不必為了滿足健康與健身測量的需求,而去建立訊號鏈和後置處理子系統。不過這些先進裝置中,極少具備適合穿戴式裝置的功能組合。因此,這些裝置並未解決相關的設計挑戰,無法滿足使用者對小型生物感測穿戴式裝置的期望,亦即要像其他類型的主要穿戴式裝置一樣不引人注目,如智慧型手錶、健康手環及真無線耳機。
開發人員需要將一種或多種生物感測功能,加入這些流行的穿戴式裝置類型時,可能會進一步帶來與設計整合相關的挑戰。如同其他所有類型的電池供電型個人行動電子產品,消費者無疑會要求更長的電池續航力,即使是最小型的產品亦然。他們在選擇這類產品時,電池續航力和價格與功能性的要求都同樣重要。
為了同時滿足這些需求,開發人員可以改用 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 電流,具有專為控制多個發光二極體 (LED) 而設計的完善光學 AFE 子系統,而這些 LED 可用來測量心率和 SpO2。光學式心率監測器定期使用光體積變化描記圖 (PPG),可監測與每次心臟搏動相關的周邊血容量變化。測量時,這些裝置通常使用波長為 540 nm 的綠光,這種光可被血液吸收,而且因為綠光深入組織的深度比其他許多波長更淺,因此所產生的偽影也比較少。光學式脈搏血氧儀使用紅色 LED (通常為 660 nm) 及紅外線 (IR) LED (通常為 940 nm) 來測量血紅素和去氧血紅素的吸收差值,此即光學 SpO2 測量法的基礎技術 (請參閱《使用現成元件設計低成本脈搏血氧儀》一文)。
執行這些光學測量時,開發人員必須確保光電二極體訊號採集與合適 LED 的光輸出脈衝達到精確同步。MAXM86146 模組的整合式 MAX86141 AFE 可提供不同的訊號鏈,以分別進行 LED 控制和光電二極體訊號採集。在輸出端,AFE 包含三個高電流低雜訊 LED 驅動器,將脈衝傳輸到綠光 LED 以測量心率,同時傳輸到紅光 LED 和紅外線 LED 以測量 SpO2。在輸入端,AFE 有兩個光電二極體訊號採集通道,每個通道均有專用的 19 位元類比數位轉換器 (ADC)。這兩個讀數通道可以單獨操作,也可以組合使用,以提供更大的輻射面積。
在控制 AFE LED 和光電二極體訊號鏈方面,板載微控制器上運行的韌體可調整 AFE 設定值,可將訊噪比 (SNR) 最大化並將功耗最小化。隨著環境光線變化,整合式 MAX86141 內建的環境光修正 (ALC) 電路,可對逐漸改變的照明狀況進行回應。然而,環境光線在某些情況下可能會快速變化,例如使用者在陰影和強烈日光間快速通過時;這樣會導致 ALC 失效。為了解決這種常見情況,MAX86141 包含柵欄效應偵測與替換功能。此時,裝置可從之前的樣本辨識出環境測量值中的較大偏移量,並且使用與相對較慢環境變化量一致的外推值,替換個別的外圍環境光資料樣本。
由於此模組的微控制器使用本身的韌體管理 AFE 運作,因此開發人員對執行準確的 HR 和 SpO2 測量所需的細部操作一目了然。模組使用韌體設定值來自動執行這些測量,將原始資料及計算結果儲存在先進先出 (FIFO) 的緩衝區內,供系統主機處理器透過模組的 I2C 序列介面存取。
MAX86146 如何簡化穿戴式裝置硬體設計
由於具備廣泛整合的功能,MAX86146 生物感測模組只需要相對較少的額外元件,即可實現能準確測量心率和 SpO2 測量的設計。如要同時測量 HR 和 SpO2,可將 MAX86146 與外部低雜訊類比多工器進行整合,例如 Maxim Integrated 的 MAX14689 開關 (連接至離散的綠光、紅光和紅外線 LED) (圖 2)。
圖 2:如要同時測量心率和 SpO2,Maxim Integrated 的 MAX86146 生物感測模組除了合適的 LED、類比多工器 (MAX14689,左側) 及加速計之外,幾乎不需要額外元件,即可在進行測量時偵測運動。(圖片來源: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 光學感測器板整合含有 MAX14689 類比開關的 MAXM86146 生物感測模組,以及同步執行心率和 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 適用的穿戴式心率量測和 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 的效能要求。
結論
人們對能夠提供準確心率和 SpO2 測量的穿戴式裝置仍不斷產生濃厚興趣,而最近 SpO2 資料在監測新冠肺炎 (COVID-19) 症狀中所扮演的角色更是帶動此現象。雖然專業的生物感測器可以提供這些測量值,但現有的解決方案很少能夠滿足以下對小型裝置的需求:能夠在小巧的多功能穿戴式裝置中延長電池續航力。如本文所示,Maxim Integrated 的小型生物感測模組在快速原型開發套件的支援下,能夠提供有效的替代方案,以最低的功耗提供 FDA 等級的測量值。

聲明:各作者及/或論壇參與者於本網站所發表之意見、理念和觀點,概不反映 DigiKey 的意見、理念和觀點,亦非 DigiKey 的正式原則。