新聞中心

EEPW首頁 > 物聯(lián)網(wǎng)與傳感器 > 設(shè)計應(yīng)用 > 基礎(chǔ)知識之心率傳感器

基礎(chǔ)知識之心率傳感器

作者: 時間:2024-03-12 來源:電子森林 收藏

是一種用于測量人體心跳率的傳感器。它可以通過監(jiān)測心臟的電活動或血流來提供實時的心率數(shù)據(jù),并將心率數(shù)據(jù)轉(zhuǎn)換為電信號或數(shù)字信號。心率是指心臟每分鐘跳動的次數(shù),通常以“bpm”(每分鐘跳動次數(shù))為單位。

本文引用地址:http://m.butianyuan.cn/article/202403/456220.htm

圖1:max30102光電式心率血氧傳感器、XD-58C Pulse Sensor脈沖傳感器

心率傳感器的工作原理可以分為兩種常見的方法:光電傳感和電生理傳感。

光學(xué)心率傳感器

光電傳感:這是最常見的心率傳感器工作原理。它使用了光敏元件(例如光電二極管或光敏電阻)來測量皮膚上的血流變化,從而推導(dǎo)出心率數(shù)據(jù)。有些設(shè)備也可以估計血液中的氧氣水平。

光學(xué)心率傳感器是是智能穿戴設(shè)備中最為普及的用于心率檢測的傳感器之一。它采用電光溶劑脈搏波描記法(PPG)來測量心率及其他生物計量指標(biāo)。

PPG測量原理:通過電容燈光射向皮膚,透過皮膚組織反射回的光被光敏傳感器接受并轉(zhuǎn)換成電信號,再經(jīng)過電信號轉(zhuǎn)換成數(shù)字信號,再根據(jù)血液的吸光率算出心率。簡化測量過程就是:發(fā)射光——轉(zhuǎn)換成電信號——轉(zhuǎn)換成數(shù)字信號。

圖2:光學(xué)心率傳感器的基本結(jié)構(gòu)與運行

光學(xué)心率傳感器使用四個主要技術(shù)元件來測量心率:

  • 光發(fā)射器 - 通常至少由兩個光發(fā)射二極管(LED)構(gòu)成,它們會將光波照進(jìn)皮膚內(nèi)部。
  • 光電二極管和模擬前端(AFE) - 這些元件捕獲穿戴者折射的光,并將這些模擬信號轉(zhuǎn)換成數(shù)字信號用于計算可實際應(yīng)用的心率數(shù)據(jù)。
  • 加速計 - 加速計可測量運動,與光信號結(jié)合運用,作為PPG算法的輸入。
  • 算法 - 算法能夠處理來自AFE和加速計的信號,然后將處理后的信號疊加到PPG波形上,由此可生成持續(xù)的、運動容錯心率數(shù)據(jù)和其他生物計量數(shù)據(jù)。

光學(xué)心率傳感器可生成測量心率的PPG波形并將該心率數(shù)據(jù)作為基礎(chǔ)生物計量值,但是利用PPG波形可以測量的對象遠(yuǎn)不止于此。圖3是經(jīng)過簡化的PPG信號,該信號代表了多個生物計量的測量結(jié)果。

圖 3:典型的PPG波形

下面我們進(jìn)一步詳細(xì)解讀某些光學(xué)心率傳感器可以測得的結(jié)果:

  • 呼吸率 - 休息時的呼吸率越低,通常這表明身體狀況越好。
  • 最大攝氧量(VO2max)– VO2測量人體可以攝入的最大氧氣量,是人們廣泛使用的有氧耐力指標(biāo)。
  • 血氧水平(SpO2) - 是指血液中的氧氣濃度。
  • R-R間期(心率變異率)- R-R間期是血脈沖的間隔時間;一般而言,心跳間隔時間越長越好。R-R間期分析,可用作壓力水平和不同心臟問題的指標(biāo)。
  • 血壓 - 通過PPG傳感器信號,無需使用血壓計即可測量血壓。
  • 血液灌注 - 灌注是指人體推動血液流經(jīng)循環(huán)系統(tǒng)的能力,特別是在瀕于死亡時流經(jīng)全身毛細(xì)血管床的能力。因為PPG傳感器可跟蹤血液流動,所以可以測量血流相對灌注率及血液灌注水平的變化。
  • 心效率 - 這是心腦血管健康和身體狀況的另一個指標(biāo),一般來說,它測量的是心臟每搏的做功效率。
光學(xué)心率傳感器選擇綠光作為光源的原因

圖 4:光譜

選擇綠光作為測量光源是考慮到以下幾個特點:

  1. 皮膚的黑色素會吸收大量波長較短的波
  2. 皮膚上的水份也會吸收大量的UV(紫外)和IR(紅外)部分的光
  3. 進(jìn)入皮膚組織的綠光(500nm)– 黃光(600nm)大部分會被紅細(xì)胞吸收
  4. 紅光和接近IR的光相比其他波長的光更容易穿過皮膚組織
  5. 血液要比其他組織吸收更多的光
  6. 相比紅光,綠(綠-黃)光能被氧合血紅蛋白和脫氧血紅蛋白吸收
  7. 雖然現(xiàn)在大部分智能穿戴設(shè)備采用綠光作為光源,但是字考慮到皮膚情況的不同(膚色、汗水),高端產(chǎn)品會根據(jù)情況自動使用綠光、紅光和紅外光等多種光源進(jìn)行心率測量。

圖 5: 光電式心率傳感電路

電極式心率傳感器

電生理傳感:這種傳感器利用人體的生物電活動來測量心率。即心臟在每次心跳時都會產(chǎn)生一個小電流,具有電檢測功能的心率監(jiān)測器通過檢測和跟蹤該電流,實現(xiàn)心率的測量。 常用的電生理傳感器是心電圖(ECG)傳感器,通過測量心臟產(chǎn)生的電信號來確定心率。

工作過程如下:

  1. 心電圖(ECG)測量:電生理心率傳感器通過皮膚表面的電極與人體接觸,檢測和記錄心臟的電信號。這些電信號反映了心臟在每個心搏周期中的電活動,可以用于分析心臟的功能狀態(tài)和心率。
  2. 電極配置:電生理心率傳感器通常采用多個電極,例如,常見的配置是將一個電極放置在胸前、另一個電極放置在手腕或手指上。這樣的配置可以捕捉到心臟電活動的變化并生成心電圖。
  3. 感應(yīng)電位差:當(dāng)心臟肌肉收縮和放松時,產(chǎn)生的電勢差會在身體表面生成微弱的電流。電生理心率傳感器的電極通過接觸皮膚,能夠感知和測量這些微弱的電勢差,形成心電圖信號。
  4. 信號放大和處理:電生理心率傳感器會將感測到的微弱電信號放大,以便進(jìn)行準(zhǔn)確的記錄和測量。信號處理器會對心電圖信號進(jìn)行濾波、放大和去除干擾等操作,以獲取清晰的心電圖波形數(shù)據(jù)。
  5. 心率計算:通過分析心電圖信號中的R波,電生理心率傳感器能夠確定心臟每分鐘跳動的次數(shù),從而計算出心率值。
電極式心率傳感器與傳統(tǒng)醫(yī)院獲取心電圖儀器的區(qū)別
  • 測量原理:電極式心率傳感器使用表面電極與皮膚接觸,通過檢測心臟電活動來獲取心率信息。它主要測量心電圖中的R波峰值,并根據(jù)R-R間期計算心率。而傳統(tǒng)醫(yī)院使用的心電圖儀器則是通過多個電極貼附在身體不同的位置,記錄心臟電信號在不同導(dǎo)聯(lián)下的變化,以獲取更為詳細(xì)和全面的心電圖。
  • 使用場景:電極式心率傳感器通常用于便攜式設(shè)備和可穿戴設(shè)備中,如智能手環(huán)、智能手表等。它主要用于日常健康監(jiān)測和運動追蹤,提供用戶的即時心率信息。傳統(tǒng)醫(yī)院使用的心電圖儀器通常用于醫(yī)療機(jī)構(gòu),由專業(yè)醫(yī)務(wù)人員操作,用于臨床診斷和監(jiān)測心臟疾病,可以提供更全面的心電圖分析。
  • 數(shù)據(jù)輸出:電極式心率傳感器通常以數(shù)字形式輸出心率數(shù)據(jù),可以通過無線連接或數(shù)據(jù)線與手機(jī)、電腦等設(shè)備進(jìn)行數(shù)據(jù)傳輸和分析。傳統(tǒng)醫(yī)院使用的心電圖儀器可以輸出心電圖波形,通常以打印紙或數(shù)字文件的形式提供。
  • 精確度和準(zhǔn)確性:傳統(tǒng)醫(yī)院使用的心電圖儀器通常具有更高的精確度和準(zhǔn)確性,能夠提供更細(xì)致的心臟電信號分析。而電極式心率傳感器由于采用簡化的測量原理和設(shè)計,相對較低的成本和尺寸限制,可能在某些情況下存在一定的誤差。

無論是光電傳感還是電生理傳感,心率傳感器通常會將采集到的數(shù)據(jù)發(fā)送給處理器或設(shè)備進(jìn)行分析和顯示。這樣,用戶就可以實時了解自己的心率情況。

需要注意的是,不同型號的心率傳感器可能采用不同的工作原理和技術(shù)細(xì)節(jié),但基本原理是類似的:通過測量血流變化或心臟電信號來推導(dǎo)心率數(shù)據(jù)。

  • 胸帶裝置。這些設(shè)備使用電檢測來跟蹤您的心率。它們通過纏繞在胸部的帶子檢測電活動。為了使大多數(shù)這些設(shè)備按設(shè)計工作,表帶必須是濕的,或者您需要在傳感器接觸皮膚的地方使用導(dǎo)電凝膠。水或?qū)щ娔z可改善導(dǎo)電,因此設(shè)備更容易檢測心臟的電流。
  • 腕部或前臂佩戴的可穿戴設(shè)備:前臂和手腕有兩條主要動脈。橈動脈向拇指延伸,尺動脈向小指和無名指延伸。這兩條動脈為手腕和前臂表面的皮膚提供充足的血液流動。這些可穿戴設(shè)備具有發(fā)光二極管(LED)和傳感器,它們靠在該區(qū)域的皮膚上。該傳感器使用LED光來檢測皮膚表面下血管的微小擴(kuò)張。
  • 智能戒指:這些是您像珠寶一樣戴在一根手指上的設(shè)備。他們還使用光學(xué)檢測來跟蹤您的心率和其他生命體征。這些設(shè)備仍然非常新,關(guān)于其準(zhǔn)確性的數(shù)據(jù)有限。
  • 脈搏血氧儀。這些設(shè)備,其中許多夾在手指上,也使用光學(xué)檢測方法。這些跟蹤脈搏率和血氧水平。它們在醫(yī)院環(huán)境中很常見,但您也可以獲得這些設(shè)備的便攜式電池供電版本供個人使用。
  • 智能手機(jī):跨不同平臺的各種智能手機(jī)應(yīng)用程序提供了測量脈搏率的能力。其中一些使用光學(xué)檢測,通過將手指放在相機(jī)鏡頭上來找到您的脈搏率,相機(jī)的閃光燈用于照亮皮膚下的血管。其他人使用相機(jī)本身,對準(zhǔn)你的臉,根據(jù)你皮膚的可見變化來檢測你的脈搏率,但你的眼睛無法檢測到。
  • Maxim Integrated:Maxim Integrated是一家知名的集成電路設(shè)計和生產(chǎn)公司,提供多種心率傳感器芯片和模塊。其中,MAX30102是一款常見的心率傳感器模塊,集成了紅外LED、紅光LED和光電傳感器,適用于便攜設(shè)備和健康監(jiān)測設(shè)備等應(yīng)用。
  • Texas Instruments(TI):TI是一家全球領(lǐng)先的半導(dǎo)體公司,提供多款生物傳感器芯片和模塊。AFE4404是TI的一款心率監(jiān)測芯片,集成了紅外LED、綠光LED、光電傳感器和ADC等功能,可實現(xiàn)高精度的心率和血氧濃度測量。
  • ROHM Semiconductor:ROHM Semiconductor是一家領(lǐng)先的半導(dǎo)體制造商,其心率傳感器芯片和模塊在市場上得到廣泛應(yīng)用。BH1790GLC是ROHM的一款紅外心率傳感器芯片,具備運動偽影抑制和高精度測量特性。
  • Analog Devices(ADI):Analog Devices(ADI)是一家知名的模擬與數(shù)字混合信號處理技術(shù)供應(yīng)商,提供多種生物傳感器芯片和模塊。AD8232是ADI的一款心率傳感器芯片,專為心電圖(ECG)采集設(shè)計,具備高性能和低功耗特點。
  • PixArt Imaging:PixArt Imaging是一家專注于光學(xué)傳感器和圖像處理技術(shù)的公司,其產(chǎn)品被廣泛應(yīng)用于健康監(jiān)測和運動追蹤等領(lǐng)域。PAH8011是PixArt的一款生物傳感器模塊,集成了紅外和綠光LED、光電傳感器以及信號處理電路,適用于心率和血氧濃度等生物參數(shù)測量。

深入:使用脈沖傳感器和Arduino檢測,測量和繪制心率 (lastminuteengineers.com)

MAX30102脈搏血氧儀和心率傳感器與Arduino接口 (lastminuteengineers.com)

AD8232 ECG模塊引腳排列,與Arduino接口,應(yīng)用 (microcontrollerslab.com)

下面是個人案例,使用Mircopython編寫程序驅(qū)動RP2040讀取Max30102的數(shù)據(jù)。

電路連接

程序代碼

驅(qū)動文件包含三個.py文件。

  • init.py
  • circular_buffer.py
  • 檢測心率.py

前面兩個文件可在后面鏈接中下載:https://github.com/n-elia/MAX30102-MicroPython-driver/tree/main/max30102

檢測心率.py程序如下

from machine import SoftI2C, Pin, Timer
from utime import ticks_diff, ticks_us
from max30102 import MAX30102, MAX30105_PULSE_AMP_MEDIUM

BEATS = 0  # 存儲心率
FINGER_FLAG = False  # 默認(rèn)表示未檢測到手指


def display_info(t):
   # 如果沒有檢測到手指,那么就不顯示
   if FINGER_FLAG is False:
       return

   print('心率: ', BEATS)


def main():
   global BEATS, FINGER_FLAG  # 如果需要對全局變量修改,則需要global聲明
   
   # 創(chuàng)建I2C對象(檢測MAX30102)
   i2c = SoftI2C(sda=Pin(16), scl=Pin(17), freq=400000)  # Fast: 400kHz, slow: 100kHz

   # 創(chuàng)建傳感器對象
   sensor = MAX30102(i2c=i2c)

   # 檢測是否有傳感器
   if sensor.i2c_address not in i2c.scan():
       print("沒有找到傳感器")
       return
   elif not (sensor.check_part_id()):
       # 檢查傳感器是否兼容
       print("檢測到的I2C設(shè)備不是MAX30102或者M(jìn)AX30105")
       return
   else:
       print("傳感器已識別到")

   print("使用默認(rèn)配置設(shè)置傳感器")
   sensor.setup_sensor()

   # 對傳感器進(jìn)行設(shè)定
   sensor.set_sample_rate(400)
   sensor.set_fifo_average(8)
   sensor.set_active_leds_amplitude(MAX30105_PULSE_AMP_MEDIUM)

   t_start = ticks_us()  # Starting time of the acquisition

   MAX_HISTORY = 32
   history = []
   beats_history = []
   beat = False

   while True:
       sensor.check()
       if sensor.available():
           # FIFO 先進(jìn)先出,從隊列中取數(shù)據(jù)。都是整形int
           red_reading = sensor.pop_red_from_storage()
           ir_reading = sensor.pop_ir_from_storage()
           
           if red_reading < 1000:
               print('No finger')
               FINGER_FLAG = False  # 表示沒有放手指
               continue
           else:
               FINGER_FLAG = True  # 表示手指已放

           # 計算心率
           history.append(red_reading)
           
           # 為了防止列表過大,這里取列表的后32個元素
           history = history[-MAX_HISTORY:]
           
           # 提取必要數(shù)據(jù)
           minima, maxima = min(history), max(history)
           threshold_on = (minima + maxima * 3) // 4   # 3/4
           threshold_off = (minima + maxima) // 2      # 1/2
           
           if not beat and red_reading > threshold_on:
               beat = True                    
               t_us = ticks_diff(ticks_us(), t_start)
               t_s = t_us/1000000
               f = 1/t_s
               bpm = f * 60
               if bpm < 500:
                   t_start = ticks_us()
                   beats_history.append(bpm)                    
                   beats_history = beats_history[-MAX_HISTORY:]   # 只保留最大30個元素數(shù)據(jù)
                   BEATS = round(sum(beats_history)/len(beats_history), 2)  # 四舍五入
           if beat and red_reading < threshold_off:
               beat = False


if __name__ == '__main__':

   tim = Timer(period=1000, mode=Timer.PERIODIC, callback=display_info)
   
   main()

運行效果



關(guān)鍵詞: 心率傳感器

評論


技術(shù)專區(qū)

關(guān)閉