找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 7130|回复: 17
收起左侧

STM32 MAX30102心率血氧模块源程序

  [复制链接]
ID:336427 发表于 2020-3-7 23:54 | 显示全部楼层 |阅读模式
从网上找的资料,输出数据比较稳定,hal库版本使用的是软件IIC,注释就不添加特别多了,绝对可用,HAL库版本的MAX30102血氧模块
  1.         uint32_t un_min, un_max, un_prev_data;  
  2.         int i;
  3.         int32_t n_brightness;
  4.         float f_temp;
  5.         u8 temp_num=0;
  6.         u8 temp[6];
  7.         u8 str[100];
  8.         u8 dis_hr=0,dis_spo2=0;
  9.   /* USER CODE END 1 */

  10.   /* MCU Configuration----------------------------------------------------------*/

  11.   /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  12.   HAL_Init();

  13.   /* USER CODE BEGIN Init */

  14.   /* USER CODE END Init */

  15.   /* Configure the system clock */
  16.   SystemClock_Config();

  17.   /* USER CODE BEGIN SysInit */

  18.   /* USER CODE END SysInit */

  19.   /* Initialize all configured peripherals */
  20.   MX_GPIO_Init();
  21.   MX_DMA_Init();
  22.   MX_TIM4_Init();
  23.   MX_USART1_UART_Init();
  24.   /* USER CODE BEGIN 2 */
  25.         
  26.         delay_init();
  27.         max30102_init();
  28.   /* USER CODE END 2 */

  29.   /* Infinite loop */
  30.   /* USER CODE BEGIN WHILE */
  31.         un_min=0x3FFFF;
  32.         un_max=0;
  33.         
  34.         n_ir_buffer_length=500; //buffer length of 100 stores 5 seconds of samples running at 100sps
  35.         //read the first 500 samples, and determine the signal range
  36.     for(i=0;i<n_ir_buffer_length;i++)
  37.     {
  38.         while(MAX30102_INT==1);   //wait until the interrupt pin asserts

  39.                 max30102_FIFO_ReadBytes(REG_FIFO_DATA,temp);
  40.                 aun_red_buffer[i] =  (long)((long)((long)temp[0]&0x03)<<16) | (long)temp[1]<<8 | (long)temp[2];    // Combine values to get the actual number
  41.                 aun_ir_buffer[i] = (long)((long)((long)temp[3] & 0x03)<<16) |(long)temp[4]<<8 | (long)temp[5];   // Combine values to get the actual number

  42.         if(un_min>aun_red_buffer[i])
  43.             un_min=aun_red_buffer[i];    //update signal min
  44.         if(un_max<aun_red_buffer[i])
  45.             un_max=aun_red_buffer[i];    //update signal max
  46.     }
  47.         un_prev_data=aun_red_buffer[i];
  48.         //calculate heart rate and SpO2 after first 500 samples (first 5 seconds of samples)
  49.     maxim_heart_rate_and_oxygen_saturation(aun_ir_buffer, n_ir_buffer_length, aun_red_buffer, &n_sp02, &ch_spo2_valid, &n_heart_rate, &ch_hr_valid);         
  50.   while (1)
  51.   {

  52.   /* USER CODE END WHILE */

  53.   /* USER CODE BEGIN 3 */
  54.                 i=0;
  55.         un_min=0x3FFFF;
  56.         un_max=0;
  57.                
  58.                 //dumping the first 100 sets of samples in the memory and shift the last 400 sets of samples to the top
  59.         for(i=100;i<500;i++)
  60.         {
  61.             aun_red_buffer[i-100]=aun_red_buffer[i];
  62.             aun_ir_buffer[i-100]=aun_ir_buffer[i];

  63.             //update the signal min and max
  64.             if(un_min>aun_red_buffer[i])
  65.             un_min=aun_red_buffer[i];
  66.             if(un_max<aun_red_buffer[i])
  67.             un_max=aun_red_buffer[i];
  68.         }
  69.                 //take 100 sets of samples before calculating the heart rate.
  70.         for(i=400;i<500;i++)
  71.         {
  72.             un_prev_data=aun_red_buffer[i-1];
  73.             while(MAX30102_INT==1);
  74.             max30102_FIFO_ReadBytes(REG_FIFO_DATA,temp);
  75.                         aun_red_buffer[i] =  (long)((long)((long)temp[0]&0x03)<<16) | (long)temp[1]<<8 | (long)temp[2];    // Combine values to get the actual number
  76.                         aun_ir_buffer[i] = (long)((long)((long)temp[3] & 0x03)<<16) |(long)temp[4]<<8 | (long)temp[5];   // Combine values to get the actual number

  77.             if(aun_red_buffer[i]>un_prev_data)
  78.             {
  79.                 f_temp=aun_red_buffer[i]-un_prev_data;
  80.                 f_temp/=(un_max-un_min);
  81.                 f_temp*=MAX_BRIGHTNESS;
  82.                 n_brightness-=(int)f_temp;
  83.                 if(n_brightness<0)
  84.                     n_brightness=0;
  85.             }
  86.             else
  87.             {
  88.                 f_temp=un_prev_data-aun_red_buffer[i];
  89.                 f_temp/=(un_max-un_min);
  90.                 f_temp*=MAX_BRIGHTNESS;
  91.                 n_brightness+=(int)f_temp;
  92.                 if(n_brightness>MAX_BRIGHTNESS)
  93.                     n_brightness=MAX_BRIGHTNESS;
  94.             }
  95.                         //send samples and calculation result to terminal program through UART
  96.                         if(ch_hr_valid == 1 && n_heart_rate<120)//**/ ch_hr_valid == 1 && ch_spo2_valid ==1 && n_heart_rate<120 && n_sp02<101
  97.                         {
  98.                                 dis_hr = n_heart_rate;
  99.                                 dis_spo2 = n_sp02;
  100.                         }
  101.                         else
  102.                         {
  103.                                 dis_hr = 0;
  104.                                 dis_spo2 = 0;
  105.                         }
  106.                                 printf("HR=%i, ", n_heart_rate);
  107.                                 printf("HRvalid=%i, ", ch_hr_valid);
  108.                                 printf("SpO2=%i, ", n_sp02);
  109.                                 printf("SPO2Valid=%i\r\n", ch_spo2_valid);
  110.                 }
  111.         maxim_heart_rate_and_oxygen_saturation(aun_ir_buffer, n_ir_buffer_length, aun_red_buffer, &n_sp02, &ch_spo2_valid, &n_heart_rate, &ch_hr_valid);
复制代码


使用引脚,INT接PB9 SCL接PB7 SDA接PB9 VCC接3.3V GND接GND

数据稳定

数据稳定

MAX0102new.7z

2.9 MB, 下载次数: 359, 下载积分: 黑币 -5

回复

使用道具 举报

ID:282431 发表于 2020-3-8 10:01 | 显示全部楼层
好资料,谢谢楼主,学习学习51黑有你更精彩!!!
回复

使用道具 举报

ID:707694 发表于 2020-3-13 15:07 | 显示全部楼层
谢谢楼主分享,正学习这部分。
回复

使用道具 举报

ID:116773 发表于 2020-3-14 16:09 | 显示全部楼层
INT和SDA其中之一接PB9引脚,另外的接哪个引脚?

X10301.jpg

回复

使用道具 举报

ID:730244 发表于 2020-4-16 11:15 | 显示全部楼层
同问,为什么有两个PB9呢,麻烦大神看一下
回复

使用道具 举报

ID:336427 发表于 2020-5-14 21:23 | 显示全部楼层
hujj 发表于 2020-3-14 16:09
INT和SDA其中之一接PB9引脚,另外的接哪个引脚?

不好意思写错了
回复

使用道具 举报

ID:336427 发表于 2020-5-14 21:24 | 显示全部楼层
PB9那个打错了,SDA接的应该是PB6或PB8,从程序里面可以看出来的
回复

使用道具 举报

ID:185372 发表于 2020-6-20 10:31 | 显示全部楼层
这个先感谢一下。我的数据很不稳定,看看lz的效果是不是很好。
回复

使用道具 举报

ID:185372 发表于 2020-6-20 10:40 | 显示全部楼层
程序里面是SDA接的是PB7.(当然我设计的是INT是PB7,SDA是PB9)
回复

使用道具 举报

ID:196009 发表于 2020-6-20 12:41 | 显示全部楼层
这个不错!!!!
回复

使用道具 举报

ID:138247 发表于 2020-6-25 12:30 | 显示全部楼层
谢谢楼主分享。。
回复

使用道具 举报

ID:789678 发表于 2020-6-26 22:29 | 显示全部楼层
所以最终的引脚是怎么接的呀
回复

使用道具 举报

ID:789678 发表于 2020-6-26 23:24 | 显示全部楼层
接线完整的可以发一个吗,看不明白。连接上的输出都是-999
回复

使用道具 举报

ID:821898 发表于 2021-4-6 23:34 | 显示全部楼层
请问楼主串口调试助手一直返回的数据是-999是什么原因呢
回复

使用道具 举报

ID:791189 发表于 2021-4-13 15:37 | 显示全部楼层
ly0123 发表于 2021-4-6 23:34
请问楼主串口调试助手一直返回的数据是-999是什么原因呢

当心率或血氧值的计算结果有误时对应的变量值为-999
回复

使用道具 举报

ID:900801 发表于 2021-4-15 11:57 | 显示全部楼层
请问数据-999怎么解决呢
回复

使用道具 举报

ID:900801 发表于 2021-4-15 12:05 | 显示全部楼层
obsidiancen 发表于 2021-4-13 15:37
当心率或血氧值的计算结果有误时对应的变量值为-999

大佬,那这个问题怎么解决呢
回复

使用道具 举报

ID:432151 发表于 2021-5-23 23:43 | 显示全部楼层
这个测不准诶
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表