多彩编程 多彩编程MZPH · CODE BLOG
ARTICLE DETAIL

文章详情

深耕前端与后端开发技术的一线实战笔记与踩坑复盘。

基于红外脉搏检测的疲劳驾驶报警系统设计与实现

基于红外脉搏检测的疲劳驾驶报警系统设计与实现 简介基于单片机的汽车疲劳驾驶报警系统毕业设计论文面向电子信息、嵌入式方向的本专科生及毕业设计选题者用于参考完整论文结构、系统方案与关键技术实现。资源为2021-2022年收藏专题资料压缩包内共1个doc文档大小206KB便于直接查看和编辑。论文以人体血液流量变化为检测基础借助红外发光二极管与红外三极管采集脉搏信号经信号处理电路转换后交由单片机分析当心率偏离正常值20%以上时驱动报警电路实现疲劳预警内容覆盖系统总体设计、检测原理、硬件电路、软件调试及可靠性等完整章节。文档结构清晰包含中英文摘要、目录、前言、设计方案与总结等模块适合用于撰写开题报告、搭建系统框架或补充单片机应用案例已有150人学习浏览具有一定的参考价值。1. 为什么疲劳报警系统非要和脉搏过不去做过车载电子的人都知道疲劳驾驶检测最难的从来不是报警电路而是如何在发动机振动、路面颠簸和强光干扰下拿到一个稳定的人体生理信号。这篇论文选了红外脉搏检测方案思路其实非常朴素血液随心脏搏动在血管里流动时耳垂和指尖这类组织薄弱部位的半透明度会周期性变化红外光穿透过去接收端就能得到与心跳同步的微弱电信号。把信号放大、整形、算周期单片机能算出心率心率偏离正常值超过百分之二十就触发声光报警。选这个方案的现实理由也站得住相比基于摄像头的人眼状态检测红外脉搏检测不需要复杂图像算法一颗运行在 12MHz 的 AT89C2051 就能跑完全部逻辑相比脑电图这类医学级方案它成本低、体积小、可以做成蓝牙耳机形态贴在耳朵上。当然它的局限同样清楚——驾驶员必须持续佩戴检测装置传感器贴合度直接影响信号质量这一点在实车验证时会比实验室麻烦得多。本文要展开的就是这条信号链路上每一个值得较真的环节从光电传感器选型、LM324 四级运放处理到中断法测周期的边界条件最后给出调试时的波形判读经验。2. 检测原理与整体方案选型为什么是红外光而非其他生理信号这章先解决一个根本问题疲劳状态为什么可以用心率来表达以及红外光检测脉搏这种方法在工程上的合理性边界在哪。2.1 脉搏信号作为疲劳指标的医学与工程依据疲劳驾驶的本质是驾驶员中枢神经系统兴奋度下降伴随心率变异性改变。论文里采用的判据是“心率偏离正常值 20% 以上”这是一个相对保守但工程上极易实现的阈值策略。正常人静息心率大致在 60100 次/分钟按 20% 偏差计算低于 48 次或高于 120 次就触发报警。这个范围兼顾了大多数驾驶员的生理差异避免因个体差异导致频繁误报。从传感器角度讲光电容积脉搏波PPG即利用光强变化检测血液容积变化的无创方法是当前性价比最高的心率获取手段。它的物理基础是朗伯-比尔定律——光在生物组织中的吸收量随血液容积变化而改变。心脏收缩时动脉血容量增加组织吸光增强透射或反射光减弱心脏舒张时反之。这个信号幅度虽小却有明确的周期性配合模拟滤波电路完全可以提取出来。2.2 系统总体架构与信号流拆解整个系统是典型的“传感器模拟前端数字核心”架构。红外发光二极管 D1 发射特定波长的红外光穿过耳垂或指尖后被红外三极管 Q1 接收并转换为电流信号。该信号幅度通常在毫伏级且叠加了大量噪声必须依次经过低通滤波、放大、比较整形、微分、单稳态脉冲发生这五个模拟处理步骤最后变成单片机可直接识别的标准电平脉冲。信号链路顺序如下红外发射(D1) → 组织透射/反射 → 红外接收(Q1) → RC低通 → IC1a放大(约200倍) → IC1b比较器整形 → C5/R10微分 → IC1c单稳态 → P3.3中断输入 → 心率计算 → 液晶显示 蜂鸣器报警这条链路里最关键的设计决策有两个一是采用红外光而不是可见光因为红外光对外界环境光的抗干扰能力更强且皮肤对红外光的反射特性比较稳定二是采用 9V 供电经 LM324 缓冲得到 4.5V 作为运放电源使得电池电压跌落至 6V 时模拟电路仍能维持正常工作。这使得整套系统对车载电源波动不那么敏感在实车环境里更可靠。2.3 与面部识别、方向盘转角检测方案的横向对比有些方案通过摄像头检测驾驶员眨眼频率、视线方向或瞳孔直径来判断疲劳这在算法层面需要跑图像识别对主控的算力和内存有要求AT89C2051 这类 15 个 I/O 口、128 字节 RAM 的小芯片根本跑不动。还有些方案检测车辆的行驶轨迹偏移、方向盘转角变化率但这更多是判断“驾驶行为是否异常”容易把正常变道、弯道行驶误判为疲劳且反映的是驾驶结果而非驾驶员的生理状态。论文选择 PPG 测心率的价值在于信息维度最接近疲劳本质——自主神经系统的变化会直接影响心率特征。代价是需要驾驶员佩戴传感器这是体验层面的妥协。对于论文和课程设计场景这个取舍完全合理因为你要论证的核心是“如何测量并判断疲劳”而不是“如何无感地测量疲劳”。3. 硬件设计与电路参数把毫伏级脉搏信号从噪声里捞出来硬件部分是这套系统的技术重心也是最值得花时间复现和修改的部分。本章按信号流顺序从传感器、模拟信号链到单片机最小系统逐级给出参数计算依据和选型理由。3.1 红外传感器对D1/Q1的选型与安装形态红外发射管 D1 和接收三极管 Q1 构成检测探头。工程上要关注三个参数发射管的峰值波长、接收管的峰值响应波长、两者封装后的机械结构。发射管峰值波长选择 940nm 左右这是红外光电晶体管响应最灵敏的波段且不易被可见光干扰接收管选用与发射管波长匹配的红外三极管暗电流要小否则环境光稍强就会饱和机械结构上论文将 D1 和 Q1 做成类似蓝牙耳机的形态夹在耳垂两侧。这里要注意发射管和接收管必须保证光路对准且与被测组织紧贴任何松动都会导致信号幅度剧烈波动。我的经验是如果手头没有现成的耳夹式血氧探头可以用一个黑色泡沫夹子改造在两侧分别挖孔嵌入 D1 和 Q1周围用热熔胶固定和遮光。遮光这一步不能省否则室外强光直接照射接收管信号会被完全淹没。3.2 前置模拟信号链LM324 四运放的每一级都在干什么LM324 是四路运算放大器封装里含四个独立运放分别标记为 IC1A、IC1B、IC1C、IC1D。整个信号链的处理流程如下IC1A构成有源低通滤波器截止频率约 10Hz增益约 200 倍。为什么截止频率选 10Hz因为人的脉搏频率范围大致在 0.78Hz对应 47 次/分钟到 3.33Hz对应 200 次/分钟10Hz 截止频率足够保留有效信号同时把高频干扰和部分工频噪声滤除。增益 200 倍的作用是把毫伏级信号拉高到伏特级便于后续比较器判断阈值。IC1B构成电压比较器将放大后的正弦波整形为方波。R8 调整比较器的阈值电压也就是设置正弦波幅度在哪个电平处跳变。C5 与 R10构成微分电路把方波变换成正负尖脉冲。IC1C构成单稳态多谐振荡器收到尖脉冲触发后输出固定宽度的高电平脉冲宽度由 R11 与 C6 决定论文中约为 20ms。我一般会在这级电路后面加一级简单的电压跟随器用来隔离输出阻抗避免后级数字电路的负载变化反向影响单稳态电路的工作状态你能观察到更稳定的脉冲波形。3.3 心率采集电路的逐级参数表下面这张表汇总了信号链上各级核心元件的功能及取值依据方便你在 Proteus 里仿真或洞洞板焊接时对照检查。级联位置核心元件典型取值作用与选型依据传感器发射D1940nm 红外 LED穿透耳垂/指尖组织波长与接收管匹配传感器接收Q1NPN 红外三极管光信号转电流暗电流越小抗环境光越强一阶低通R2/C156kΩ / 47nF滤除高频干扰截止频率约 60Hz有源低通放大IC1A、R4/C45kΩ / 3.3μF 附近截止频率约 10Hz增益约 200 倍比较整形IC1B、R856kΩ 可调调整阈值电压正弦波变方波微分电路C5/R101nF / 100kΩ方波边缘变尖脉冲触发单稳态单稳态定时IC1C、R11/C6220kΩ / 47nF输出 20ms 标准脉冲匹配脉搏信号注入单片机R1251kΩ限流保护脉冲送入 P3.33.4 AT89C2051 最小系统晶振、复位与电源设计要点AT89C2051 是 20 引脚封装的 8051 内核单片机15 个可编程 I/O 口、128 字节 RAM、6 个中断源内置模拟比较器工作电压范围 2.7V 至 6V支持 0Hz 至 24MHz 静态工作频率。项目里使用 12MHz 晶振目的是让定时器计时分辨率足够高用于周期测量时精度能到微秒级。晶振电路采用典型的两电容三点式接法C11、C12 取 22pF。瓷片电容容值不必非常精确但必须靠近晶振引脚焊接否则容易导致起振不稳定或频率偏差。复位电路采用经典的电容电阻串联结构电容 C 取 10uF、电阻 R 取 10kΩRC 时间常数为 100ms 左右确保 RST 引脚高电平持续时间远大于两个机器周期。上电瞬间电容充电形成高电平复位正常工作时电容隔直RST 拉低。值得注意的一个细节是电源方案。心率计整机工作电流约 100mA其中模拟部分的运放、红外发射管占了大头。系统使用 9V 电池供电经过 IC1D 缓冲分压得到 4.5V 模拟电源。这个做法相比直接用三端稳压器更有讲究——4.5V 电源即便在电池跌落到 6V 时也能维持运放正常工作等于把模拟电路的电源适应范围放宽了 3V同时省掉一个稳压芯片属于成本和可靠性的平衡。3.5 报警与显示输出电路的工作逻辑报警输出采用普通蜂鸣器由单片机 I/O 口驱动。为了确保驱动电流足够一般通过一个 NPN 三极管放大电流。显示部分使用 SMC1602A 液晶模块数据线 DB0DB7 直接接到单片机 P1 口RS、RW、E 控制线分别由 P3.0、P3.1、P3.5 控制。液晶显示当前心率值和报警状态方便驾驶员随时观察。日常使用时D3 红色发光二极管随脉搏同步闪烁能让用户直观地确认传感器是否贴合到位。如果 D3 不闪或闪烁不规律说明探头佩戴有问题或者信号链有故障这是整套系统最简单也最实用的自检手段。4. 软件设计与中断测周期从脉冲间隔到心率数值的计算逻辑硬件把脉搏变成了整齐的脉冲单片机接下来要做的事只有一件数脉冲、算间隔、判阈值。这章把主程序框架、定时器配置、中断处理这三块作为主线给出可直接参考的代码结构和参数推导过程。4.1 主程序的整体工作流程主程序初始化完成两件事配置定时器工作模式和开启外部中断。随后进入循环不断把最新计算出的心率值送去液晶显示同时监测心率异常标志位一旦发现超出阈值就驱动蜂鸣器报警。主循环本身不参与计数只负责显示和报警状态更新这种分工能最大限度减少计时误差。// 主程序框架简化版 void main(void) { TMOD 0x01; // 定时器0工作在方式116位定时器 ET0 1; // 使能定时器0中断 EX0 1; // 使能外部中断0接P3.2 IT0 1; // 外部中断0负跳变触发 EA 1; // 开启总中断 TH0 0x00; TL0 0x00; while(1) { if (heart_rate_valid) { lcd_display(heart_rate); } if (heart_rate HIGH_LIMIT || heart_rate LOW_LIMIT) { buzzer_on(); } else { buzzer_off(); } } }几个关键参数TMOD 0x01定时器 0 工作在 16 位定时器模式最大计时长度 65535 个机器周期12MHz 晶振下机器周期为 1μs16 位定时器最长可计时 65535μsIT0 1设置外部中断 0 为负跳变触发恰好对应硬件输出的下降沿心率阈值用宏定义预设为 HIGH_LIMIT 和 LOW_LIMIT对应正常值上下浮动 20%。4.2 定时器方式 1 与脉搏周期的权衡计时分辨率直接影响心率计算精度。假定实测脉搏周期为 T 微秒心率值为 60000000/T次/分钟。以 70 次/分钟为例周期约 857142μs。这个数值远超 16 位定时器的最大量程 65535μs。直接一次计时无法覆盖完整周期工程上的标准做法是允许定时器溢出并记录溢出次数// 定时器0溢出中断记录溢出次数 void timer0_isr(void) interrupt 1 { overflow_count; TH0 0x00; TL0 0x00; // 重新从0开始累加 }每次溢出代表 65536μs将 overflow_count 乘以 65536 再与当前定时器值相加就得到完整的周期时长以正常心率下限 40 次/分钟计算周期为 1500000μs需要约 23 次溢出用一个 8 位无符号字符即可容纳如果心率过低导致周期过长溢出次数超过 255 次说明传感器脱落或信号丢失程序里应做超时判断并停止计算而不是继续累加。采用中断方式测周期的好处是全程不占用 CPU 轮询主循环可以处理显示保证显示刷新的同时计时不中断。这个方法在 51 单片机课程设计中非常常见我这里补充说明一下溢出计数的边界条件实际调试时很有用。4.3 外部中断里的周期计算与抖动消除外部中断服务程序的核心任务是从相邻两个下降沿的间隔中推出心率。这里最大的坑是信号抖动——硬件整形后的脉冲在边缘处可能出现毛刺导致中断被重复触发测出来的周期会被压缩心率值虚高。解决思路有两种硬件上加 RC 滤波软件上在中断里判断时间间隔。// 外部中断0服务程序计算脉搏周期 void ext0_isr(void) interrupt 0 { unsigned long current_capture; unsigned int delta; // 关闭计时 TR0 0; current_capture (unsigned long)overflow_count * 65536UL TH0 * 256UL TL0; delta (unsigned int)(current_capture - last_capture); // 软件滤波剔除异常短间隔小于400ms视为抖动对应心率150bpm if (delta 400000UL) { // 周期合法换算为心率 heart_rate 60000000UL / delta; heart_rate_valid 1; last_capture current_capture; } else { // 疑似抖动丢弃本次计数不更新心率 heart_rate_valid 0; } // 重新开启计时 overflow_count 0; TH0 0; TL0 0; TR0 1; }这段代码里有几个细节值得推敲60000000UL / delta的单位是次/分钟不是次/秒。如果周期为 60000000μs即 60 秒心率为 1实际不会出现正常心率 60 对应周期 1000000μs设置 400ms 的下限过滤条件是常用做法——正常心率上限按 150bpm 计算周期最低约 400ms。低于这个值说明信号链有抖动或多个脉冲粘连每次中断末尾清零溢出计数和定时器要避免在定时器运行期间清零导致计时基准错乱。这里的处理是中断一开始就关闭定时器清零后再打开确保下一次测量的起点是干净的。4.4 异常判定阈值与报警逻辑的低误报设计心率正常值判定采用论文中的“正常值上下浮动 20%”规则。假设在心率为 75 次/分钟时高阈值为 90低阈值为 60。这里的关键是“正常值”从哪来两个设计方向可以参考开机后取前 30 秒心率的平均值作为个人基准。这个方案能自适应不同驾驶员但需要保证开机时驾驶员处于清醒静坐状态直接使用固定标准值 60100 次/分钟上下浮动 20% 后实际报警阈值为 48120。报警逻辑还需要防重复打扰。驾驶员长时间疲劳时心率会持续偏低若蜂鸣器一直响会干扰驾驶。合理做法是加入延时判定连续 10 秒检测到心率越界才触发报警报警持续 3 秒后暂停 10 秒再检查。这样既保证报警有效又不至于因为传感器瞬时误差频繁误报。我在自己的设计里会在 EEPROM 里存一个报警状态位避免复位后立即再次报警。5. 调试技巧与验证方法用示波器逐级看信号用阈值避开误报整机能否跑通取决于你是否能把模拟前端每一级的输出波形都看出门道来。这一章从调试工具到信号判读再给出一个抗干扰的阈值策略改进思路也是做实车验证前最值得做的事。5.1 用示波器逐级定位信号链的问题数字万用表只能告诉你“有没有电”示波器才能告诉你“信号对不对”。有条件的建议使用至少双通道数字示波器量程调到 1V/div时间轴 500ms/div把探头依次接在四个关键测试点上。测试点预期波形常见异常排查方向Q1 集电极几十毫伏的脉动信号无波形或波形平坦检查 D1 是否发光、光路是否对准、Q1 是否损坏IC1A 输出约 12V 的正弦波波形过小或削顶检查反馈电阻 R4 是否接触不良、增益是否正确IC1B 输出5V 方波方波占空比不稳定调整 R8 阈值电位器避开正弦波幅度波动中心IC1C 输出20ms 高电平脉冲脉冲宽度异常或抖动检查 R11/C6 取值、供电电压是否稳定如果前面都正常但单片机收不到脉冲重点检查 R12 到 P3.3 之间的连线以及 P3.3 口是否被配置成输出模式——这种低级错误在课程设计里踩的人不少。5.2 软件滤波阈值如何配合硬件参数调整前面中断程序里 400ms 的软件下限不能一概而论。如果你的硬件单稳态脉宽不是 20ms 而是 50ms或者比较器阈值调得过于敏感导致脉冲粘连400ms 这个值需要相应放宽。一个实用的调整办法是让被测者静坐观察示波器上连续十个脉冲的周期最小值把它乘以 0.8 作为软件滤波下限。论文中设定单稳态脉宽 20ms 的依据是确保脉冲宽度远小于最短脉搏周期大约 300ms这样后续计数时不会因为脉冲过宽导致相邻脉冲合并。这个 20ms 取值在多数场景下是合理的它与 400ms 软件下限共同构成了一个双保险机制。实际用下来这组参数配比较好但也不是绝对标准——将 R11 换到 470kΩ、C6 保持 47nF脉宽能延长到大约 40ms需要同步把软件滤波下限调高这一点在使用原版电路时不需要改但如果你为了抗干扰调整了 R11就要记得改动判断逻辑。5.3 心率数值的简便验证方法整机调试完成后用手捏住指夹式传感器同时用另一只手摸自己的桡动脉手动数脉搏 15 秒乘以 4 得到实测心率与液晶屏显示值对比误差在 ±2 次/分钟内说明系统正常。误差偏大时先看波形是否稳定再看阈值是否设置不当不要急着改代码里的除法常数。最后给一个提升实车可靠性的低成本改进方案在单片机的 P3.7 引脚外接一个开关切换“正常值自动学习模式”和“固定阈值模式”。前者适合长时间连续驾驶通过滑动平均不断更新个人心率基准后者适合短途代步直接使用标准健康范围。这个功能只需要改动十几行 C 代码却能让论文里的固定阈值报警机制在实践中具备更强的适应性也是一个在答辩时能讲出深度的优化点。本文还有配套的精品资源点击获取
返回列表