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

审核编辑:汤梓红
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 单片机
    +关注

    关注

    6001

    文章

    43978

    浏览量

    620862
  • STM32
    +关注

    关注

    2240

    文章

    10674

    浏览量

    348788
  • 软件设计
    +关注

    关注

    3

    文章

    55

    浏览量

    17675
  • 血氧仪
    +关注

    关注

    2

    文章

    124

    浏览量

    24676
  • GPIO
    +关注

    关注

    16

    文章

    1135

    浏览量

    50578
收藏 人收藏

    评论

    相关推荐

    STM32四种库对比 STM32标准库和HAL库有什么不同?

    STM32的四种库:STM32Snippets、Standard Peripheral Library、STM32Cube LL、STM32Cube HAL。
    发表于 08-24 09:45 8844次阅读
    <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>选型手册

    使用STM32Cube轻松开发STM32

    STM32Cube让STM32开发更轻松
    的头像 发表于 07-03 04:30 5334次阅读

    STM32遇到Linux = STM32MP1

    STM32遇到Linux = STM32MP1
    的头像 发表于 03-01 13:37 1901次阅读

    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>特点

    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单片机编程手册

    STM32F1移植到STM32F0

    电子发烧友网站提供《从STM32F1移植到STM32F0.pdf》资料免费下载
    发表于 09-21 14:45 0次下载
    从<b class='flag-5'>STM32</b>F1移植到<b class='flag-5'>STM32</b>F0