<acronym id="s8ci2"><small id="s8ci2"></small></acronym>
<rt id="s8ci2"></rt><rt id="s8ci2"><optgroup id="s8ci2"></optgroup></rt>
<acronym id="s8ci2"></acronym>
<acronym id="s8ci2"><center id="s8ci2"></center></acronym>
0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

基于STM32的血氧儀(2)

一口氣吃不成胖子 ? 來源:一口氣吃不成胖子 ? 作者:一口氣吃不成胖子 ? 2023-04-27 15:08 ? 次閱讀

一、簡介

續上部分,我們已經介紹了硬件設計和軟件框圖,接下來進行軟件的編寫和實物演示

二、軟件設計

2.1軟件設計框圖

poYBAGRKG8uAOpDPAABVhOpgInU189.png

2.2 MAX30102驅動編寫

2.2.1時鐘配置

設置系統時鐘源和分頻系數,使得STM32能夠正常工作。

__HAL_RCC_GPIOB_CLK_ENABLE();

2.2.2外設初始化

開啟需要使用的外設時鐘,并進行相應的GPIO口、LCD等外設初始化。

	//使用模擬SPI
	
  GPIO_InitTypeDef GPIO_InitStruct = {0};
	
  GPIO_InitStruct.Pin = GPIO_PIN_13|GPIO_PIN_15;
  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  GPIO_InitStruct.Pull = GPIO_NOPULL;
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
  HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);

LCD屏初始化

void max30100_init(void)
{
	max30100_Bus_Write(0x06, 0x0b);  //mode configuration : temp_en[3]      MODE[2:0]=010 HR only enabled    011 SP02 enabled

	max30100_Bus_Write(0x01, 0xF0); //open all of interrupt
	max30100_Bus_Write(INTERRUPT_REG, 0x00); //all interrupt clear
	max30100_Bus_Write(0x09, 0x33); //r_pa=3,ir_pa=3
	
max30100_Bus_Write(0x02, 0x00); //set FIFO write Pointer reg = 0x00 for clear it
	max30100_Bus_Write(0x03, 0x00);	//set Over Flow Counter  reg = 0x00 for clear it
	max30100_Bus_Write(0x04, 0x0F);	//set FIFO Read Pointer  reg = 0x0f for   
											//waitting  write pointer eq read pointer   to   interrupts  INTERRUPT_REG_A_FULL
}

MAX30100驅動程序

單片機通過I2C總線與傳感器模塊通信,獲取血氧、心率等數據。

//血液檢測信息更新
void blood_data_update(void)
{
	uint16_t temp_num=0;
	uint16_t fifo_word_buff[1][2];
	
	temp_num = max30100_Bus_Read(INTERRUPT_REG);
	
	//標志位被使能時 讀取FIFO
	if (INTERRUPT_REG_A_FULL&temp_num)
	{
		HAL_GPIO_WritePin(GPIOC,GPIO_PIN_13,1);
		//讀取FIFO
		max30100_FIFO_Read(0x05,fifo_word_buff,1); //read the hr and spo2 data form fifo in reg=0x05
		
		//將數據寫入fft輸入并清除輸出
		for(int i = 0;i < 1;i++)
		{
			if(g_fft_index < FFT_N)
			{
				s1[g_fft_index].real = fifo_word_buff[i][0];
				s1[g_fft_index].imag= 0;
				s2[g_fft_index].real = fifo_word_buff[i][1];
				s2[g_fft_index].imag= 0;
				g_fft_index++;
			}
		}
		//信息更新標志位
		g_blooddata.update++;
	}
	else
	{
		HAL_GPIO_WritePin(GPIOC,GPIO_PIN_13,0);
	}
}

1.硬件初始化模塊:包括時鐘配置、外設初始化等。

2.數據處理模塊:對采集到的數據進行處理,計算出血氧值和心率等指標,并將其顯示在LCD等界面上。

3.通信模塊:可以通過UART方式與其他設備進行通信,將數據上傳至PC端進行分析。

2.2.3計算血氧值和心率值

根據采集到的SPO2數據和心率數據,進行相應的計算,得出血氧值和心率值。

2.2.3.1 雙波長光吸收比值計算

雙波長光吸收比值計算是血氧值計算算法的第一步,它通過傳感器模塊采集的紅光和紅外信號,計算出其在不同波長下的吸收比值。一般需要進行以下幾個步驟:

1.獲取紅光和紅外線信號:

temp_num = max30100_Bus_Read(INTERRUPT_REG);

2.血氧飽和度計算:根據雙波長光吸收比值和相關系數,計算出血氧飽和度。

		//解平方
		for(int i = 0;i < FFT_N;i++) 
		{
			s1[i].real=sqrtf(s1[i].real*s1[i].real+s1[i].imag*s1[i].imag);
			s2[i].real=sqrtf(s2[i].real*s2[i].real+s2[i].imag*s2[i].imag);
		}

3.計算紅光和紅外線信號比值:將紅光和紅外線信號分別除以一個參考值(如環境光強度),得到其相對強度,再將兩者相除,得到紅光/紅外線信號比值。

 	       //心率計算
			uint16_t Heart_Rate = 60 * SAMPLES_PER_SECOND * 
														s2_max_index / FFT_N;
			
			g_blooddata.heart = Heart_Rate - 10;
			
			//血氧含量計算
			float sp02_num = (s2[s1_max_index].real * s1[0].real)
											/(s1[s1_max_index].real * s2[0].real);
			
			sp02_num = (1 - sp02_num) * SAMPLES_PER_SECOND + CORRECTED_VALUE;
			
			g_blooddata.SpO2 = sp02_num;

4.對比值進行濾波

對紅光/紅外線信號比值進行直流濾波處理,降低采集噪聲和干擾。

    //前8次求平均值
	for(int i = 0;i < 8;i++)
	{
		hbag  += s1[g_fft_index - 8 + i].real;
		hboag += s2[g_fft_index - 8 + i].real;
	}
		
	//直流濾波
	hbag_d = dc_filter(hbag,&hbdc) / 8;
	hboag_d = dc_filter(hboag,&hbodc) / 8;
	
	//高度數據
	float hbhight  = 0;
	float hbohight = 0;
	
	//比例與偏置
	hbhight  = (-hbag_d / 40.0) + 5;
	hbohight  = (-hboag_d / 40.0) + 5;
	
	//高度數據幅度限制
	hbhight = (hbhight > 27) ? 27 : hbhight;
	hbhight = (hbhight < 0) ?  0 : hbhight;
	
	hbohight = (hbohight > 27) ? 27 : hbohight;
	hbohight = (hbohight < 0) ?  0 : hbohight;
	
	//將數據發布到全局
	g_BloodWave.Hp = hbhight;
	g_BloodWave.HpO2 = hbohight;

2.2.4顯示數據

將計算得到的血氧值和心率值,顯示在LCD等界面上

//測試顯示血液信息
void tft_test_display(void)
{
	uint8_t str[50];

	if (g_blooddata.display == 1)
	{
		g_blooddata.display = 0;
		
		//顯示血氧信息
		sprintf((char *)str,"heart = %3d",g_blooddata.heart);
		Gui_DrawFont_GBK16(8,8,0x00FF,BLACK,str);
		
		//顯示心率信息
		sprintf((char *)str,"SpO2 = %3.1f",g_blooddata.SpO2);
		Gui_DrawFont_GBK16(8,26,0x00FF,BLACK,str);
		
		//顯示狀態信息
		if(g_blooddata.state)
		{
			sprintf((char *)str,"ERROR     ");
			Gui_DrawFont_GBK16(8,44,0xF000,BLACK,str);
		}
		else
		{
			sprintf((char *)str,"NORMAL    ");
			Gui_DrawFont_GBK16(8,44,0x07E0,BLACK,str);
		}
	}
}

三、實物演示

poYBAGRKG_KAUX2KAAXftGUj87Q145.pngpYYBAGRKG9WAL37HAAVeLtggUFA771.png

審核編輯:湯梓紅
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 單片機
    +關注

    關注

    6005

    文章

    44015

    瀏覽量

    621931
  • STM32
    +關注

    關注

    2242

    文章

    10680

    瀏覽量

    349208
  • 軟件設計
    +關注

    關注

    3

    文章

    55

    瀏覽量

    17696
  • 血氧儀
    +關注

    關注

    2

    文章

    125

    瀏覽量

    24690
  • GPIO
    +關注

    關注

    16

    文章

    1141

    瀏覽量

    50673
收藏 人收藏

    評論

    相關推薦

    STM32四種庫對比 STM32標準庫和HAL庫有什么不同?

    STM32的四種庫:STM32Snippets、Standard Peripheral Library、STM32Cube LL、STM32Cube HAL。
    發表于 08-24 09:45 ?9419次閱讀
    <b class='flag-5'>STM32</b>四種庫對比 <b class='flag-5'>STM32</b>標準庫和HAL庫有什么不同?

    STM32F101xC/STM32F101xD/STM32F

    STM32F101xC/STM32F101xD/STM32F101xE中文資料:本文給出了STM32F101xC、STM32F101xD和
    發表于 11-01 14:54 ?134次下載

    STM32學習教程_[STM32經驗]

    [STM32經驗] STM32學習教程希望對你有幫助
    發表于 11-02 17:28 ?267次下載

    STM32之AN2576_STM32F10xxx SPI 應用示

    STM32之AN2576_STM32F10xxx SPI 應用示例[1],很好的STM32資料,快來學習吧。
    發表于 04-26 09:51 ?23次下載

    STM32之AN2582_STM32F10xxx USART應用

    STM32之AN2582_STM32F10xxx USART應用實例,很好的STM32資料,快來學習吧。
    發表于 04-26 09:51 ?27次下載

    STM32介紹

    STM32的介紹STM32的介紹STM32的介紹
    發表于 07-19 17:34 ?0次下載

    stm32v107\STM32資料\STM8S和STM32選型手冊

    stm32v107\STM32資料\STM8S和STM32選型手冊
    發表于 10-13 09:19 ?137次下載
    <b class='flag-5'>stm32</b>v107\<b class='flag-5'>STM32</b>資料\STM8S和<b class='flag-5'>STM32</b>選型手冊

    STM32遇到Linux = STM32MP1

    STM32遇到Linux = STM32MP1
    的頭像 發表于 03-01 13:37 ?1915次閱讀

    stm32中的io函數 STM32中的IO操作

    STM32系列單片機芯片的庫函數有很多種,而負責IO操作的庫函數是GPIO,GPIO函數在STM32單片機頭文件stm32f10x_gpio.h中聲明,在STM32單片機的主函數
    的頭像 發表于 07-22 15:29 ?1.3w次閱讀

    STM32STM32 MCU系列介紹

    STM32-32 微控制器(MCU)家族 系列 MCU 主流級別MCU STM32 F0系列-ARM Cortex-M0入門級MCU STM32 F1系列-ARM Cortex-M3
    發表于 11-18 18:51 ?72次下載
    【<b class='flag-5'>STM32</b>】<b class='flag-5'>STM32</b> MCU系列介紹

    STM32 (零)--------STM32介紹

    STM32,從字面上來理解,ST 是意法半導體,M 是Microelectronics 的縮寫,32 表示32 位,合起來理解,STM32 就是指 ST 公司開發的 32 位微控制器。STM32
    發表于 11-23 18:21 ?48次下載
    <b class='flag-5'>STM32</b>  (零)--------<b class='flag-5'>STM32</b>介紹

    STM32——ARM與STM32之間的聯系

    ARM與STM32之間的聯系stm32是基于ARM內核的一種控制器,是包含與被包含的關系。ARM(STM32
    發表于 11-26 21:06 ?69次下載
    <b class='flag-5'>STM32</b>——ARM與<b class='flag-5'>STM32</b>之間的聯系

    STM32筆記)一、STM32特點

    我用的是正點的STM32F767來進行學習。之后的這個系列筆記開頭未標明的話,用的也是這個板子。一、STM32 特點1、什么是
    發表于 12-04 14:36 ?8次下載
    (<b class='flag-5'>STM32</b>筆記)一、<b class='flag-5'>STM32</b>特點

    利用stm32cubemx創建stm32工程

    下面我將為大家分享一下我利用stm32cubemx這款工具開發stm32首先介紹一下STM32的分類:我選擇的這款是STM32F103VE,首先打開
    發表于 12-24 19:14 ?31次下載
    利用<b class='flag-5'>stm32</b>cubemx創建<b class='flag-5'>stm32</b>工程

    PM0214_STM32F3,STM32F4,STM32L4和STM32L4plus單片機編程手冊

    PM0214_STM32F3,STM32F4,STM32L4和STM32L4plus單片機編程手冊
    發表于 11-24 08:30 ?22次下載
    PM0214_<b class='flag-5'>STM32</b>F3,<b class='flag-5'>STM32</b>F4,<b class='flag-5'>STM32</b>L4和<b class='flag-5'>STM32</b>L4plus單片機編程手冊
    亚洲欧美日韩精品久久_久久精品AⅤ无码中文_日本中文字幕有码在线播放_亚洲视频高清不卡在线观看
    <acronym id="s8ci2"><small id="s8ci2"></small></acronym>
    <rt id="s8ci2"></rt><rt id="s8ci2"><optgroup id="s8ci2"></optgroup></rt>
    <acronym id="s8ci2"></acronym>
    <acronym id="s8ci2"><center id="s8ci2"></center></acronym>