基于STM32的心率检测系统

举报
哥的时代 发表于 2023/12/23 10:36:22 2023/12/23
【摘要】 基于STM32和心率传感器(MAX30102)的心率检测系统成功地结合了硬件设计和软件实现,通过STM32开发板和心率传感器的协同工作,实现了对心率数据的准确采集和处理。系统中引入了移动平均滤波算法,有效地平滑了心率数据,提高了数据的可靠性。

设计概要:

硬件部分:

1、硬件平台选择:

使用STM32系列。

集成心率传感器,使用MAX30102传感器。

2、连接和电源:

将STM32与心率传感器连接,确保正确的引脚连接。

为STM32和传感器提供适当的电源。

软件部分:

1、开发环境设置:

安装STM32CubeMX和相应的编译器,本文使用STM32CubeIDE。

2、STM32初始化:

使用STM32CubeMX配置GPIO、时钟等。

初始化UART通信,以便与计算机进行通信。

3、心率传感器初始化:

配置I2C通信,初始化MAX30102传感器。

设置传感器工作模式和采样率。

4、数据采集:

在主循环中读取心率传感器的数据。

处理传感器输出,提取心率相关的数据。

5、心率算法:

实现心率检测算法,使用移动平均滤波算法。

根据传感器输出计算心率。

6、数据传输:

将检测到的心率数据通过UART传输到计算机。

代码演示

main.c代码演示:

#include "main.h"
#include "MAX30102.h" // 心率传感器驱动
UART_HandleTypeDef huart2;
I2C_HandleTypeDef hi2c1;
void SystemClock_Config(void);
int main(void) {
    HAL_Init();
    SystemClock_Config();
    MX_GPIO_Init();
    MX_USART2_UART_Init();
    MX_I2C1_Init();
    MAX30102_Init(&hi2c1);
    while (1) {
        // 读取心率传感器数据
        uint32_t heartRate = MAX30102_ReadHeartRate();
        // 将心率数据发送到计算机或其他设备
        char buffer[20];
        sprintf(buffer, "Heart Rate: %d\r\n", heartRate);
        HAL_UART_Transmit(&huart2, (uint8_t *)buffer, strlen(buffer), HAL_MAX_DELAY);
        HAL_Delay(1000); // 延时1秒
    }
}
void SystemClock_Config(void) {
    RCC_OscInitTypeDef RCC_OscInitStruct = {0};
    RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
    __HAL_RCC_PWR_CLK_ENABLE();
    __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);
    RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
    RCC_OscInitStruct.HSEState = RCC_HSE_ON;
    RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
    RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
    RCC_OscInitStruct.PLL.PLLM = 8;
    RCC_OscInitStruct.PLL.PLLN = 336;
    RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2;
    RCC_OscInitStruct.PLL.PLLQ = 4;
    if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) {
        Error_Handler();
    }
    RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2;
    RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
    RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
    RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV4;
    RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV2;
    if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_5) != HAL_OK) {
        Error_Handler();
    }
}

MAX30102.h代码演示:

#ifndef __MAX30102_H
#define __MAX30102_H
#include "main.h"
void MAX30102_Init(I2C_HandleTypeDef *hi2c);
uint32_t MAX30102_ReadHeartRate(void);
#endif /* __MAX30102_H */

MAX30102.c代码演示:

#include "MAX30102.h"
#define MAX30102_I2C_ADDRESS 0xAE
// I2C寄存器地址定义
#define MAX30102_REG_MODE_CONFIG 0x09
#define MAX30102_REG_FIFO_DATA 0x07
// 移动平均滤波的缓冲区和参数
#define MOVING_AVERAGE_SIZE 5
uint32_t redMovingAverageBuffer[MOVING_AVERAGE_SIZE];
uint32_t redMovingAverageSum = 0;
uint8_t redMovingAverageIndex = 0;
void initMovingAverageBuffer(void) {
    for (uint8_t i = 0; i < MOVING_AVERAGE_SIZE; ++i) {
        redMovingAverageBuffer[i] = 0;
    }
}
uint32_t applyMovingAverage(uint32_t rawValue) {
    redMovingAverageSum -= redMovingAverageBuffer[redMovingAverageIndex];
    redMovingAverageBuffer[redMovingAverageIndex] = rawValue;
    redMovingAverageSum += rawValue;
    redMovingAverageIndex = (redMovingAverageIndex + 1) % MOVING_AVERAGE_SIZE;
    return redMovingAverageSum / MOVING_AVERAGE_SIZE;
}
void MAX30102_Init(I2C_HandleTypeDef *hi2c) {
    // MAX30102初始化代码
    // 配置工作模式
    uint8_t modeConfig = 0x02; // 配置为SpO2模式
    HAL_I2C_Mem_Write(hi2c, MAX30102_I2C_ADDRESS << 1, MAX30102_REG_MODE_CONFIG, I2C_MEMADD_SIZE_8BIT, &modeConfig, 1, HAL_MAX_DELAY);
    // 初始化移动平均滤波缓冲区
    initMovingAverageBuffer();
}
uint32_t MAX30102_ReadHeartRate(void) {
    // 读取心率数据的代码
    uint8_t data[3];
    HAL_I2C_Mem_Read(hi2c, MAX30102_I2C_ADDRESS << 1, MAX30102_REG_FIFO_DATA, I2C_MEMADD_SIZE_8BIT, data, sizeof(data), HAL_MAX_DELAY);
    // 解析数据
    uint32_t redValue = (data[0] << 16) | (data[1] << 8) | data[2];
    // 应用移动平均滤波
    uint32_t filteredRedValue = applyMovingAverage(redValue);
    return filteredRedValue; // 返回滤波后的心率值
}

在 MAX30102_Init 函数中初始化了移动平均滤波缓冲区,然后在MAX30102_ReadHeartRate 函数中应用了移动平均滤波算法。这样,你就可以在主程序中调用MAX30102_ReadHeartRate 来获取滤波后的心率值。

总结

基于STM32和心率传感器(MAX30102)的心率检测系统成功地结合了硬件设计和软件实现,通过STM32开发板和心率传感器的协同工作,实现了对心率数据的准确采集和处理。系统中引入了移动平均滤波算法,有效地平滑了心率数据,提高了数据的可靠性。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。