耳朵是僅次于手指尖,毛細(xì)血管次豐富的地方,相對于手腕而言,光學(xué)式測量方案,從耳機(jī)會更容易到得到高質(zhì)量的PPG信號,更有利于更高精準(zhǔn)運動心率與血氧效果的測試。
本方案是基于原相的PAH8013ES +主控SMT32F411+ Gsensor LIS3DH, 實現(xiàn)在耳機(jī)環(huán)境下實現(xiàn)高精性實時運動心率與血氧的測試方案,提供從硬件、FW、結(jié)構(gòu)產(chǎn)品級應(yīng)用指導(dǎo)。原相PAH8013是針對耳機(jī)應(yīng)用方向的原相第二代光學(xué)PPG傳感器,相比第一代8003產(chǎn)品,除性能提供外,運行功耗和待機(jī)功耗進(jìn)一步降低,同時改用IR光源不可見光源測量PPG信號,改善第一代產(chǎn)品綠光方式會從耳朵背面看到綠光閃問題。PAH8013除測量運動心率外,還可以測量血氧飽和度。 血氧飽和度(SpO2)是血液中被氧結(jié)合的氧合血紅蛋白(HbO2)的容量占全部可結(jié)合的血紅蛋白(Hb)容量的百分比,即血液中血氧的濃度,它是呼吸循環(huán)的重要生理參數(shù)。PAH8013通過IR和紅光 兩種光源,通過檢測打入皮膚反射回的 IR和紅光的比例,通過算法算出相關(guān)的血氧值。
STM32F411 是Cortex?-M4內(nèi)核(具有浮點單元)的性能MCU,最高可工作在100 MHz主頻,芯片內(nèi)置高達(dá)256至512KB的Flash存儲器和高達(dá)128KB的SRAM,為算法及后續(xù)的應(yīng)用功能再擴(kuò)展提供充足的空間。另外STM32F411 具有封裝小,出色的低功耗性能,同時性價比高,更適用于對性能體積與價錢有需求的耳機(jī)產(chǎn)品。
硬件部分
PAH8013ES與STM32F411采用i2c方式的通信接口,并加上中斷狀態(tài)線INT和休眠控制線。其中8013的9腳與10腳接到SMT32F411的PB8和PA11的i2c接口連接腳,采用400HZ速率;8013的13腳中斷信號INT1與MCU PA10連接,8013的休眠控制線PD與MCU PA12連接,其中INT1用于中斷方式用于接到PPG數(shù)據(jù);PD腳用于在不使用PAH8013ES時,通過MCU接高PD腳讓PAH8013進(jìn)入休眠省電狀態(tài)。
Gsensor Lis3dh采用SPI方式與STM32F411通信接口, Lis3dh的SPI接到STM32F411的PA15、PB4、PB4、PB5 的芯片腳上,通信速率1M,外加中斷通信線INT1和INT2,使用STM32F411的PA8、PA9。
板上的供電系統(tǒng)由一個3.3V和一個1.8V的LDO組成,給MCU、Gsensor及PAH8013ES提供所需的電壓,各器件的IO通信電平使用3.3V。
原理圖
主板部分
光學(xué)小板模組部分
PCB layout
軟件接口部分
心率與血氧的算法放在STM32F411上運行,STM32F411每200ms從PAH8013讀取40筆PPG數(shù)據(jù)及從LIS3DH讀取約45筆左右 MENS,通過PPG數(shù)據(jù)與MENS數(shù)據(jù)運算出心率與血氧值,而MENS數(shù)據(jù)負(fù)責(zé)對運動作狀態(tài)下的數(shù)據(jù)進(jìn)行精度補(bǔ)嘗。
在主函數(shù)調(diào)用demo_ppg_dri_HRD_SPO2();啟動心率與血氧測試,約8~10秒算出第一個心率與血氧值,之后約每秒更新一次數(shù)值
心率與血氧的獲取接口如下:
pah8series_get_hr(&hr);------是獲取心率數(shù)據(jù)的接口,由于算法是算浮點數(shù),在數(shù)值顯示直接顯示整數(shù)部分
SpO2_GetSpO2(&mySpO2);---是獲取血氧數(shù)據(jù)的接口,輸出整數(shù),直接顯示整數(shù)百分比就可
PROTING簡介
pah8series_config.h文件的修改
1.#define ENABLE_MEMS_ZERO 關(guān)掉
如果系統(tǒng)的Gsensor還沒有調(diào)好,可以先把此宏打開,先測試靜態(tài)心率。此時會送入全0的Gsensor給算法,
注意:Gsensor調(diào)好后,不論靜態(tài)動態(tài),都需送入真實的Gsensor數(shù)據(jù)
2.設(shè)定Gensor量程,目前用的是-+8G量程,所以設(shè)定#define ALG_GSENSOR_MODE 4
3.根據(jù)所用的芯片型號,Cover設(shè)計方式、IO通信方式,打開以下宏定義
//-------Sensor IC Type---------//
#define __PAH8013ES
//-------Cover Type---------//
#define _DI_COVER
//-------IO Interface---------//
#define _I2C
main.c修改
1.設(shè)定中斷回調(diào)函數(shù) gpio_in_interrupt_handler(GPIO_IN gpio)
2.送入正確的系統(tǒng)的tick時間,get_tick_count()-----單位為ms
pah_hrd_function.c修改
1.啟動ppg數(shù)據(jù)采樣時,同時啟動Gsensor數(shù)據(jù)采樣,調(diào)用accelerometer_start();這樣可確保數(shù)據(jù)同步,
2.接收到的Gsensor數(shù)據(jù)送入指定的下面地方以便算法取得,accelerometer_get_fifo(&_state.pxialg_data.mems_data, &_state.pxialg_data.nf_mems);
3.進(jìn)入touch mode或離開心率模式,停止Gsensor數(shù)據(jù)采樣,調(diào)用accelerometer_stop();
關(guān)于同步說明,PPG第一筆數(shù)據(jù)要與Gsensor第一筆數(shù)據(jù)時間上對齊,這樣算法在插補(bǔ)后,每個ppg時間點才能與gsensor時間點一致,否則可以導(dǎo)致運動心率異常。目前是以ppg中斷去接收Gsensor
pah_comm.c
根據(jù)通信方式與STM平臺接口,補(bǔ)全讀、與及 連讀接口代碼
bool pah_comm_write(uint8_t addr, uint8_t data)
bool pah_comm_read(uint8_t addr, uint8_t *data)
bool pah_comm_burst_read(uint8_t addr, uint8_t *data, uint16_t num)
算法接口簡介
PXIALG_API uint32_t pah8series_version(void);---讀取算法版本
PXIALG_API uint32_t pah8series_query_open_size(void);----確認(rèn)申請在系統(tǒng)上所需開內(nèi)存大小
PXIALG_API uint8_t pah8series_open(void *pBuffer);-----給算法開啟pah8series_query_open_size確認(rèn)的內(nèi)存空間
PXIALG_API uint8_t pah8series_close(void);---算法關(guān)閉
PXIALG_API uint8_t pah8series_reset(void);---算法重啟
PXIALG_API uint8_t pah8series_set_param(pah8series_param_idx_t idx, float p1);---算法參考設(shè)定1
PXIALG_API uint8_t pah8series_get_param(pah8series_param_idx_t idx, float *p1);;---算法參考設(shè)定2
PXIALG_API uint8_t pah8series_get_hr(float *hr);---算法心率接口,0~255
PXIALG_API uint8_t pah8series_get_hr_trust_level(int *hr_trust_level);---信號可信度,0~4,數(shù)值越大,可信度就越高
PXIALG_API uint8_t pah8series_entrance(pah8series_data_t *pah8series_data);----PPG與Gsensor數(shù)據(jù)傳入接口
PXIALG_API uint8_t pah8series_get_signal_level(int ch, uint8_t *signal_level);---信號分?jǐn)?shù),0~100,,數(shù)值越大,信號就越好
PXIALG_API uint8_t pah8series_get_motion_flag(uint8_t *motion_flag);---檢查用戶運動狀態(tài),0靜止,1運動
PXIALG_API uint8_t pah8series_get_wear_index(uint32_t expo_time[3], uint8_t led_dac[3], uint8_t checkRaw, int *wear_index);----判定用戶佩戴松緊度,wear_index為0~3,0表示佩戴好,1~3數(shù)越大,佩戴越差
PXIALG_API int SpO2_GetSpO2(float *spo2);---算法血氧接口,0~100
PXIALG_API int SpO2_GetReadyFlag(uint8_t *ready_flag);---血氧算法標(biāo)志
調(diào)試log如下
結(jié)構(gòu)部分
如何保證在耳道有持續(xù)穩(wěn)定的測量,結(jié)構(gòu)設(shè)計起到關(guān)鍵的作用。優(yōu)秀的設(shè)計,能保證適用于各種人群的耳朵,并在運動中仍保證耳機(jī)與皮膚優(yōu)秀的接觸穩(wěn)定性
Cover設(shè)計結(jié)構(gòu)如下圖:
1.最上方灰色部分rubber軟膠套,增加在佩戴時的接觸舒適性
2.中間部分黑色為硬塑料模,此部分需要做要雙料射出工藝,以有效在機(jī)構(gòu)內(nèi)部隔離串光問題
2.下方灰色為8013光學(xué)模組PCB板,需與中間部分黑色硬塑件緊貼,如漏光會對性能有較大影響
光學(xué)鏡片開孔尺寸如下
另外由于在運動中,耳機(jī)有存在持續(xù)震動現(xiàn)場,而能否保證sensor Cover與皮膚能有效接觸到,對PPG信號有至關(guān)重要,而一個適合的耳塞套對保持耳機(jī)在運動中的穩(wěn)定性起到重要作用。
由于不同人的耳朵大小結(jié)構(gòu)不同,一般會建議給用戶至少配置如下3個尺寸(S、M、L),推存尺寸參考如下
? 場景應(yīng)用圖
? 產(chǎn)品實體圖
? 方案方塊圖
評論