基于ATtiny85的脉搏血氧仪与光电容积描记器(PPG)设计

张开发
2026/4/3 22:39:50 15 分钟阅读
基于ATtiny85的脉搏血氧仪与光电容积描记器(PPG)设计
一、系统概述基于ATtiny85微控制器8位AVR架构8KB Flash512B RAM6个I/O口实现低成本、低功耗的脉搏血氧仪与光电容积描记器PPG。通过红光660nm与红外光940nmLED照射手指利用光敏传感器采集透射/反射光信号经信号调理、滤波、特征提取后计算心率HR 和血氧饱和度SpO2支持LED状态指示与低功耗待机适用于家用健康监测、运动生理研究等场景。二、系统架构与硬件设计1. 系统架构红光/红外光透射/反射光模拟信号信号处理结果结果供电供电供电手指LED发射器 红红外光敏传感器 光敏二极管ATtiny85 ADC采集心率/SpO2计算状态指示 LED低功耗待机电源 3V纽扣电池2. 核心硬件选型模块型号/参数功能主控ATtiny858MHz内部RC6I/O信号采集、滤波、心率/SpO2计算、低功耗管理LED发射器红光(660nm, 5mm)红外(940nm, 5mm)双波长光源照射手指采集PPG信号光敏传感器光敏二极管(BPW34响应光谱400-1100nm)将光信号转换为模拟电信号信号调理运放(LM358增益100)放大光敏信号mV级→V级适配ATtiny85 ADC状态指示双色LED(红绿)显示心率/SpO2状态正常/异常电源CR2032纽扣电池(3V, 220mAh)系统供电支持低功耗待机续航72小时3. 关键电路设计1LED驱动与光敏采集电路LED驱动ATtiny85的PB0/PB1PWM输出通过1kΩ限流电阻驱动红光/红外LED交替点亮避免串扰占空比50%频率1kHz光敏信号调理光敏二极管输出接LM358同相放大电路增益100倍输出经RC低通滤波1kΩ100nF截止频率1.6kHz后接入ATtiny85的PB3(ADC3)10位ADC参考电压3V。2低功耗设计电源管理纽扣电池经肖特基二极管(1N5819)降压至2.7V保护电池ATtiny85工作在1MHz低频模式降低功耗外设控制LED、运放仅在采集时供电通过PNP三极管控制VCC平时关闭电流1μA。三、软件设计C语言实现基于AVR-GCC1. 开发环境IDEAtmel Studio 7编译器AVR-GCC 5.4.0库AVR Libc标准库含ADC、PWM、睡眠模式函数关键外设10位ADCPB3、Timer0PWM生成、Timer1采集时序控制2. 主程序流程#includeavr/io.h#includeavr/interrupt.h#includeavr/sleep.h#includeutil/delay.h#includemath.h// 仅用整数运算替代浮点实际用定点数// 系统状态typedefstruct{uint8_tis_measuring;// 测量标志(0:待机,1:采集)uint16_tred_buffer[50];// 红光信号缓冲区(50点1秒50Hz)uint16_tir_buffer[50];// 红外信号缓冲区(50点)uint8_thr;// 心率(bpm)uint8_tspo2;// 血氧饱和度(%)}SystemState;intmain(void){// 1. 初始化SystemState sys_state{0};ADC_Init();// ADC初始化(PB3, 参考电压3V)PWM_Init();// PWM初始化(PB0红光, PB1红外, 1kHz)Timer1_Init();// Timer1初始化(50Hz采集频率)LED_Init();// 状态LED初始化(PB2红, PB4绿)// 2. 主循环低功耗待机定时采集while(1){if(sys_state.is_measuring){// 2.1 采集PPG信号红光红外各50点/秒共1秒Collect_PPG_Data(sys_state);// 2.2 信号处理滤波特征提取Filter_Signal(sys_state.red_buffer,50);// 移动平均滤波Filter_Signal(sys_state.ir_buffer,50);sys_state.hrCalculate_HR(sys_state.red_buffer,50);// 心率计算sys_state.spo2Calculate_SpO2(sys_state.red_buffer,sys_state.ir_buffer,50);// SpO2计算// 2.3 状态指示正常:绿灯闪, 异常:红灯闪if(sys_state.hr50sys_state.hr120sys_state.spo295){LED_Green_Blink(2,200);// 绿灯闪2次(200ms/次)}else{LED_Red_Blink(3,200);// 红灯闪3次(200ms/次)}// 2.4 进入低功耗待机(10秒后再次采集)sys_state.is_measuring0;Enter_Sleep_Mode(10);// 睡眠10秒}else{// 待机模式仅RTC唤醒Enter_Sleep_Mode(0);// 无限期睡眠直到定时唤醒}}}3. 关键模块实现1PPG信号采集ADCPWM驱动LED功能交替点亮红光/红外LED通过ADC采集光敏信号存储至缓冲区。// ADC初始化PB3ADC3参考电压3VvoidADC_Init(void){ADMUX(1REFS0)|(1MUX1)|(1MUX0);// VrefVcc(3V), ADC3(PB3)ADCSRA(1ADEN)|(1ADPS1)|(1ADPS0);// 使能ADC分频8(1MHz/8125kHz)}// PWM初始化Timer0PB0红光PB1红外1kHzvoidPWM_Init(void){TCCR0A(1WGM00)|(1WGM01)|(1COM0A1)|(1COM0B1);// 快速PWM非反相TCCR0B(1CS01);// 分频8(8MHz/8/2563.9kHz调整OCR0x128→1.95kHz接近1kHz)OCR0A128;// 红光PWM占空比50%OCR0B128;// 红外PWM占空比50%DDRB|(1PB0)|(1PB1);// PB0/PB1输出}// 采集PPG数据50点/秒共1秒voidCollect_PPG_Data(SystemState*state){for(uint8_ti0;i50;i){// 1. 采集红光信号PB0亮PB1灭PORTB~(1PB1);// 红外灭PORTB|(1PB0);// 红光亮_delay_us(100);// 稳定时间state-red_buffer[i]ADC_Read();// 读取ADC值(0-1023)PORTB~(1PB0);// 红光灭// 2. 采集红外信号PB1亮PB0灭PORTB|(1PB1);// 红外亮_delay_us(100);state-ir_buffer[i]ADC_Read();PORTB~(1PB1);// 红外灭_delay_ms(20);// 50Hz采集(1/5020ms/点)}}// ADC读取10位uint16_tADC_Read(void){ADCSRA|(1ADSC);// 启动转换while(ADCSRA(1ADSC));// 等待转换完成returnADC;// 返回10位结果(0-1023)}2信号滤波移动平均滤波去除噪声功能用5点移动平均滤波平滑PPG信号减少运动伪影。// 移动平均滤波输入缓冲区长度NvoidFilter_Signal(uint16_t*buffer,uint8_tlen){uint16_ttemp[50];for(uint8_ti2;ilen-2;i){// 边界不处理temp[i](buffer[i-2]buffer[i-1]buffer[i]buffer[i1]buffer[i2])/5;}memcpy(buffer,temp,len*2);// 复制回原缓冲区}3心率计算峰值检测法整数运算优化功能通过红光信号峰值检测计算相邻峰值间隔RR间期换算为心率bpm60/RR间期。// 计算心率输入红光信号缓冲区长度Nuint8_tCalculate_HR(uint16_t*buffer,uint8_tlen){#definePEAK_THRESHOLD30// 峰值阈值(相对基线)#defineMIN_INTERVAL20// 最小RR间期(20点0.4秒→150bpm)#defineMAX_INTERVAL100// 最大RR间期(100点2秒→30bpm)uint8_tpeak_count0;uint8_tlast_peak_idx0;uint16_tbaseline0;for(uint8_ti0;ilen;i)baselinebuffer[i];baseline/len;// 基线(平均信号)for(uint8_ti1;ilen-1;i){// 峰值条件大于邻点且超过阈值if(buffer[i]buffer[i-1]buffer[i]buffer[i1](buffer[i]-baseline)PEAK_THRESHOLD){if(peak_count0){last_peak_idxi;peak_count1;}else{uint8_tintervali-last_peak_idx;// 间隔(点)if(intervalMIN_INTERVALintervalMAX_INTERVAL){// 计算心率(bpm60/(interval*0.4s))→60 * 2.5/interval150/intervaluint8_thr150/interval;// 整数运算(0.4s/点1/2.5秒/点)if(hr30hr150)returnhr;// 有效范围}last_peak_idxi;}}}return0;// 无有效峰值}4血氧饱和度SpO2计算红光/红外AC/DC比值法原理SpO2与红光AC/DC和红外AC/DC比值的对数差线性相关公式SpO2110−25×(Rratio)SpO2110−25×(R_{ratio})SpO2110−25×(Rratio​)其中Rratio(ACred/DCred)(ACir/DCir)Rratio\frac{(ACred/DCred)}{(ACir/DCir)}Rratio(ACir/DCir)(ACred/DCred)​AC为交流分量DC为直流分量。实现用整数运算替代浮点缩放1000倍避免精度损失。// 计算SpO2输入红光/红外缓冲区长度Nuint8_tCalculate_SpO2(uint16_t*red,uint16_t*ir,uint8_tlen){// 1. 计算DC分量平均值uint16_tred_dc0,ir_dc0;for(uint8_ti0;ilen;i){red_dcred[i];ir_dcir[i];}red_dc/len;ir_dc/len;// 2. 计算AC分量峰峰值/2uint16_tred_max0,red_min1023,ir_max0,ir_min1023;for(uint8_ti0;ilen;i){if(red[i]red_max)red_maxred[i];if(red[i]red_min)red_minred[i];if(ir[i]ir_max)ir_maxir[i];if(ir[i]ir_min)ir_minir[i];}uint16_tred_ac(red_max-red_min)/2;uint16_tir_ac(ir_max-ir_min)/2;// 3. 计算R_ratio整数运算缩放1000倍uint32_tr_ratio((uint32_t)red_ac*ir_dc*1000)/((uint32_t)red_dc*ir_ac1);// 避免除0r_ratio/1000;// 还原比例// 4. 计算SpO2公式SpO2110-25*R_ratio整数优化uint8_tspo2110-(25*r_ratio)/100;// 25*r_ratio/1000.25*r_ratioif(spo2100)spo2100;if(spo270)spo20;// 无效值returnspo2;}5低功耗管理睡眠模式定时唤醒功能通过Timer1定时唤醒平时进入掉电模式Power-down电流1μA。// 进入睡眠模式sec0:无限期0:定时唤醒voidEnter_Sleep_Mode(uint8_tsec){if(sec0){// 配置Timer11秒中断CTC模式TCCR1B(1WGM12)|(1CS12)|(1CS10);// 分频1024(8MHz/10247812.5Hz)OCR1A7812;// 1秒中断(7812.5Hz/7812≈1Hz)TIMSK|(1OCIE1A);// 使能比较匹配中断}// 进入掉电模式set_sleep_mode(SLEEP_MODE_PWR_DOWN);sleep_enable();sei();// 允许中断sleep_cpu();// 进入睡眠sleep_disable();// 唤醒后执行if(sec0){TIMSK~(1OCIE1A);// 关闭Timer1中断}}// Timer1比较匹配中断1秒唤醒ISR(TIMER1_COMPA_vect){// 唤醒后标记需要采集数据externSystemState sys_state;sys_state.is_measuring1;}参考代码 ATtiny85脉搏血氧仪和光电容积描记器www.youwenfan.com/contentcss/161018.html四、系统测试与优化1. 测试指标参数指标测试方法心率测量范围50-120bpm静息状态对比医用ECG仪误差±5bpmSpO2测量范围90-100%正常范围对比指夹式血氧仪误差±2%采集时间1秒/次50点/秒示波器测量LED驱动与ADC采样时序待机功耗1μA掉电模式万用表串联测量电池电流续航时间72小时CR2032电池连续采集每小时1次记录电池电压2. 优化方向抗干扰增加硬件带通滤波0.5-5Hz覆盖心率频率软件用中值滤波替代移动平均低功耗LED驱动用低占空比10%间歇采集每10秒1次进一步降低平均电流算法轻量化用查表法替代除法如心率计算中的150/interval减少计算时间显示扩展增加0.96寸OLEDI2C接口需ATtiny85软件模拟I2C显示实时波形与数值。五、总结本设计基于ATtiny85实现了低成本、低功耗的脉搏血氧仪与PPG通过双波长LED光敏传感器采集信号移动平均滤波峰值检测AC/DC比值法计算心率/SpO2结合掉电模式定时唤醒实现长续航。

更多文章