基于STM32的血氧仪开源设计方案

基于stm32的血氧仪
一、简介
设计一款基于stm32的血氧仪,用于测量人体血氧饱和度和心率,并将测量结果显示在lcd屏幕上。
本产品由stm32f103c8t6单片机最小系统+max30102传感器+lcd显示模块+蜂鸣器模块组成。
1.选择合适的传感器模块,如max30102,用于采集红光和红外线信号,并通过单片机iic总线读取。
2.使用stm32微控制器作为主控芯片,配置相应的时钟源和分频系数,开启需要使用的外设时钟,包括gpio口、adc、lcd等。
3.根据传感器模块和lcd屏幕的接口要求,进行相应的gpio口配置和lcd初始化操作。
二、功能需求
采集功能:能够采集被测者的血氧饱和度和脉率信息,并进行数字化处理。
显示功能:通过led数码管、lcd显示屏等方式直观地呈现被测者的血氧饱和度和脉率信息。
报警功能:当被测者的血氧饱和度低于设定阈值时,能够及时发出声音或光闪提示,提醒用户。
数据存储功能:能够将采集到的血氧饱和度和脉率数据保存在内部存储器中,并具有查询和导出功能。
操作简单:血氧仪的操作应简单易懂,可以通过触摸方式实现。
尺寸轻巧:血氧仪应小巧便携,方便随身携带,适用于家庭、医院、体育运动等场合。
高精度稳定性:对于血氧饱和度和脉率的精度和稳定性要求较高,需确保数据准确可靠。
高安全性:血氧仪应具有较高的安全性,避免对人体产生不良影响。
三、硬件设计
3.1电路分析
传感器:血氧仪需要使用光学传感器进行血氧饱和度和脉率的采集。传感器可以采用led光源和光敏传感器进行测量,对传感器的灵敏度、响应速度等指标进行测试和优化。
信号放大与滤波:为提高信号的稳定性和精度,需要进行信号放大和滤波处理。可以采用运算放大器和低通滤波器进行信号处理,调整增益和截止频率以达到最佳效果。
显示屏:血氧仪需要配备显示屏进行数据显示。选择lcd显示屏作为显示模块。
控制器:血氧仪需要配备控制器进行系统控制和数据处理。选择stm32f103c8t6作为嵌入式微处理器。
3.2 max30102传感器原理
两个发光二极管,一个光检测器,携带氧气的红血球能吸收较多红外光(850-1000nm),未携带氧气的红血球则是吸收较多的红外光(600-750nm),利用不同红血球之吸收光谱的原理,来分析血氧饱和度。
四、软件设计
4.1软件设计框图
4.2 max30102驱动编写
4.2.1时钟配置
设置系统时钟源和分频系数,使得stm32能够正常工作。
__hal_rcc_gpiob_clk_enable();
4.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);  }} 硬件初始化模块:包括时钟配置、外设初始化等。
数据处理模块:对采集到的数据进行处理,计算出血氧值和心率等指标,并将其显示在lcd等界面上。
通信模块:可以通过uart方式与其他设备进行通信,将数据上传至pc端进行分析。
4.2.3计算血氧值和心率值
根据采集到的spo2数据和心率数据,进行相应的计算,得出血氧值和心率值。
4.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 27) ? 27 : hbhight;  hbhight = (hbhight 27) ? 27 : hbohight;  hbohight = (hbohight < 0) ?  0 : hbohight;    //将数据发布到全局  g_bloodwave.hp = hbhight;  g_bloodwave.hpo2 = hbohight; 4.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);    }  }} 五、实物演示


LDO与DC-DC本质上的区别
防火墙三大体系架构前景分析
4月向印度出口音圈马达呼吸机、制氧机等2.6万余台
探讨一下UPS电源的常见故障及处理方法
2021年节能减排补助资金预算(第一批)详细情况
基于STM32的血氧仪开源设计方案
风华多彩,渲染未来!芯动科技风华GPU亮相2023年全国科技活动周
半导体激光器的历史和结构
真菌毒素快速检测仪的技术特点
晶圆键合的种类和应用
英特尔10nm延期将为竞争对手打开一个窗口 或永远不会关闭
几十元钱和几百元的热水壶差别在哪?该如何选购热水壶?
红魔Mars电竞手机评测 一键开启全新游戏空间
无人机专用晶振的详细分析介绍
哎哟!样子不错哦!HTCU Ultra U Play正式发布 看看史上最全图集
蓄电池的使用和维护知识
代步微型汽车是否也适用于磷酸铁锂电池
ANet系列边缘计算DTU网关功能介绍
2020年数据存储市场的发展趋势
武汉火车刷脸进站!武汉火车站刷脸进站仅需2秒,素颜最快!人脸识别即将成为下一个风口?