精品国产人成在线_亚洲高清无码在线观看_国产在线视频国产永久2021_国产AV综合第一页一个的一区免费影院黑人_最近中文字幕MV高清在线视频

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

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

    關注

    6032

    文章

    44525

    瀏覽量

    633248
  • STM32
    +關注

    關注

    2266

    文章

    10876

    瀏覽量

    354922
  • 軟件設計
    +關注

    關注

    3

    文章

    58

    瀏覽量

    17763
  • 血氧儀
    +關注

    關注

    2

    文章

    130

    瀏覽量

    24778
  • GPIO
    +關注

    關注

    16

    文章

    1196

    瀏覽量

    51926
收藏 人收藏

    評論

    相關推薦

    如何設計更優質的脈搏

    濃度是醫療院所最常記錄的生命體征指標之一,是血液中飽和血紅素在總血紅素所占的比例。測量
    的頭像 發表于 01-07 10:05 ?3132次閱讀
    如何設計更優質的脈搏<b class='flag-5'>血</b><b class='flag-5'>氧</b><b class='flag-5'>儀</b>?

    基于STM32(1)

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

    方案,深圳鼎盛合供應指夾式方案開發

    深圳鼎盛合科技提供指夾式芯片及PCBA方案開發。指夾式是一種用來檢測血流中的
    發表于 11-18 16:02

    介紹一種指甲式方案

    指甲式是什么?指甲式的工作原理是什么?指甲式
    發表于 06-18 07:51

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

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

    如何快速設計脈搏

    脈搏(如圖1所示)通過測量手指和去
    發表于 11-07 06:00

    如何快速設計脈搏

    路徑的模擬信號調理。具體的應用模式如圖2所示: ? 圖 2 智能模擬組合(SAC)框圖和模式 ? 系統框圖如圖3所示: ? 圖3 脈搏
    的頭像 發表于 01-14 16:35 ?2741次閱讀
    如何快速設計脈搏<b class='flag-5'>血</b><b class='flag-5'>氧</b><b class='flag-5'>儀</b>

    DIY

    電子發燒友網站提供《DIY.zip》資料免費下載
    發表于 12-02 11:42 ?23次下載
    DIY<b class='flag-5'>血</b><b class='flag-5'>氧</b><b class='flag-5'>儀</b>

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

    藍牙用于醫院、診所和家庭的低功耗藍牙指尖脈搏
    發表于 12-10 21:02 ?1888次閱讀
    醫療級藍牙<b class='flag-5'>血</b><b class='flag-5'>氧</b><b class='flag-5'>儀</b>方案芯片設計——<b class='flag-5'>血</b><b class='flag-5'>氧</b><b class='flag-5'>儀</b>PCBA供應

    的工作原理是什么

    主要是用于監測患者的脈搏、飽和度和血流灌注的儀器設備,而
    發表于 01-10 14:39 ?2356次閱讀
    <b class='flag-5'>血</b><b class='flag-5'>氧</b><b class='flag-5'>儀</b>的工作原理是什么

    原理圖

    設計原理圖免費下載
    發表于 01-31 14:59 ?139次下載

    可測心率嗎 的用途及功能

    是一種常見的醫療儀器,用于測量人體的飽和度(SpO2),也稱為脈
    發表于 05-03 10:08 ?5591次閱讀

    【世說設計】如何設計更優質的脈搏

    血管濃度(SpO2)是使用脈搏式測量身體末稍部位量測到的
    的頭像 發表于 01-12 17:22 ?980次閱讀
    【世說設計】如何設計更優質的脈搏<b class='flag-5'>血</b><b class='flag-5'>氧</b><b class='flag-5'>儀</b>?

    的曲線怎么看 下面的波浪線是什么

    的曲線主要反映了飽和度和脈搏的變化情況。通常,
    發表于 06-30 14:52 ?2.2w次閱讀

    分析儀和的區別 家用血種類有哪些?

    分析儀和是兩種用于測量人體飽和度(Sp
    發表于 07-18 15:25 ?2101次閱讀