《國(guó)產(chǎn)嵌入式技術(shù)及應(yīng)用實(shí)踐》課件 項(xiàng)目五可穿戴應(yīng)用終端設(shè)計(jì)與實(shí)現(xiàn)任務(wù)1 心率血氧采集功能設(shè)計(jì)與開(kāi)發(fā)_第1頁(yè)
《國(guó)產(chǎn)嵌入式技術(shù)及應(yīng)用實(shí)踐》課件 項(xiàng)目五可穿戴應(yīng)用終端設(shè)計(jì)與實(shí)現(xiàn)任務(wù)1 心率血氧采集功能設(shè)計(jì)與開(kāi)發(fā)_第2頁(yè)
《國(guó)產(chǎn)嵌入式技術(shù)及應(yīng)用實(shí)踐》課件 項(xiàng)目五可穿戴應(yīng)用終端設(shè)計(jì)與實(shí)現(xiàn)任務(wù)1 心率血氧采集功能設(shè)計(jì)與開(kāi)發(fā)_第3頁(yè)
《國(guó)產(chǎn)嵌入式技術(shù)及應(yīng)用實(shí)踐》課件 項(xiàng)目五可穿戴應(yīng)用終端設(shè)計(jì)與實(shí)現(xiàn)任務(wù)1 心率血氧采集功能設(shè)計(jì)與開(kāi)發(fā)_第4頁(yè)
《國(guó)產(chǎn)嵌入式技術(shù)及應(yīng)用實(shí)踐》課件 項(xiàng)目五可穿戴應(yīng)用終端設(shè)計(jì)與實(shí)現(xiàn)任務(wù)1 心率血氧采集功能設(shè)計(jì)與開(kāi)發(fā)_第5頁(yè)
已閱讀5頁(yè),還剩9頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

任務(wù)1心率血氧采集功能設(shè)計(jì)與開(kāi)發(fā)成都職業(yè)技術(shù)學(xué)院成都卓物科技有限公司任務(wù)情報(bào)本次任務(wù)使用MAX30102是一個(gè)典型的心率血氧傳感器芯片,由美信(Maxim)公司生產(chǎn)。該傳感器搭載在可穿戴系統(tǒng)應(yīng)用板卡ZW-M607中。如圖所示,MAX30102一共有8個(gè)引腳,利用I2C總線進(jìn)行通信,SDA為PC07,SCL為PC08,該模塊使用簡(jiǎn)單的兩線I2C接口與微控制器進(jìn)行通信。它有一個(gè)固定的I2C地址:0xAE(用于寫操作)和0xAF(用于讀操作)。MAX30102嵌入了一個(gè)用于存儲(chǔ)數(shù)據(jù)樣本的FIFO緩沖器。FIFO具有32個(gè)樣本存儲(chǔ)庫(kù),這意味著它可以容納多達(dá)32個(gè)SpO2和心率樣本。FIFO緩沖區(qū)可以減輕微控制器從傳感器讀取每個(gè)新數(shù)據(jù)樣本的負(fù)擔(dān),從而節(jié)省系統(tǒng)功耗。MAX30102FIFO的深度為32,每個(gè)buf是6個(gè)字節(jié)(兩通道數(shù)據(jù),每通道3字節(jié))。我么可以開(kāi)啟PPG_RDY_EN,這樣就能每來(lái)一個(gè)新的數(shù)據(jù),就會(huì)中斷一次通知我們?nèi)ト?shù)據(jù)。讀FIFO_DATA就會(huì)自動(dòng)清掉中斷標(biāo)志位。FIFO相關(guān)的寄存器有4個(gè)。如圖所示,雖然是顯示均可讀寫(R/W),但是實(shí)際上只有FIFOReadPointer可以寫(應(yīng)用在讀數(shù)據(jù)出錯(cuò),往回重讀一次的情況)。其他FIFO寄存器均為只讀。FIFOWritePointer:好理解,就是寫指針寄存器。保存下一個(gè)新數(shù)據(jù)在FIFO中的寫地址。每次來(lái)一個(gè)數(shù)據(jù),這個(gè)寫指針會(huì)自動(dòng)移動(dòng)一位。OverFlowCounter:如果32個(gè)FIFO深度滿了,就會(huì)在這里增加1,表示溢出。FIFOReadPointer:FIFO讀指針,始終指向下一個(gè)待讀取的FIFO地址。如果數(shù)據(jù)讀取后,讀地址也會(huì)自動(dòng)增加。FIFODataRegister:可以簡(jiǎn)單的理解為*FIFO_RD_PTR,始終指向下一個(gè)數(shù)據(jù)。心率血氧庫(kù)函數(shù)說(shuō)明打開(kāi)MAX30102.h文件,定義了心率血氧傳感器使用的I2C單元、時(shí)鐘和超時(shí)時(shí)間。/*I2Cunitdefine*/#defineMAX30102_I2C_UNIT(CM_I2C3)#defineMAX30102_I2C_FCG(FCG1_PERIPH_I2C3)#defineMAX30102_I2C_TIMEOUT(0xFFFFU)定義了心率血氧傳感器I2C地址和長(zhǎng)度。//MAX30102IIC器件地址#define MAX30102_IIC_ADDR (0x57)//地址長(zhǎng)度#defineMAX30102_ADDR_LEN(1)定義了心率血氧傳感器中斷引腳PC06。//MAX30102中斷引腳#defineMAX30102_INT_PORT(GPIO_PORT_C)#defineMAX30102_INT_PIN(GPIO_PIN_06)相應(yīng)的I2C引腳定義在BSP_I2C.h文件中,對(duì)應(yīng)修改I2C3的引腳SCL為PC08,SDA為PC07。/*DefineI2C3portandpinforSDAandSCL*/#defineI2C3_SCL_PORT(GPIO_PORT_C)#defineI2C3_SCL_PIN(GPIO_PIN_08)#defineI2C3_SDA_PORT(GPIO_PORT_C)#defineI2C3_SDA_PIN(GPIO_PIN_07)#defineBSP_I2C3_BAUDRATE(100000)心率血氧傳感器初始化打開(kāi)MAX30102.c文件,找到maxim_max30102_init()函數(shù)為心率血氧傳感器初始化函數(shù),在該函數(shù)初始化之前,需要初始化I2C3,否則此函數(shù)初始化不成功,在maxim_max30102_init()函數(shù)里首先初始化INT引腳,設(shè)置為輸入模式,開(kāi)啟引腳上拉電阻。stc_gpio_init_tstcGpioInit;(void)GPIO_StructInit(&stcGpioInit);stcGpioInit.u16PinDir=PIN_DIR_IN;//設(shè)置輸入模式stcGpioInit.u16PullUp=PIN_PU_ON;//開(kāi)啟上拉電阻(void)GPIO_Init(MAX30102_INT_PORT,MAX30102_INT_PIN,&stcGpioInit);復(fù)位心率血氧傳感器。maxim_max30102_reset();//resetstheMAX30102配置心率血氧傳感器相應(yīng)參數(shù),這些參數(shù)是根據(jù)官方代碼移植過(guò)來(lái)的,配置的代碼過(guò)長(zhǎng)此處省略。

if(!maxim_max30102_write_reg(REG_INTR_ENABLE_1,0xc0))//INTRsettingreturnFALSE;if(!maxim_max30102_write_reg(REG_INTR_ENABLE_2,0x00))returnFALSE;………………if(!maxim_max30102_write_reg(REG_PILOT_PA,0x7f))//Choosevaluefor~25mAforPilotLEDreturnFALSE;returnTRUE;主要配置了這些參數(shù):中斷使能FIFO指針SpO2配置LED電源設(shè)置采樣率在main函數(shù)里先初始化I2C總線,然后初始化maxim_max30102_init()函數(shù),串口初始化是為了后面打印心率和血氧數(shù)據(jù)。

/*MCUPeripheralregisterswriteunprotected*/LL_PERIPH_WE(LL_PERIPH_ALL);//解除MCU寄存器寫保護(hù)

BSP_CLK_Init();//時(shí)鐘初始化

TMR0_USART_Config();//串口接收超時(shí)定時(shí)器初始化

USART1_Init(57600);//串口1初始化

BSP_I2C3_Init();maxim_max30102_init();//心率血氧初始化

/*MCUPeripheralregisterswriteprotected*/LL_PERIPH_WP(LL_PERIPH_ALL);//MCU寄存器寫保護(hù)然后在主循環(huán)里延時(shí)50毫秒一直讀取心率血氧數(shù)據(jù)。

DDL_DelayMS(50);max30102Test();//心率血氧讀取溫濕度數(shù)據(jù)測(cè)試打開(kāi)MAX30102.c文件,定義了關(guān)于采集心率和血氧的一些參數(shù),該參數(shù)有很多,可針對(duì)代碼慢慢理解。#defineCALCULATE_TIMES4//有效值運(yùn)算次數(shù)#definePPG_DATA_THRESHOLD100000//檢測(cè)閾值#definen_ir_buffer_length500//定義血氧和心率數(shù)據(jù)長(zhǎng)度/*IRLEDsensordata紅外數(shù)據(jù),用于計(jì)算血氧*/uint32_taun_ir_buffer[n_ir_buffer_length];/*RedLEDsensordata紅光數(shù)據(jù),用于計(jì)算心率曲線以及計(jì)算心率*/uint32_taun_red_buffer[n_ir_buffer_length];int32_tn_sp02;//血氧數(shù)據(jù)int8_tch_spo2_valid;//血氧原始數(shù)據(jù)int32_tn_heart_rate;//心率數(shù)據(jù)int8_tch_hr_valid;//心率原始數(shù)據(jù)uint8_tfinger_touch_flag=0; //采集標(biāo)志位staticuint8_tcalculate_times=0;int32_tn_heart_rate_array[CALCULATE_TIMES]={0};//心率原始數(shù)據(jù)數(shù)組int32_tn_sp02_array[CALCULATE_TIMES]={0};//血氧原始數(shù)據(jù)數(shù)組看到max30102Test()函數(shù),首先需要在心率血氧傳感器INT引腳低電平時(shí)讀取數(shù)據(jù)。if(GPIO_ReadInputPins(MAX30102_INT_PORT,MAX30102_INT_PIN)==0)將500個(gè)樣例心率和血氧數(shù)據(jù),移除100個(gè)樣例,留下400個(gè)樣例。

for(uint16_ti=100;i<n_ir_buffer_length;i++){aun_red_buffer[i-100]=aun_red_buffer[i];aun_ir_buffer[i-100]=aun_ir_buffer[i];}然后開(kāi)始采集100個(gè)樣例心率和血氧數(shù)據(jù),在INT引腳低電平時(shí)采集數(shù)據(jù),一般情況下將手放在心率血氧傳感器上,才會(huì)把finger_touch_flag標(biāo)志位置1,采集到的數(shù)據(jù)此時(shí)有效。

//take100setsofsamplesbeforecalculatingtheheartrate.for(uint16_ti=(n_ir_buffer_length-100);i<n_ir_buffer_length;i++){while(GPIO_ReadInputPins(MAX30102_INT_PORT,MAX30102_INT_PIN)==1);//waituntiltheinterruptpinassertsmaxim_max30102_read_fifo((aun_red_buffer+i),(aun_ir_buffer+i));if((aun_red_buffer[i]>PPG_DATA_THRESHOLD)&&(aun_ir_buffer[i]>PPG_DATA_THRESHOLD))finger_touch_flag=1;//置標(biāo)志位}當(dāng)采集到的數(shù)據(jù)有效時(shí),記錄有效值次數(shù),并把采集的有效數(shù)據(jù)存入心率血氧數(shù)組中,同時(shí)將有效數(shù)據(jù)打印出來(lái)。

if(finger_touch_flag){finger_touch_flag=0;//記錄有效值次數(shù)

calculate_times++;n_heart_rate_array[calculate_times-1]=n_heart_rate;n_sp02_array[calculate_times-1]=n_sp02;printf("HR=%i,",n_heart_rate);printf("SpO2=%i,\r\n",n_sp02);當(dāng)記錄的有效值大于設(shè)定的值后,計(jì)算心率和血氧的平均值,此處代碼過(guò)長(zhǎng)省略,請(qǐng)?jiān)谠次募胁榭聪鄳?yīng)代碼。if(calculate_times>CALCULATE_TIMES){………………/*去頭尾計(jì)算均值*/

heart_rate_average=(n_heart_rate_sum-n_heart_rate_max– n_heart_rate_min)/(CALCULATE_TIMES-2);sp02_average=(n_sp02_sum-n_sp02_max-n_sp02_min)/ (CALCULATE_TIMES-2);printf("HR_average=%d,",heart_rate_average);printf("SpO2_average=%d,\r\n",sp02_average);calculate_times=0;}計(jì)算出的平均數(shù)據(jù),通過(guò)串口打印出來(lái)。任務(wù)實(shí)現(xiàn)第一步: 可穿戴系統(tǒng)應(yīng)用板卡(ZW-M607)使用12VDC電源供電,插入后按下電源開(kāi)關(guān)。第二步: 使用USB

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論