基于STM32的心率血氧检测仪

您所在的位置:网站首页 血氧仪的用法和数字看法怎么看 基于STM32的心率血氧检测仪

基于STM32的心率血氧检测仪

2023-06-27 09:32| 来源: 网络整理| 查看: 265

基于STM32的心率血氧检测仪 一、硬件连接 1.1器材准备

(1)开发板:STM32F103系列

(2)显示屏:0.96寸OLED

(3)串口监视:USB-TTL

1.2线路连接 STM32F1030.96寸 OLEDUSB-TTLVCC3.3VVCC3.3V5V5VGNDGNDGNDGNDGNDGNDSCLPB7SCLPA5RXDPA9SDAPB8SDAPA6TXDPA10INTPB9RSTPA3DCPA4CSPA2 二、实验原理 2.1 0.96寸OLED显示原理

引脚含义:

端口名功能GND接地端口VCC接3.3V电源端口D0CLK时钟信号(等同于SCL)D1数据端口(等同于SDA)RES复位端口(等同于RST)DC数据/命令选择引脚(等同于D/C)CS片选引脚(低电平有效,也就是所需要接低电平,我实际试验过不接该引脚也是可以正常使用的)在这里插入图片描述

我们利用液晶屏幕可显示数据,字符以及各种图片信息等

#include "stm32f10x.h" #include "oled.h" //清屏函数,清完屏,整个屏幕是黑色的!和没点亮一样!!! void OLED_Clear(void) { u8 i,n; for(i=0;i63)return;//超出范围了. pos=7-y/8; bx=y%8; temp=1 数字信号

在这里插入图片描述

2.2.3为什么大多数传感器都是采用的绿光呢?

我们先看看光谱的特点,从紫外线到红外线的波长是越来越长的。 在这里插入图片描述

之所以选择绿光作为光源是考虑到一下几个特点:

皮肤的黑色素会吸收大量波长较短的波

皮肤上的水份也会吸收大量的UV和IR部分的光

进入皮肤组织的绿光(500nm)-- 黄光(600nm)大部分会被红细胞吸收

红光和接近IR的光相比其他波长的光更容易穿过皮肤组织

血液要比其他组织吸收更多的光

相比红光,绿(绿-黄)光能被氧合血红蛋白和脱氧血红蛋白吸收

总体来说,绿光-- 红光能作为测量光源。早起多数采用红光为光源,随着进一步的研究和对比,绿光作为光源得到的信号更好,信噪比也比其他光源好些,所以现在大部分穿戴设备采用绿光为光源。但是考虑到皮肤情况的不用(肤色、汗水),高端产品会根据情况自动使用换绿光、红光和IR多种光源。

虽然知道了上面的几个特点,但是还不足以弄清楚为什么通过光照就能测出心率、血氧等参数呢?

下图就解释了核心原理 在这里插入图片描述

当光照透过皮肤组织然后再反射到光敏传感器时光照有一定的衰减的。像肌肉、骨骼、静脉和其他连接组织等等对光的吸收是基本不变的(前提是测量部位没有大幅度的运动),但是血液不同,由于动脉里有血液的流动,那么对光的吸收自然也有所变化。当我们把光转换成电信号时,正是由于动脉对光的吸收有变化而其他组织对光的吸收基本不变,得到的信号就可以分为直流DC信号和交流AC信号。提取其中的AC信号,就能反应出血液流动的特点。我们把这种技术叫做光电容积脉搏波描记法PPG。

下图是PPG信号和ECG信号的对比 在这里插入图片描述

实际测量手指的PPG信号如下:

所以,只要测得到的PPG信号比较理想算出心率也不算什么难事。但是事实总是残酷的,由于测量部位的移动、自然光、日光灯等等其他的干扰,最终测到的信号可能是下面的这种 在这里插入图片描述

所以要通过很多方法进行滤波处理

在这里插入图片描述

对于PPG信号的处理,目前我知道的有两种方法。一种是时域分析,即算出一定时间内PPG信号的波峰个数,另一种是通过对PPG信号进行FFT变换得到频域的特点。

时域方法

​ 通过对原始的{PPG信号进行滤波处理,得到一定时间内的波峰个数,然后既可算出心率值

假设连续采样5秒的时间,在5s内的波峰个数为N,那么心率就是N*12 (这个相信大家都懂,就跟把脉一样~)

频域分析

上面分析过,我们把血液流动对光吸收转变成了AC信号,如果对于进行FFT变换,那么就能看到频域的特点。如下图就是对PPG信号的FFT转变

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6CZS67Sx-1650199733333)(md图片/Center-165019874162615.jpeg)]

​ 上图中的频域图,0Hz的信号很强,这部分是骨骼、肌肉等组织的DC信号,在1Hz附近有个相对比较突出的信号就是血液流动转变的AC信号。假设测得到的频率f = 1.2Hz

那么心率HeartRate HR = f x60 = 1.2 x 60 = 72

最后再简单提一下血氧的测量,相比心率血氧测量难度较大而且精度不算太高。测量血氧的原理图下图所示 在这里插入图片描述

​ 由于血液中含有的氧合血红蛋白HbO2和血红蛋白Hb存在一定的比例,简单说也就是含氧量吧。上面的图表示了氧合血红蛋白HbO2和血红蛋白Hb对波长6001000nm的光吸收特性,从图中可以看出上600800nm间Hb的吸收系数更高,8001000之间HbO2的吸收系数更高。所以可以利用红光(600800nm)和接近IR(800~1000nm)的光分别检测HbO2和Hb的PPG信号,然后通过程序处理算出相应的比值,这样就得到了血氧值。

在这里插入图片描述

但是由于光源不同,直接利用红光和接近IR的光进行信号对比是不可靠的,因为红光和IR透过皮肤组织也会产生不同的吸收。下图是红光和IR透过皮肤的原始信号示意图 在这里插入图片描述

​ 上面分析说过,DC部分是光透过皮肤组织转换成的直流信号,AC是血液流动产生转换成的交流信号。由于皮肤组织对红光和IR的吸收程度不同,DC部分自然也就不一样。为了能共“公平对待”两种光源的PPG信号,所以需要对原始信号处理一下。下图示意了处理后的信号(DC部分相等)

三、实验程序解析 3.1主函数部分 #include "led.h" #include "delay.h" #include "sys.h" #include "usart.h" #include "max30102.h" #include "myiic.h" #include "algorithm.h" #include "oled.h" uint32_t aun_ir_buffer[500]; //显示传感器数据 int32_t n_ir_buffer_length; //数据长度 uint32_t aun_red_buffer[500]; //LED数据 int32_t n_sp02; //SPO2值 int8_t ch_spo2_valid; //指示器:显示 SP02 计算是否有效 int32_t n_heart_rate; //心率值 int8_t ch_hr_valid; //指示器:用于显示心率计算是否有效 uint8_t uch_dummy; #define MAX_BRIGHTNESS 255 //亮度最大值 void dis_DrawCurve(u32* data,u8 x); int main(void) { //用于计算反映心跳的板载 LED 亮度的变量 uint32_t un_min, un_max, un_prev_data; int i; int32_t n_brightness; float f_temp; u8 temp_num=0; u8 temp[6]; u8 str[100]; u8 dis_hr=0,dis_spo2=0; NVIC_Configuration(); delay_init(); //延时函数初始化 uart_init(115200); //串口初始化为115200 LED_Init(); //OLED OLED_Init(); OLED_ShowString(0,0," initializing ",16); OLED_Refresh_Gram();//更新显示到OLED max30102_init(); printf("\r\n MAX30102 init \r\n"); un_min=0x3FFFF; un_max=0; n_ir_buffer_length=500; //缓冲液长度为 100 可存储以 100sps 运行的 5 秒样本 //读取前500个样本,并确定信号范围 for(i=0;i


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3