ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

基于红外光电脉搏波的心率计课程设计:从模拟信号调理到单片机实现

基于红外光电脉搏波的心率计课程设计:从模拟信号调理到单片机实现 简介这是一份电子技术课程设计报告面向电子信息类本专科学生完整呈现基于红外光电传感器的红外线心率计设计实现。文档从设计目的、要求与指标切入给出系统设计框图并逐级展开检测、放大、滤波、整形、倍频、定时、计数、译码和显示等单元电路的设计与仿真覆盖电路原理、参数取值和波形分析。检测环节详细说明了TCRT5000红外传感器引脚判断与光电转换效率验证方法滤波电路采用低通方案抑制高频干扰倍频与定时电路配合实现30秒测出一分钟心率的目标最后还包含装配调试、结果分析及设计体会可作为课程设计报告撰写和电路综合训练的有力参考。包体为单个doc文档大小约595KB章节目录清晰便于按需查阅。已有181人浏览学习适合需要完成同类电子系统设计或了解光电脉搏测量原理的读者。1. 设计思路与整体方案1.1 心率测量的原理红外线心率计本质上是在做一个“光电脉搏波检测”的小系统。人的血液对红外光有较强的吸收作用而每次心脏搏动都会让血管容积发生变化这个变化会直接改变手指组织中血液的瞬时光密度。当红外光穿过手指时接收端的探测器感受到的光强就会随心跳呈现周期性变化。把这种光强变化转换成电信号再经过放大、滤波、整形就得到了和心跳同步的脉冲波形。数一下这个脉冲在一分钟内有多少个心率就出来了。这个原理听起来很顺但真正做课程设计的时候会遇到一个很现实的问题手指透射过来的信号非常微弱而且模电里学的“低通—高通—放大—比较”那一套在真实电路里要跑通比仿真软件里难多了。我在带学生做这个题目时经常说这个课题是个“小题目、大工程”它几乎把模拟电子技术里所有核心内容都串了一遍传感器接口、运放应用、滤波器设计、比较器整形、数字计数与显示。你把这一个东西做明白了整个电子技术基础课就没白学。这个题目也特别适合课程设计的原因在于它不依赖太复杂的仪器设备示波器、万用表、直流电源就够用成本也压得下来整套元器件几十块钱。对电气、电子、自动化、通信这些方向的学生既能练电路基本功又能体验完整项目流程从方案论证到原理图从焊接调试到整机测试全走一遍。1.2 方案选型与架构红外心率计的方案按信号处理方式大体有三种路线。第一种是纯模拟方案用运放搭放大滤波再用比较器输出方波驱动计数器或单片机计数第二种是模拟前端加单片机模拟电路负责信号调理单片机负责测周期、算心率、驱动显示第三种是全数字方案直接用ADS1292这类集成模拟前端芯片采PPG信号或者用反射式心率传感器模块如MAX30100直接把I2C数据给单片机读。三种路线里课程设计最推荐第二种。原因很直接第一种纯模拟方案对硬件调试要求高比较器阈值稍微偏一点计数就会漏脉或者多脉而且没有显示逻辑最后大概率要外接频率计体现不出完整系统第三种方案又太“黑盒”MAX30100模块一插程序一调心率就出来了模电知识基本没用上答辩的时候容易被问倒。第二种方案能把课程重点都覆盖到——前级模拟电路是自己搭的数字处理部分也由自己写模数结合难度适中讲起来也有内容。我的系统架构大致是这样的红外发射管和光敏三极管组成透射式探头手指夹在中间光敏管出来的微弱电流先经过I-V转换变成电压信号然后经过两级放大中间插入有源带通滤波器滤掉基线漂移和高频干扰再用比较器把正弦波整形成方波最后进单片机的外部中断引脚计数同时用定时器测量时间窗口计算心率并送到四位数码管显示。电源部分用7805稳压把9V直流降到5V给整个系统供电。2. 硬件电路的关键设计2.1 传感器探头与信号调理探头是整个系统信息质量的源头这里没做好后面怎么补救都白搭。红外发射管选用峰值波长940nm左右的型号比如SE303光敏接收用与它光谱匹配的光敏三极管比如ST-1KL3。两个管子要正对放置中间留一个能塞进手指的缝隙。我用的是PCB上开槽加铜柱固定的方式发射管和接收管分别焊在两片小块洞洞板上然后用热熔胶固定在一个黑色塑料夹子两侧。外壳尽量用不透光的材料这一步对抑制环境光干扰起决定作用。光敏管出来的电流信号非常微弱只有微安级别所以第一级必须做I-V转换。我用了一片LM358双运放第一路接成反相放大器反馈电阻取1MΩ这样1μA的电流就能产生1V的电压输出。要注意的是这个节点对噪声特别敏感反馈电阻两端必须并联一个几十皮法的电容否则运放会自激示波器上看全是毛刺。第二级放大倍数取51倍左右把信号抬到伏特量级方便后面的滤波和整形处理。这里有一个课程设计里反复出现的坑运放供电。LM358在5V单电源下输出摆幅有限信号负半周容易被削掉。我的做法是把I-V转换和放大级的参考地抬高到2.5V也就是用两个10kΩ电阻分压后面接一个电压跟随器生成虚地所有运放信号都以这个虚地为参考。这样在5V单电源下也能获得接近完整的波形摆幅电路并不复杂但效果非常明显。2.2 滤波整形与电平转换心率的频率范围正常人安静状态下大概是每分钟50到160次换算成频率就是0.8Hz到2.7Hz左右。即使考虑到运动后短暂超过180次/分钟上限3Hz也足够了。所以带通滤波器的通带设在0.5Hz到5Hz之间是合理的这样既能滤掉呼吸引起的低频基线漂移大约0.2到0.4Hz也能抑制工频50Hz和高频噪声。滤波器我用了二阶有源带通结构也就是一个低通和一个高通串联起来。高通部分截止频率用公式f1/(2πRC)计算取R330kΩ、C1μF算出来约0.48Hz低通部分取R33kΩ、C1μF算出来约4.8Hz两级串起来刚好覆盖目标频带。运放用的是LM358的另一半这个带通环节同时还能补一点增益设计得当的话可以把增益控制在5倍左右让信号幅度到达比较器的输入区间。比较器我用的是LM393它属于开漏输出结构输出端必须接一个上拉电阻才能输出高电平。比较阈值由两个电阻分压设定我取阈值在信号平均值附近。但这里有个问题手指放进探头后信号的平均电平会随夹紧力度变化如果阈值固定波形幅度稍变就会导致误触发。我的解决办法是RC积分提取直流分量——比较器正输入端接经过隔直电容后的交流信号负输入端接一个由大电阻大电容组成的慢积分电路这样阈值能自动跟随信号平均值。实际调下来误触发率大幅下降。整形后的方波是0到5V的单片机直接能识别。这里还要注意一点LM393输出的上升沿不够陡峭在信号频率低的时候问题不大但为了稳定我加了一个10kΩ上拉到5V并在单片机引脚对地并联一个0.1μF的滤波电容把高频毛刺吸收掉。2.3 主控与显示电路主控芯片我选了STC89C52RC这是课程设计里最常见的51内核单片机工具链成熟资料多老师也熟悉。内部有3个定时器我计划用定时器0做10ms时基定时器1做外部脉冲计数。外部脉冲从P3.4引脚即T1计数输入接入这样硬件上就能自动对脉冲计数不需要中断服务程序里手动数电平跳变省掉很多CPU开销。数码管显示我用的是四位数码管采用动态扫描方式。段选接P0口位选接P2.0到P2.3中间用三极管8550做位驱动。因为P0口是开漏结构必须接上拉电阻我用的是排阻4.7kΩ×8。动态扫描的原理就是快速轮流点亮每一位利用人眼视觉暂留效应让四位数看起来是同时亮的。扫描频率至少要50Hz否则会明显闪烁。我的做法是每2ms切换一位四位数一个循环8ms对应125Hz实际看起来非常稳定。电源部分用7805线性稳压输入9V开关电源适配器输出5V给整机供电。7805前面的输入电容用100μF电解电容输出端用10μF电解加0.1μF瓷片电容并联消除高频噪声。另外单片机的复位电路用经典的10μF电解电容加10kΩ电阻方案晶振用11.0592MHz这个频率主要是为了后续如果用串口时波特率计算方便虽然这个项目用不上串口但养成按标准频率设计的好习惯没有坏处。3. 软件与算法实现3.1 心率计数逻辑软件部分的核心是回答一个问题在什么时间窗口内数多少个脉冲最简单的办法是固定60秒数完直接显示。但课程设计现场演示的时候没人愿意等一分钟才看到结果而且如果测试者手抖了一下导致中间漏了几个脉冲整分钟数据都作废。所以更聪明的做法是测周期。我用的方法是测6个连续脉冲间隔的总时间然后换算成每分钟心率。具体实现外部中断0配置为下降沿触发每次进入中断时读取定时器0的当前值与上一次中断时读到的值相减得到单个脉冲的周期。连续测6次累加后除以6得到平均周期T单位是毫秒心率就等于60000除以T。举个例子如果平均周期是800ms心率就是60000除以800等于75次/分钟。测6个脉冲大约需要3到5秒这个刷新速度在课程设计演示场景下完全够用而且比固定时间窗口的抗干扰能力好很多。程序里还要做一个软件滤波如果计算出的心率低于30或高于250这肯定不是正常心率说明信号有问题或者手离开了探头程序直接丢弃这次的数值保持上一次的显示结果不变。这个防抖逻辑在实际演示中非常有用能避免很多尴尬场面。3.2 定时中断与显示刷新定时器0配置为模式116位定时器用11.0592MHz晶振机器周期约1.085μs。要得到10ms中断一次初始值这样算计数值等于10000除以1.085约921665536减9216等于56320换算成十六进制就是0xDC00。所以TH0装0xDCTL0装0x00。每次中断里做一个软计数器加1积累到100次就是1秒这个秒标志用来控制显示刷新和指示灯的闪烁节奏。显示刷新放在主循环里做因为显示不需要特别精确的时序。主循环的逻辑是检查脉搏标志位有新的脉冲周期数据来了就更新心率值把心率值拆成千位、百位、十位、个位存入显示缓冲区然后调用数码管扫描函数逐位点亮。扫描函数本身很短就是选通一位位选、送出段码、延时1ms然后切下一位。没有再多的复杂逻辑了51单片机干这点活绰绰有余。程序结构上我建议把功能拆成模块不要全部堆在main函数里。我的习惯是分三个文件main.c负责主循环和逻辑调度timer.c负责定时器和外部中断的初始化及中断服务函数display.c负责数码管驱动和显示缓冲区的管理。看起来程序不大但分文件管理之后调试效率高很多后期想在上面加个按键切换显示模式之类的小功能也更容易扩展。4. 调试踩坑与经验总结4.1 波形干扰最大的坑在工频和自激我调试的第一版电路示波器夹在运放输出端看到的不是平滑的脉搏波而是叠加了一大堆50Hz的纹波。排查了半天发现是探头没有遮光室内的荧光灯是50Hz频闪的红外光敏管把灯光干扰一起收了进来。解决方法就是给探头加黑色遮光套让手指以外的环境光尽量进不来。这个措施一做示波器上的波形立刻干净了一个数量级。另一个常见问题是运放自激。I-V转换级的反馈电阻是1MΩ这个阻值配合运放的输入电容很容易产生高频振荡。示波器上看起来就是信号上叠了一层密密麻麻的高频毛刺频率在几百kHz以上。解决办法就是在反馈电阻上并联一个几十皮法的电容给高频信号一条低阻抗通路让运放工作在稳定状态。这个电容的值需要根据实际波形调我最终用的是22pF既抑制了自激又不会把脉搏信号的高频分量压掉太多。4.2 数值跳变与实时性矛盾第一次整机联调时显示的心率数值一直在跳从80跳到40又跳到150看起来完全不靠谱。用示波器查了整形后的方波发现问题出在比较器阈值上。前面提过我用了自动阈值跟踪的方法但那个RC积分电路的参数没选好积分时间常数只有0.2秒导致阈值跟着脉搏信号的每一个波动来回抖在波形的波峰和波谷附近反复回滞产生了多余的触发脉冲。我的处理方法是把积分时间常数加大到3秒以上用1MΩ电阻和3.3μF电容组成RC低通这样阈值就是信号缓慢变化的平均值不会跟着单次脉搏波抖。同时LM393加了正反馈电阻构成迟滞比较器大约0.3V的回差电压进一步防止在阈值附近反复翻转。这两处改完示波器上的方波干净利落每个心跳只有一个脉冲心率数值也稳下来了。另一个心得是刷新策略。如果每次脉冲都重算并立刻刷新显示数码管会闪得很厉害。我改成每2秒更新一次显示值中间即使有新的计算结果也不会刷新屏幕。这样人眼看过去数字是稳定停留的体验好很多。虽然牺牲了一点实时性但在课程设计这个场景下稳定比实时更值钱。4.3 探头固定与实物验证探头固定是个很容易被忽视的细节。最开始我直接用手指按压在发射管和接收管之间力度稍微不均匀波形幅度就剧烈变化。后来我用泡沫棉做了一个手指形状的凹槽手指放进去后自然贴合力度适中不会因为肌肉紧张产生明显抖动。如果做产品化设计应该用弹簧夹或者指夹式的结构但课程设计用泡沫棉凹槽已经足够稳定。整机验证的时候我建议用两台设备对比一只手夹在自己做的红外心率计上另一只手夹在医用血氧饱和仪上同时测一分钟。连续测三组数据误差在±3次/分钟以内就算合格。我实测的结果是静息状态下自制的显示72到75次/分钟医用血氧仪显示73到76次/分钟误差完全在可接受范围内。运动后再测心率上升到110左右两边的数值依然能跟上说明系统的带宽设计是够用的。最后还有一个加分项如果条件允许把示波器接到整形前的测试点把脉搏波形拍照贴在课程设计报告里再附上整形后的方波对比答辩的时候会非常有说服力。这比写多少文字都好使。毕竟这是个电子技术课程设计用波形说话比用概念说话更站得住脚。本文还有配套的精品资源点击获取
返回列表