基于STM32的心率采集器设计

张开发
2026/6/27 4:51:33 15 分钟阅读
基于STM32的心率采集器设计
一、系统概述与核心功能1. 系统定位基于STM32的心率采集器以“光电信号采集-生物电信号处理-心率算法-低功耗交互”为核心实现非侵入式心率监测PPG光电容积法或ECG心电信号法支持实时显示、异常报警、数据存储与蓝牙传输适用于个人健康管理、运动监测、医疗辅助等场景。2. 核心功能模块模块功能描述信号采集MAX30102PPG光电传感器红光/红外LED或AD8232ECG心电传感器采集生理信号信号处理数字滤波带通/陷波、基线漂移校正、运动伪影消除、峰值检测心率计算实时计算BPMBeats Per Minute支持静息/运动模式自适应算法数据显示OLED屏实时显示心率值、波形、电池电量支持历史数据查看数据传输蓝牙BLECC2541/DA14531传输至手机APP支持云同步可选Wi-Fi用户交互触摸按键开始/停止/切换界面、振动马达异常心率报警、LED状态指示数据存储存储24小时心率数据时间戳心率值支持断点续传低功耗设计无操作时进入STOP模式传感器间歇工作续航≥7天200mAh锂电池二、硬件设计方案1. 核心硬件选型模块型号关键参数接口方式主控MCUSTM32L432KC80MHz Cortex-M4超低功耗运行100μA/MHz256KB Flash支持USB和DFU升级核心控制器心率传感器MAX30102PPG集成红光660nm/红外880nmLED16位ADCI2C接口支持心率血氧检测I2C1PB6SCLPB7SDA备用传感器AD8232ECG单导联心电集成右腿驱动RLD输出模拟信号需ADC采集ADC1_IN0PA0显示模块OLED 12864I2C0.96寸128×64像素自发光低功耗10mA支持图形显示I2C1复用总线地址0x3C蓝牙模块DA14531BLE5.1超低功耗传输距离30m支持OTA升级与手机APP通信UART1PA9TXPA10RX存储模块AT24C256EEPROM256Kb32KBI2C接口存储历史数据时间心率值I2C1复用总线地址0x50交互模块触摸按键×2振动马达触摸按键CAP1188低功耗振动马达心率异常报警I2C2PC0-PC1 GPIOPC2电源模块200mAh锂电池TP40563.7V锂电池TP4056充电5V Micro USBXC6206稳压至3.3V双电源供电锂电池USB2. 硬件电路设计要点2.1 核心电路连接STM32L432最小系统8MHz外部晶振32.768kHz RTC晶振低功耗计时SWD调试接口PA13/PA14复位电路10kΩ上拉0.1μF电容。MAX30102传感器VCC3.3VSCLPB6SDAPB7I2C14.7kΩ上拉电阻INT引脚PB0中断输出数据就绪。AD8232心电传感器VCC3.3VOUTPUTPA0ADC1_IN0LODPB1导联脱落检测RLDPB2右腿驱动。2.2 抗干扰设计传感器屏蔽MAX30102加装黑色硅胶遮光罩避免环境光干扰。模拟地与数字地隔离AD8232的AGND与STM32的DGND通过0Ω电阻单点连接。电源滤波传感器电源输入端并联10μF钽电容0.1μF瓷片电容滤除纹波。三、软件设计与核心代码1. 系统架构FreeRTOS多任务调度采用FreeRTOS实时操作系统划分6个核心任务优先级从高到低传感器采集任务优先级5通过I2C/ADC读取生理信号初步滤波后发送至队列。信号处理任务优先级4带通滤波0.5~3Hz、基线漂移校正、运动伪影消除。心率计算任务优先级3峰值检测、BPM计算、信号质量评估。显示更新任务优先级2更新OLED显示心率值、波形、电池电量。蓝牙传输任务优先级2打包数据并通过BLE发送至手机APP。低功耗管理任务优先级1无操作超时检测关闭外设进入STOP模式。2. 核心代码实现基于HAL库2.1 MAX30102驱动I2C通信#includemax30102.h#includei2c.h// MAX30102寄存器地址#defineMAX30102_INT_STATUS0x00#defineMAX30102_FIFO_WR_PTR0x04#defineMAX30102_FIFO_DATA0x07#defineMAX30102_MODE_CONFIG0x09#defineMAX30102_SPO2_CONFIG0x0A#defineMAX30102_LED_CONFIG0x0C// 初始化MAX30102uint8_tMAX30102_Init(void){uint8_tpart_id;HAL_I2C_Mem_Read(hi2c1,0x571,0xFF,1,part_id,1,100);if(part_id!0x15)return1;// 器件ID错误// 配置SpO2模式100Hz采样率16位分辨率MAX30102_WriteReg(MAX30102_MODE_CONFIG,0x03);// SpO2模式MAX30102_WriteReg(MAX30102_SPO2_CONFIG,0x27);// 100Hz411μs脉冲宽度MAX30102_WriteReg(MAX30102_LED_CONFIG,0x24);// 红光/红外LED电流7.6mAreturn0;}// 读取FIFO数据红光红外voidMAX30102_ReadFIFO(uint32_t*red,uint32_t*ir){uint8_tfifo_data[6];HAL_I2C_Mem_Read(hi2c1,0x571,MAX30102_FIFO_DATA,1,fifo_data,6,100);*red((uint32_t)fifo_data[0]16)|((uint32_t)fifo_data[1]8)|fifo_data[2];*ir((uint32_t)fifo_data[3]16)|((uint32_t)fifo_data[4]8)|fifo_data[5];*red0x3FFFFF;// 24位有效数据*ir0x3FFFFF;}2.2 心率计算算法峰值检测#includeheart_rate.h// 心率上下文typedefstruct{uint32_tbuffer[100];// 数据缓冲区uint8_tidx;// 缓冲区索引uint32_tlast_peak_time;// 上次峰值时间msuint8_tpeak_count;// 峰值计数uint32_thr_sum;// 心率总和}HR_Context_t;HR_Context_t hr_ctx;// 带通滤波0.5~3Hz对应30~180BPMuint32_tBandPass_Filter(uint32_tinput){staticuint32_tprev_input0,prev_output0;floatalpha0.1;// 滤波系数uint32_toutputalpha*input(1-alpha)*prev_output;prev_inputinput;prev_outputoutput;returnoutput;}// 峰值检测uint8_tPeak_Detect(uint32_tcurrent,uint32_tthreshold){staticuint8_tpeak_found0;if(currentthreshold!peak_found){peak_found1;return1;// 检测到峰值}if(currentthreshold*0.8peak_found){peak_found0;// 峰值结束}return0;}// 计算心率BPMuint8_tCalculate_HeartRate(uint32_tred_value){uint32_tfilteredBandPass_Filter(red_value);uint32_tthresholdfiltered*0.8;// 动态阈值if(Peak_Detect(filtered,threshold)){uint32_tcurrent_timeHAL_GetTick();if(hr_ctx.last_peak_time!0){uint32_tintervalcurrent_time-hr_ctx.last_peak_time;if(interval333interval2000){// 30~180BPMuint8_thr60000/interval;hr_ctx.hr_sumhr;hr_ctx.peak_count;}}hr_ctx.last_peak_timecurrent_time;}if(hr_ctx.peak_count5){// 累计5个峰值计算平均uint8_tavg_hrhr_ctx.hr_sum/hr_ctx.peak_count;hr_ctx.peak_count0;hr_ctx.hr_sum0;returnavg_hr;}return0;// 数据不足}2.3 蓝牙传输BLE AT指令#includeble.h// 初始化DA14531voidBLE_Init(void){charcmd[50];sprintf(cmd,ATNAMEHR_Monitor\r\n);HAL_UART_Transmit(huart1,(uint8_t*)cmd,strlen(cmd),100);HAL_Delay(100);sprintf(cmd,ATADVINT1600\r\n);// 广播间隔1sHAL_UART_Transmit(huart1,(uint8_t*)cmd,strlen(cmd),100);HAL_Delay(100);sprintf(cmd,ATSTART\r\n);// 开始广播HAL_UART_Transmit(huart1,(uint8_t*)cmd,strlen(cmd),100);}// 发送心率数据voidBLE_SendData(uint8_thr,uint8_tspo2){chardata[20];sprintf(data,{\hr\:%d,\spo2\:%d},hr,spo2);HAL_UART_Transmit(huart1,(uint8_t*)data,strlen(data),100);}2.4 主程序框架FreeRTOS任务#includestm32l4xx_hal.h#includeFreeRTOS.h#includetask.hintmain(void){HAL_Init();SystemClock_Config();// 80MHz// 初始化外设MX_I2C1_Init();// MAX30102/OLED/EEPROMMX_USART1_UART_Init();// BLEMX_ADC1_Init();// AD8232 ECG可选// 初始化模块MAX30102_Init();OLED_Init();BLE_Init();// 创建任务xTaskCreate(Sensor_Task,Sensor,256,NULL,5,NULL);xTaskCreate(HR_Calc_Task,HR_Calc,512,NULL,4,NULL);xTaskCreate(Display_Task,Display,256,NULL,3,NULL);xTaskCreate(BLE_Task,BLE,256,NULL,2,NULL);xTaskCreate(LowPower_Task,LowPower,128,NULL,1,NULL);vTaskStartScheduler();while(1);}参考代码 基于STM32的心率采集器设计www.youwenfan.com/contentcst/133636.html四、关键技术与优化1. 心率算法优化自适应阈值根据信号幅度动态调整峰值检测阈值适应不同肤色/佩戴松紧度。运动伪影消除结合加速度传感器可选检测运动状态运动时暂停心率计算或切换至ECG模式。信号质量评估计算信噪比SNR信号质量差时提示用户重新佩戴。2. 低功耗设计动态采样率静止时50Hz采样运动时100Hz采样降低平均功耗。中断唤醒MAX30102数据就绪中断唤醒MCU避免轮询功耗。模块分时供电OLED/蓝牙/振动马达不用时断电通过MOS管控制。3. 用户体验优化佩戴检测通过红外LED反射值判断佩戴状态未佩戴时停止测量。异常报警心率120BPM或50BPM时触发振动马达屏幕闪烁。数据同步支持与手机APP同步历史数据生成24小时趋势图。五、系统调试与扩展1. 调试步骤阶段操作工具硬件调试测量传感器供电3.3V、I2C信号质量万用表、示波器SCL/SDA波形信号测试采集静息/运动状态下的原始信号验证波形串口打印数据MATLAB/Python分析算法验证对比专业心率带计算误差率目标±3BPM心率带、秒表计时验证功耗测试测量运行/待机/STOP模式下的电流万用表串联在电源回路2. 扩展功能血氧监测利用MAX30102的红光/红外比值计算SpO2血氧饱和度。心电监测集成AD8232实现单导联ECG检测心律失常。云同步添加Wi-Fi模块ESP8266数据上传至云平台如OneNET。AI分析通过机器学习算法识别异常心率模式如房颤预警。六、总结基于STM32的心率采集器通过MAX30102光电传感器实现非侵入式监测自适应滤波峰值检测算法确保准确性蓝牙BLE实现无线传输超低功耗设计保障7天续航。开发建议优先调试MAX30102的I2C通信确保原始信号稳定。心率算法需大量临床数据验证建议覆盖不同年龄、肤色、运动状态。低功耗是穿戴设备的核心竞争力需从硬件选型到软件策略全面优化。

更多文章