超低功耗血压和心率监护仪参考设计
一、系统概述
基于超低功耗微控制器与低功耗传感器,实现连续/定时血压(示波法) 和心率(PPG光电法) 监测,支持本地存储、异常报警与低频次无线传输,适用于家庭监护、慢病管理、远程医疗等场景。系统通过动态电源管理、算法轻量化、外设休眠等技术,实现续航>30天(200mAh锂电池) 的超低功耗目标。
二、硬件设计
1. 核心硬件选型
| 模块 | 型号/参数 | 功耗 | 功能 |
|---|---|---|---|
| 主控 | STM32L051C8T6(Cortex-M0+,32MHz,64KB Flash,8KB RAM) | 运行:<4mA,Stop模式:<1μA | 传感器控制、信号处理、低功耗管理 |
| 心率传感器 | MAX30102(PPG,I2C,1.8-3.3V) | 测量:<1mA,休眠:<0.1μA | 采集指尖/手腕光电容积脉搏波 |
| 血压传感器 | MPX5050DP(压力传感器,0-50kPa,模拟输出) | 测量:<2mA,待机:<10μA | 袖带压力检测(示波法) |
| 袖带驱动 | 微型气泵(5V/100mA)+ 电磁阀(5V/50mA) | 充气:100mA(2s),放气:5mA(5s) | 控制袖带充放气 |
| 通信 | nRF52810(BLE 5.0,2.4GHz) | 传输:<5mA,休眠:<1μA | 低频次传输数据至手机APP |
| 电源 | 3.7V/200mAh锂电池 + TPS62740(DC-DC,效率95%) | 系统平均电流<2mA | 供电与充电管理(支持USB充电) |
2. 系统架构
3. 低功耗设计要点
-
动态电压调节:STM32L051支持1.8V/2.1V/2.4V/2.7V/3.0V/3.3V多电压域,空闲时降为1.8V;
-
外设分时供电:气泵/电磁阀仅在血压测量时供电,平时通过MOS管切断;
-
传感器休眠:MAX30102配置为“Shutdown模式”(电流<0.1μA),MPX5050DP关闭激励电源;
-
MCU低功耗模式:非采集时进入Stop模式(RTC唤醒,电流<1μA),采集时进入Run模式(32MHz,4mA)。
三、软件设计(C语言实现)
1. 主程序流程
#include "stm32l0xx_hal.h"
#include "max30102.h"
#include "mpx5050.h"
#include "ble.h"
#include "lowpower.h"
// 系统状态
typedef struct {
uint8_t is_measuring; // 测量标志(0:待机, 1:心率, 2:血压)
uint8_t hr_valid; // 心率有效标志
uint8_t bp_valid; // 血压有效标志
float heart_rate; // 心率(bpm)
float systolic; // 收缩压(mmHg)
float diastolic; // 舒张压(mmHg)
uint8_t alarm_flag; // 异常报警标志
} SystemState;
int main(void) {
// 1. 初始化(低功耗配置)
HAL_Init();
SystemClock_Config(); // 32.768kHz LSE,主频2MHz(低功耗模式)
Periph_Init(); // GPIO、I2C、ADC、RTC初始化
MAX30102_Init(); // PPG传感器初始化(休眠模式)
MPX5050_Init(); // 压力传感器初始化(待机模式)
BLE_Init(); // BLE模块初始化(休眠模式)
LowPower_Init(); // 低功耗管理初始化(RTC定时唤醒)
SystemState sys_state = {0};
sys_state.is_measuring = 0;
// 2. 主循环(低功耗模式)
while (1) {
if (sys_state.is_measuring) {
// 2.1 心率测量(PPG)
if (sys_state.is_measuring == 1) {
sys_state.heart_rate = Measure_HeartRate();
sys_state.hr_valid = 1;
}
// 2.2 血压测量(示波法)
else if (sys_state.is_measuring == 2) {
Measure_BloodPressure(&sys_state.systolic, &sys_state.diastolic);
sys_state.bp_valid = 1;
}
// 2.3 异常判断与报警
Check_Abnormal(&sys_state);
// 2.4 存储/传输数据
Save_Data(&sys_state);
BLE_Send_Data(&sys_state);
// 2.5 返回待机模式
sys_state.is_measuring = 0;
Enter_Stop_Mode(); // 进入Stop模式
} else {
// 3. 待机模式(RTC定时唤醒,每5分钟采集1次)
Enter_Stop_Mode();
}
}
}
2. 关键模块实现
(1)心率测量(PPG+峰值检测,C语言)
原理:MAX30102采集PPG信号,经滤波后检测峰值,计算RR间期(两次心跳间隔),换算为心率。
// 心率测量(返回bpm)
float Measure_HeartRate(void) {
#define SAMPLE_RATE 25 // 采样率25Hz
#define BUFFER_SIZE 100 // 4秒数据(25×4=100点)
uint16_t ppg_buffer[BUFFER_SIZE];
float hr = 0.0f;
// 1. 配置MAX30102(低功耗模式)
MAX30102_WriteReg(REG_MODE_CONFIG, 0x03); // SpO2模式
MAX30102_WriteReg(REG_SPO2_CONFIG, 0x27); // 25Hz采样,400μs脉宽
MAX30102_WriteReg(REG_LED1_PA, 0x24); // 红光7mA
// 2. 采集4秒数据(100点)
for (int i=0; i<BUFFER_SIZE; i++) {
ppg_buffer[i] = MAX30102_ReadFIFO(); // 读取FIFO(18位数据)
HAL_Delay(40); // 25Hz=40ms/点
}
// 3. 数字滤波(移动平均+中值滤波)
float filtered[BUFFER_SIZE];
for (int i=0; i<BUFFER_SIZE; i++) {
filtered[i] = MovingAverage(ppg_buffer, i, 5); // 5点移动平均
}
// 4. 峰值检测(找QRS波)
uint16_t peak_indices[10];
uint8_t peak_count = 0;
for (int i=1; i<BUFFER_SIZE-1; i++) {
if (filtered[i] > filtered[i-1] && filtered[i] > filtered[i+1] && filtered[i] > 1000) { // 阈值
peak_indices[peak_count++] = i;
}
}
// 5. 计算心率(bpm=60/(平均RR间期))
if (peak_count >= 2) {
float avg_rr = 0.0f;
for (int i=1; i<peak_count; i++) {
avg_rr += (peak_indices[i] - peak_indices[i-1]) * 0.04f; // 间隔(秒)=点数×0.04s
}
avg_rr /= (peak_count - 1);
hr = 60.0f / avg_rr;
}
// 6. 关闭传感器(休眠模式)
MAX30102_WriteReg(REG_MODE_CONFIG, 0x80); // Shutdown模式
return hr;
}
(2)血压测量(示波法+特征点提取,C语言)
原理:袖带充气至180mmHg,缓慢放气,通过MPX5050DP检测压力振荡波,提取平均压(MAP)、收缩压(SYS)、舒张压(DIA)。
// 血压测量(输出收缩压、舒张压,单位mmHg)
void Measure_BloodPressure(float* sys, float* dia) {
#define MAX_PRESSURE 180 // 最大充气压力(mmHg)
#define MIN_PRESSURE 40 // 最小放气压力(mmHg)
#define SAMPLE_RATE 100 // 放气采样率(Hz)
uint16_t pressure_buffer[200]; // 2秒数据(100×0.02=2s)
float map = 0.0f, sys = 0.0f, dia = 0.0f;
// 1. 袖带充气(气泵工作2秒,至180mmHg)
Pump_On();
while (MPX5050_Read() < MAX_PRESSURE * 10); // 压力单位:0.1kPa(1mmHg≈0.133kPa)
Pump_Off();
Valve_Close();
// 2. 缓慢放气(电磁阀半开,0.2s/mmHg)
Valve_HalfOpen();
for (int i=0; i<200; i++) { // 2秒放气(200点)
pressure_buffer[i] = MPX5050_Read(); // 读取压力(0.1kPa)
HAL_Delay(10); // 10ms/点(100Hz)
}
Valve_Open(); // 完全放气
// 3. 提取振荡波特征点(示波法)
// 3.1 找平均压(MAP,振荡波最大幅值点)
uint16_t max_amp = 0, map_index = 0;
for (int i=0; i<200; i++) {
if (pressure_buffer[i] > max_amp) {
max_amp = pressure_buffer[i];
map_index = i;
}
}
map = max_amp * 0.133f; // 0.1kPa→mmHg(1kPa≈7.5mmHg,0.1kPa≈0.75mmHg?修正:1mmHg=133.322Pa,0.1kPa=100Pa≈0.75mmHg,故map=压力值×0.75)
// 3.2 找收缩压(SYS,MAP前振荡波幅值30%点)
for (int i=0; i<map_index; i++) {
if (pressure_buffer[i] > max_amp * 0.3f) {
sys = pressure_buffer[i] * 0.75f;
break;
}
}
// 3.3 找舒张压(DIA,MAP后振荡波幅值30%点)
for (int i=map_index; i<200; i++) {
if (pressure_buffer[i] < max_amp * 0.3f) {
dia = pressure_buffer[i] * 0.75f;
break;
}
}
*sys = sys;
*dia = dia;
}
(3)低功耗管理(C语言)
核心:通过RTC定时唤醒(每5分钟),平时进入Stop模式,关闭非必要外设。
// 进入Stop模式(RTC唤醒,5分钟后)
void Enter_Stop_Mode(void) {
// 1. 配置RTC(5分钟=300秒)
RTC_AlarmConfig(300); // 设置闹钟唤醒
// 2. 关闭外设时钟(保留RTC、IWDG)
RCC->AHBENR &= ~(RCC_AHBENR_GPIOAEN | RCC_AHBENR_GPIOBEN);
RCC->APB1ENR &= ~(RCC_APB1ENR_I2C1EN | RCC_APB1ENR_SPI1EN);
RCC->APB2ENR &= ~(RCC_APB2ENR_USART1EN);
// 3. 进入Stop模式(低功耗调压器)
HAL_PWR_EnterSTOPMode(PWR_LOWPOWERREGULATOR_ON, PWR_STOPENTRY_WFI);
// 4. 唤醒后恢复系统时钟
SystemClock_Config(); // 恢复2MHz主频
Periph_Init(); // 恢复外设时钟
}
参考代码 超低功耗血压和心率监护仪参考设计 www.youwenfan.com/contentcns/160981.html
四、系统测试与优化
1. 功耗测试(200mAh锂电池)
| 状态 | 电流(mA) | 时间占比 | 日均耗电(mAh) |
|---|---|---|---|
| 待机(Stop模式) | 0.001 | 99% | 0.24 |
| 心率测量 | 4.0 | 0.5% | 0.48 |
| 血压测量 | 10.0 | 0.5% | 1.2 |
| BLE传输 | 5.0 | 0.1% | 0.12 |
| 总计 | - | 100% | 2.04 |
续航时间:200mAh / 2.04mAh/天 ≈ 98天(实际因电池自放电,约30-60天)。
2. 优化方向
-
算法轻量化:用定点数替代浮点数(如压力值用整数存储,单位0.1mmHg),减少计算量;
-
传感器采样率:心率采样率从25Hz降至10Hz(足够检测),降低MAX30102功耗;
-
BLE传输优化:仅异常时传输(如血压>140/90mmHg),减少通信时间;
-
能量 harvesting:增加微型太阳能板(5V/1mA),补充电池电量。
五、总结
通过低功耗硬件选型(STM32L0+MAX30102+MPX5050)、动态电源管理(外设分时供电、MCU低功耗模式)、轻量化算法(PPG峰值检测、示波法特征提取),实现了超低功耗血压和心率监护仪,续航>30天,满足家庭/远程监护需求。系统可扩展多用户管理、云端存储功能,为慢病管理提供低成本、高可靠解决方案。

浙公网安备 33010602011771号