STM32-HAL库 - MAX30102心率血氧传感器 —— 2024.10.15

一、教程简介

        本教程使用CubeMX配合Keil5编写代码,带你10分钟拿下MAX30102。在官方例程的基础上进行移植和封装,测量数据准确。采用模拟I2C,任意三个引脚均可驱动。

二、MAX30102简介

         MAX30102是一个集成的脉搏血氧仪和心率监测仪生物传感器的模块。它集成了一个红光LED和一个红外光LED、光电检测器、光器件,以及带环境光抑制的低噪声电子电路。MAX30102采用一个1.8V电源和一个独立的5.0V用于内部LED的电源,应用于可穿戴设备进行心率和血氧采集检测,佩戴于手指点耳垂和手腕处。标准的I2C兼容的通信接口可以将采集到的数值传输Arduino、KL25Z、STM32、STC51等单片机进行心率和血氧计算。

        此外,该芯片还可以通过软件关断模块,待机电流接近为零,实现电源始终维持供电状态。

三、驱动移植

(一)CubeMX生成基础工程

1、选择芯片,这里选择STM32F103c8t6

2. 配置Debug(SW模式)

3. 配置时钟

 4.配置MAX30102驱动引脚(可任意选择,只要接线按照自定义的引脚来接就行)

    这里选择B7-SCL,B8-SDA,B9-INT。

    选择合适的SCL引脚,将其重命名为:MAX30102_SCL

 选择合适的SDA引脚,将其重命名为:MAX30102_SDA

选择合适的INT引脚,将其重命名为:MAX30102_INT 

5、配置串口,用于输出测量结果

 6、生成工程文件

(二)获取驱动源码

       1、 请添加威信:able078  

       2、 发送信息:获取MAX30102驱动

        我投入了大量时间与精力开发这款驱动,为了能继续提供更优质的驱动资源,获取驱动文件需要付费。

        请相信,免费的未必是最经济的选择,而投资于高质量的资源,往往能带来超乎预期的回报。本驱动有着极高的易用性和兼容性,只需遵循简明教程,几乎可在10分钟内移植成功。可为您节省大量的开发时间。

(三)Keil5编写代码

1、添加驱动文件:打开生成的项目文件夹,分别将两个 .c 文件和两个 .h 文件移入下图所示的文件夹中。

2、 打开工程

3、添加编译文件

 

 4、引用头文件

/* Includes ------------------------------------------------------------------*/
#include "main.h"
#include "usart.h"
#include "gpio.h"

/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
#include "max30102.h"
/* USER CODE END Includes */

5、定义两个变量,用于存储测量到的心率数据和血氧数据

/* Private macro -------------------------------------------------------------*/
/* USER CODE BEGIN PM */
uint8_t Hr_Value   = 0; //心率数值
uint8_t Spo2_Value = 0; //血氧数值
/* USER CODE END PM */

6、在main函数中进行MAX30102的初始化

 /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_USART1_UART_Init();
 /* USER CODE BEGIN 2 */
  max30102_init();
 /* USER CODE END 2 */

7、 在while(1)中循环读取数据

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
	HAL_Delay(1000);
	Get_Hr_Spo2_Value(&Hr_Value,&Spo2_Value);
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }

8、编译、下载

四、电路连接

MAX30102模块单片机说明
VIN~>5V 模块的VIN接入5V电源
GND~>GND 模块的任意一个GND接电源地
SCL~>MAX30102_SCL模块的SCL连接CubeMX中定义的MAX30102_SCL
SDA~>MAX30102_SDA模块的SDA连接CubeMX中定义的MAX30102_SDA
INT~>MAX30102_INT模块的INT 连接CubeMX中定义的MAX30102_INT

五、效果验证

可以看到下面动图中的心率及血氧浓度在稳定的刷新,且数据波动平稳。

#include "max30102.h" #include "delay.h" /*****************³½¸çµ¥Æ¬»úÉè¼Æ****************** STM32 * Îļþ : MAX30102ÐÄÂÊѪÑõ´«¸ÐÆ÷cÎļþ * °æ±¾ : V1.0 * ÈÕÆÚ : 2024.8.18 * MCU : STM32F103C8T6 * ½Ó¿Ú : ¼ûmax30102.hÎļþ * BILIBILI : ³½¸çµ¥Æ¬»úÉè¼Æ * CSDN : ³½¸çµ¥Æ¬»úÉè¼Æ * ×÷Õß : ³½¸ç **********************BEGIN***********************/ u8 max30102_Bus_Write(u8 Register_Address, u8 Word_Data) { /* ²ÉÓô®ÐÐEEPROMËæ¼´¶ÁȡָÁîÐòÁУ¬Á¬Ðø¶ÁÈ¡Èô¸É×Ö½Ú */ /* µÚ1²½£º·¢ÆðI2C×ÜÏ߯ô¶¯ÐźŠ*/ MAX30102_IIC_Start(); /* µÚ2²½£º·¢Æð¿ØÖÆ×Ö½Ú£¬¸ß7bitÊǵØÖ·£¬bit0ÊǶÁд¿ØÖÆÎ»£¬0±íʾд£¬1±íʾ¶Á */ MAX30102_IIC_Send_Byte(max30102_WR_address | I2C_WR); /* ´Ë´¦ÊÇдָÁî */ /* µÚ3²½£º·¢ËÍACK */ if (MAX30102_IIC_Wait_Ack() != 0) { goto cmd_fail; /* EEPROMÆ÷¼þÎÞÓ¦´ð */ } /* µÚ4²½£º·¢ËÍ×Ö½ÚµØÖ· */ MAX30102_IIC_Send_Byte(Register_Address); if (MAX30102_IIC_Wait_Ack() != 0) { goto cmd_fail; /* EEPROMÆ÷¼þÎÞÓ¦´ð */ } /* µÚ5²½£º¿ªÊ¼Ð´ÈëÊý¾Ý */ MAX30102_IIC_Send_Byte(Word_Data); /* µÚ6²½£º·¢ËÍACK */ if (MAX30102_IIC_Wait_Ack() != 0) { goto cmd_fail; /* EEPROMÆ÷¼þÎÞÓ¦´ð */ } /* ·¢ËÍI2C×ÜÏßÍ£Ö¹ÐźŠ*/ MAX30102_IIC_Stop(); return 1; /* Ö´Ðгɹ¦ */ cmd_fail: /* ÃüÁîÖ´ÐÐʧ°Üºó£¬ÇмǷ¢ËÍÍ£Ö¹Ðźţ¬±ÜÃâÓ°ÏìI2C×ÜÏßÉÏÆäËûÉ豸 */ /* ·¢ËÍI2C×ÜÏßÍ£Ö¹ÐźŠ*/ MAX30102_IIC_Stop(); return 0; } u8 max30102_Bus_Read(u8 Register_Address) { u8 data; /* µÚ1²½£º·¢ÆðI2C×ÜÏ߯ô¶¯ÐźŠ*/ MAX30102_IIC_Start(); /* µÚ2²½£º·¢Æð¿ØÖÆ×Ö½Ú£¬¸ß7bitÊǵØÖ·£¬bit0ÊǶÁд¿ØÖÆÎ»£¬0±íʾд£¬1±íʾ¶Á */ MAX30102_IIC_Send_Byte(max30102_WR_address | I2C_WR); /* ´Ë´¦ÊÇдָÁî */ /* µÚ3²½£º·¢ËÍACK */ if (MAX30102_IIC_Wait_Ack() != 0) { goto cmd_fail; /* EEPROMÆ÷¼þÎÞÓ¦´ð */ } /* µÚ4²½£º·¢ËÍ×Ö½ÚµØÖ·£¬ */ MAX30102_IIC_Send_Byte((uint8_t)Register_Address); if (MAX30102_IIC_Wait_Ack() != 0) { goto cmd_fail; /* EEPROMÆ÷¼þÎÞÓ¦´ð */ } /* µÚ6²½£ºÖØÐÂÆô¶¯I2C×ÜÏß¡£ÏÂÃæ¿ªÊ¼¶ÁÈ¡Êý¾Ý */ MAX30102_IIC_Start(); /
03-11
<think>好的,我现在需要帮助用户解决关于MAX30102心率血氧传感器STM32F103C8T6单片机通过I2C通信的代码实现及调试方法的问题。首先,我得回忆一下MAX30102的基本工作原理和I2C通信的基本配置。MAX30102是一款集成式传感器,能够测量心率血氧饱和度,通常通过I2C接口与微控制器通信。STM32F103C8T6属于中容量产品,所以可能需要配置相应的宏定义,比如STM32F10X_MD,这点用户之前的引用中有提到[^2]。 接下来,我需要考虑如何配置STM32的I2C外设。用户可能使用的是HAL或者标准外设,但根据用户提供的参考代码,他们可能更熟悉Arduino IDE的环境,所以可能需要使用相关的函数。例如,在Arduino框架中,可以使用Wire来进行I2C通信。 然后,代码实现部分需要包括初始化I2C、配置MAX30102的寄存器,比如设置采样率、LED脉冲宽度和电流等参数。同时,读取数据时需要注意传感器的数据格式,通常是18位或19位的补码形式,需要进行相应的转换。 调试方法方面,用户可能需要使用串口输出调试信息,参考他们之前提到的串口调试示例代码[^1]。此外,逻辑分析仪或示波器检查I2C信号是否正常,以及确保传感器的电源和接线正确也是关键步骤。 还需要注意用户可能遇到的常见问题,比如I2C地址是否正确(MAX30102的默认地址是0x57),上拉电阻是否接好,以及是否有足够的电源供应。此外,代码中的延时是否足够,确保传感器有足够时间进行测量。 最后,生成相关问题时要围绕用户的需求,可能涉及代码优化、数据处理算法、低功耗设计等。确保回答结构清晰,分步骤说明,并引用用户提供的参考资料,如配置宏定义和串口调试的部分。</think>### MAX30102STM32F103C8T6的I2C通信实现 #### 1. 硬件连接与配置 - **I2C引脚连接**:将MAX30102的SDA接STM32的PB7,SCL接PB6(默认I2C1引脚)。 - **电源与中断**:确保MAX30102的VCC接3.3V,INT引脚可接至STM32的外部中断引脚(如PA0)。 #### 2. I2C初始化代码(基于HAL) ```c #include "stm32f1xx_hal.h" I2C_HandleTypeDef hi2c1; void I2C1_Init(void) { hi2c1.Instance = I2C1; hi2c1.Init.ClockSpeed = 400000; // 400kHz标准模式 hi2c1.Init.DutyCycle = I2C_DUTYCYCLE_2; hi2c1.Init.OwnAddress1 = 0; hi2c1.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT; HAL_I2C_Init(&hi2c1); } ``` #### 3. MAX30102寄存器配置 ```c #define MAX30102_ADDR 0x57 << 1 // I2C地址左移1位 // 配置传感器参数 void MAX30102_Config(void) { uint8_t config_data[] = { 0x09, // FIFO配置寄存器: 启用滚动覆盖模式 0x4F, // 模式配置: 启用SPO2模式 0x27, // SPO2配置: 1600采样率,411us脉冲宽度 0xFF // LED电流控制: 最大电流(50mA) }; HAL_I2C_Mem_Write(&hi2c1, MAX30102_ADDR, 0x08, I2C_MEMADD_SIZE_8BIT, config_data, sizeof(config_data), 100); } ``` #### 4. 数据读取实现 ```c // 读取FIFO数据 void MAX30102_ReadData(uint32_t *red, uint32_t *ir) { uint8_t raw_data[6]; HAL_I2C_Mem_Read(&hi2c1, MAX30102_ADDR, 0x07, I2C_MEMADD_SIZE_8BIT, raw_data, 6, 100); *red = ((raw_data[0] << 16) | (raw_data[1] << 8) | raw_data[2]) & 0x03FFFF; *ir = ((raw_data[3] << 16) | (raw_data[4] << 8) | raw_data[5]) & 0x03FFFF; } ``` #### 5. 调试方法 1. **串口输出验证**(参考示例代码[^1]): ```c Serial.print("RED:"); Serial.println(*red); Serial.print("IR:"); Serial.println(*ir); ``` 2. **逻辑分析仪验证**:检查SCL/SDA波形是否符合I2C时序。 3. **寄存器回读**:通过读取配置寄存器值确认写入成功。
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值