国产又大又硬又粗又湿_好深日本h好硬好爽好大_电视剧两个女人的战争_漫画堆app下载

131 1300 0010
其他
當前位置: 首頁>> 元件技術>>其他>>
  • 導航欄目
  • 二極管
  • 整流橋
  • MOS管
  • 其他
  • MAX86146 如何簡化可穿戴設備的硬件設計
    MAX86146 如何簡化可穿戴設備的硬件設計
  • MAX86146 如何簡化可穿戴設備的硬件設計
  • 來源:物聯網評論  發布日期: 2021-12-09  瀏覽次數: 1,740

    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 \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 的性能要求,而不僅僅是傳感器滿足該要求。


  • ·上一篇:
    ·下一篇:
  • 其他關聯資訊
    深圳市日月辰科技有限公司
    地址:深圳市寶安區松崗鎮潭頭第二工業城A區27棟3樓
    電話:0755-2955 6626
    傳真:0755-2978 1585
    手機:131 1300 0010
    郵箱:hu@szryc.com

    深圳市日月辰科技有限公司 版權所有:Copyright?2010-2023 m.tacosandshit.com 電話:13113000010 粵ICP備2021111333號