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

審核編輯:湯梓紅
  • 單片機
    +關注

    關注

    5819

    文章

    39599

    瀏覽量

    610451
  • STM32
    +關注

    關注

    2140

    文章

    8849

    瀏覽量

    343113
  • 軟件設計
    +關注

    關注

    3

    文章

    46

    瀏覽量

    17570
  • 血氧儀
    +關注

    關注

    2

    文章

    94

    瀏覽量

    24390
  • GPIO
    +關注

    關注

    14

    文章

    712

    瀏覽量

    49228
收藏 人收藏

    評論

    相關推薦

    stm32 心率采集

    jf_95215556
    發布于 :2022年09月22日 21:04:49

    智能由哪幾部分組成?

    由哪幾部分組成?
    發表于 06-16 07:00

    介紹一種指甲式方案

    是什么?指甲式工作原理是什么?指甲式方案芯片詳細參數有哪些?
    發表于 06-18 07:51

    智能是指什么?智能有哪些優點?

    是指什么?智能有什么作用?智能有哪些優點?
    發表于 07-02 06:57

    請問怎樣去設計一款兼容藍牙BLE 4.2和5.0?

    工作原理是什么?常規設計方案又有哪些呢?怎樣去設計一款兼容藍牙BLE 4.2和5.0?
    發表于 07-02 07:02

    STM32F103RE在語音便攜式乳腺檢測應用

    STM32F103RE在語音便攜式乳腺檢測應用
    發表于 08-23 16:46 ?18次下載

    基于STM32手持式測設計_魏威

    基于STM32手持式測設計_魏威
    發表于 03-19 19:12 ?4次下載

    基于STM32FI03RE在語音便攜式乳腺檢測應用

    基于STM32FI03RE在語音便攜式乳腺檢測應用
    發表于 09-26 08:59 ?8次下載
    <b>基于</b><b>STM32</b>FI03RE在語音便攜式乳腺<b>血</b><b>氧</b>檢測<b>儀</b>中<b>的</b>應用

    基于STM32測力設計

    基于STM32測力設計
    發表于 09-28 11:54 ?19次下載
    <b>基于</b><b>STM32</b><b>的</b>測力<b>儀</b>設計

    使用Esp32基于物聯網脈搏

    32基于物聯網脈搏.zip》資料免費下載
    發表于 11-04 14:31 ?7次下載
    使用Esp<b>32</b><b>的</b><b>基于</b>物聯網<b>的</b>脈搏<b>血</b><b>氧</b><b>儀</b>

    如何快速設計脈搏

    飽和度在95%到100%范圍內。使用像圖1所示測量飽和度有助于監測我們健康狀況,而這正變得越來越流行。 圖1 指夾式脈搏
    的頭像 發表于 01-14 16:35 ?1819次閱讀
    如何快速設計脈搏<b>血</b><b>氧</b><b>儀</b>

    醫療級藍牙方案芯片設計——PCBA供應

    血流量測量數據。 基于其利ky32系列微控制器藍牙: - Cortex-M0 最高主頻 72MHz 可實現飽和度信號采集、算法操作和 OLED 顯示操作 - 提供低延遲低功耗藍牙功
    發表于 12-10 21:02 ?1256次閱讀
    醫療級藍牙<b>血</b><b>氧</b><b>儀</b>方案芯片設計——<b>血</b><b>氧</b><b>儀</b>PCBA供應

    CH32V103微控制器 方案

    主要測量指標分別為脈率、飽和度,該指標能反應心、肺等早期醫療問題,是臨床醫療上重要基礎數據之一。基于CH32V103微控制器,可實現高性能低成本方案。
    發表于 12-29 15:47 ?309次閱讀
    CH<b>32</b>V103微控制器 <b>血</b><b>氧</b><b>儀</b>方案

    基于靈動微MM32微控制器便攜式

    不再需要取,輕輕往手指上一夾就可以知道自己、脈搏等指標,在家就可以隨時隨地檢查自己健康狀況,為廣大市民提供便捷。 ? 基于靈動微MM32微控制器便攜式
    發表于 01-31 15:12 ?124次閱讀
    <b>基于</b>靈動微MM<b>32</b>微控制器<b>的</b>便攜式<b>血</b><b>氧</b><b>儀</b>

    基于STM32(1)

    基于STM32,用于測量人體飽和度和心率,并將測量結果顯示在LCD屏幕上。
    的頭像 發表于 04-27 14:49 ?655次閱讀
    <b>基于</b><b>STM32</b><b>的</b><b>血</b><b>氧</b><b>儀</b>(1)

    下載硬聲App

    精品久久久久久人妻免费
    秋霞在线视频| 亚洲图片小说| 免费看av| 日韩在线视频| 99热99| 777奇米| 依依成人网| 在线观看黄色视频| 三级片在线播放| 青草视频在线观看| 三级片免费看| 97视频在线观看| AV免费在线观看| 日韩在线视频| 毛片免费看| 中文字幕在线观看|py3700 亚洲视频在线观看|xre216 中文字幕在线观看|m3a810 日本三级片网站|jfv760 黄色视频在线免费观看|3di982 free性欧美|jz3749 免费黄色软件|t4k83 亚洲黄色网|mys387 亚洲视频在线观看|4bl947 中文字幕在线播放|l4g307 秋霞在线视频|qys578 台湾中文娱乐网|lwb977 男人的天堂av|m2e38 精品人妻一区二区三区|hj2520 在线黄色网站|gnx605 在线视频精品|o3r409