本帖最后由 nemo1991 于 2016-3-5 20:39 编辑
时间好快,开学之初看到论坛F7的活动决心参加,到此时完成比赛历时三个月,我也买好一个月后的车票等待回家,心里微微感叹着一学期又过去了。总体来说本次参赛对自己有相当的挑战,也有很大收获。
回顾比赛,虽不完美,但我们已经尽力做到最好,实现了设想的大部分功能。总结如下,欢迎大家批评指正。
设计名称:反射式血氧心率信号采集及监护记录系统
最终实现功能:
1. 完成血氧信息的采集,可以计算出人体血氧含量的百分比值;
2. 结合心跳周期内的光吸收率变化,可以提取正相关于心脏脉动的波形,进而提取心率值;
3. 结合F7板卡自带显示屏,可以将血氧心率数据显示在街面上,同时显示心跳的脉动波形;可以进行显示框拖动等简单交互;
4. 数据可以存储到SD卡中,便于后期分析;同时可以将心率血氧等信息通过串口发送到PC端。
以下将对作品背景及设计思路进行完整介绍。
项目简介:
血氧饱和度是人体重要的健康,其为氧合血红蛋白占总蛋白的百分比,对于新生儿、孕妇和老年人等具有重要意义。同时,结合血氧脉冲变化,可以获知另外一个重要参数——心率。本设计通过使用STM32F7处理器与专业级血氧模拟前端方案,DCM03作为光学传感器,结合数字信号处理算法,最终实现了具有高精度与高性能的血氧心率监测功能。同时结合板卡自带显示器、虚拟串口和SD卡等,本设计还具有良好的人机界面和数据存储功能。
设计背景:
血氧饱和度作为人体第五大重要的生理健康指标,能反映人体呼吸功能以及含氧量,对于新生儿、孕妇以及老人的健康监护有着重要的作用。而随着近年来的空气质量的下降,这个指标变得越来越受到重视。通常情况下,人体血氧量的监控是通过血氧仪来实现的。通过测量氧气水平和心率,血氧仪可以在低于预设水平时发出警报声。血氧仪可以用于对运动健康提供科学参考和心脏病、高血压等患者的健康监护仪器。目前市场上专业级血氧仪通常价格高昂,而消费级产品则精度较低,难以保证实用性。
因此,本文设计了基于STM32F746和专业模拟前端的高性能便携式的血氧仪,使用DCM03作为光传感器。实现了方便携带、快速测量,安全报警以及便携存储等一系列功能。
理论基础:
血氧含量,定义为氧合血红蛋白水平和总的血红蛋白水平(包含含氧和贫氧血红蛋白)的比例,即身体组织对光吸收总量的不同依赖于身体组织的氧含量,所以,身体的含氧量可以通过先测量两种频率的光分别通过身体后的强度,再计算这两个强度间的比率得到,具体如下:
本次设计采用的两种频率的光分别为波长为660nm的可见红光和波长为940nm的红外光,通过两个发光二极管交替闪烁,两种光分别通过人体,通过感光二极管接收反馈信号,进而达到分别测量的效果,测得数据后,计算公式如下:其中,lambda1和lambda2代表使用的两种光的波长。
在测量中有一个直流分量和一个交流分量。直流分量被看作是身体组织和静脉吸收的结果,交流分量是动脉吸收的结果。
光的吸收效果通过比对交流信号的吸收强度获得,这其中需要控制的是入射光的驱动强度需要保持一致。也就是说,透过人体后的光信号其中直流分量需要保持一致,应该将直流信号误差作为反馈信号设置在系统中。
设计难点:
1.基本信号的提取:DCM03传感器受到模拟前端的驱动可以发射不同波长的两种光,光经过人体反射后由DCM03中集成的感光二极管接收进而产生一个电流。该电流值的典型直流分量值为uA级别,相对微小。该电流信号需要经过一个跨导放大器转化为一个电压信号,运放的反馈电阻典型值为500kΩ。经过跨到放大器所获得的电压信号含有的直流分量约为1V,而其中含有的交流信号典型值仅有10mV。而控制信号强度的方法为控制发射光LED的驱动强度,这里的控制需要非常精细而准确。如果驱动强度过小,则导致所获得的电压信号过小而无法准确采样;如果驱动强度过大,则会导致通过跨导放大器的电压信号过大,而造成饱和使得信号无法采集。
2.放大电路的设计:由光电二极管产生的初始电流信号经过跨导放大器可以看作是第一级放大,之后,信号需要经过第二级放大以便于ADC采集。而需要注意的是,经过跨导放大器中的信号中包含直流分量和交流分量,其典型值分别为1V和10mV,因此不能直接放大,需要剔除之流信号后再进行放大。理想的放大方案为:差分放大器一端接入来自跨导放大器的信号,另一端接入该信号的直流分量,而放大器放大的只有该信号的交流值。
3.数字滤波器的设计:在第一个跨导放大器反馈电阻和反馈电容构成了一个RC模拟滤波器,除此之外,所有的滤波器均为数字滤波器。滤波器的设置包括:除去50/60Hz噪声的滤波器、滤出经过放大电路放大后信号的直流部分(用于设置二级放大电路中差分放大器的偏置值)、使用截至频率低至几赫兹的低通滤波器进一步提取所获得信号,差分运算得到最终所需要的交直流分量。
4.STM32处理器的使用,本次设计中,使用了该处理器的多种功能,如GPIO、定时器、IO中断、SPI、I2C、USART等多种功能。
5.AFE4400模拟前端的使用。该模拟前端为TI公司专业光学模拟前端,针对血氧应用设计。其内部结构相对复杂,在对血氧测量相对了解之后使用仍然有一定难度。其接口电路、电源设计、等均需要独立完成。寄存器设置等也相对复杂。
硬件设计:
本次设计中基于STM32F7板卡,系统使用了Arduino接口引出了全部控制线。
依照IO的分配,这里简要说明IO资源对用的功能。
GPIO:为系统的按键和LED指示功能;
I2C:驱动MPU9150(仅出于兴趣调试了代码,设计中未使用该模块);
SDIO:驱动SD卡,需要配合若干IO使用;
SPI:驱动AFE4400为核心的血氧探头,需要配合若干IO使用;
UASRT:通过仿真器向PC发送数据;
LCD控制器:驱动LCD进行显示;
原理图设计:
1.系统主板使用F7板卡,原理图官方提供;
2.血氧仪探头原理图
软件设计:
软件内容较为繁杂,这里把程序的主流程贴出来:
系统初始化流程:
系统中断流程图:
源代码部分:
针对各个模块的驱动,我们组全部写出了教程帖子,按照相应代码可以重现工作。但是基于STM32CUBE生成的工程文件很大,因此考虑整理后上传源代码。
关于个模块代码的详细说明:
进度贴:
nemo1991主要负责信号链设计,信号链设计包括初始信号采集和信号调理,从传感器得到的最初信号为一个光电流信号,调理放大等通过控制AFE4400实现。
首先看一下AFE4400的系统框图:
后期调理包括:
a:经过一个跨阻放大器转变为电压信号,跨阻放大器最终选择值为500K;
b:第二级放大电路设计,对初始电压信号进行第二级放大,该信号经过滤波后提供给ADC采集,放大过程中通过动态设置偏置电流去除共模电压,使之最佳地放大差模信号;
c:信号需要滤除50/60Hz干扰;
c:因为最终需要提取交流信号,需要使用高效直流滤波器对ADC采样值进行直流追踪,并最终减去直流获得交流值;
综合源代码见附件!
实物图:
最后,上一张最终作品的实物图!
视频观看地址:
观看密码:F72015
最后:
提供主芯片的datasheet以及血氧探头的设计原理图: