基于单片机的车载疲劳驾驶检测系统设计*
2022-09-27张俊芳伏亚强张方娟张艺飞
张俊芳,伏亚强,张方娟,张艺飞
(1.宁夏师范学院物理与电子信息工程学院,宁夏固原 756000;2.宁夏师范学院纳米结构与多功能材料工程技术研究中心,宁夏固原 756000;3.西安汽车科技职业学院基础部,陕西西安 710038;4.深能保定发电有限公司,河北保定 072150)
根据国家交通部门统计分析,我国交通事故是世界的20%左右。疲劳驾驶是造成交通事故的主要因素之一[1-2]。所以研究出可以控制疲劳驾驶并及时给予警报的提醒系统,对于降低交通事故和保护国家财产安全具有重要意义。本车载疲劳驾驶系统的设计,主要是软件控制和硬件实物。硬件实物包括3个部分:脉搏信号采集模块、控制模块、显示和报警模块。软件控制主要用C语言编写,为便于程序修改和调试而采用模块化设计结构,采用的软件主要是Keil、Proteus等。本设计符合汽车智能化的发展趋势,也有效解决了疲劳驾驶安全、控制追尾问题,既满足了大众对实用型安全疲劳驾驶监控系统的需求,又对企业设计生产出疲劳驾驶监控产品打下良好的基础。
1 系统的工作原理与结构
1.1 系统的工作原理
当驾驶员处于疲劳驾驶时候,血液的流通速率就会相应的减缓,此时大脑出现昏迷状态,注意力降低,出现不规则的点头情况。本设计中的脉搏监控模块中的光电传感器ST188利用心脏跳动时脉搏处的血液发生变化而产生不同的反射率,检测到相应的脉搏信号。由于测得信号非常微弱,且属于不规则的脉冲信号,所以要通过信号放大与整形电路中的放大器LM358将信号放大。同时,又由于放大后的信号有不规则的脉冲信号和低频干扰,所以信号还需要整形。将放大后的信号传送给整形电路对其进行整形,整形后得出方波信号。将方波信号通过单片机P3.2的IO接口输入给单片机,单片机的外部中断对其进行计数,脉搏信号的采集时间设定为10 s,10 s测得脉搏信号数值,然后通过单片机中设定的算法对其作出相应的计算,即10 s的数值乘以6得出1 min的脉搏数目,最终换算出1 min脉搏跳动的次数。例如10 s的时间光电传感器测得血液的反射次数12次,即10 s内脉搏跳动了12下,通过单片机中算法得出12×6=72(下),这就是测得1 min脉搏跳动的次数。单片机系统运算出的数据通过P0.0-P0.7口与显示屏的DB0-DB7连接进行数据传递,传送到LCD液晶显示屏的数据将显示脉搏跳动的次数。如果检测结果超出预先设定理论测量范围,声光报警系统就会报警提示疲劳驾驶人员。
1.2 系统的结构
系统设计分为6大模块。单片机主控模块进行数据处理。LCD1602液晶显示模块显示初始状态、数据和处理结果。脉搏测量模块以脉搏传感器为信号采集,然后再经过信号放大与整形电路获得相应信号波形。超声波测距模块主要有超声波发射、接收探头,超声波发射调整电路,超声波回波接收处理电路和相应的模块接口组成。电源模块为系统提供电力保障。复位电路是系统出现错误或者要恢复初始状态设计的电路。系统结构框图如图1所示。
图1 系统结构框图
2 系统的硬件设计
系统硬件电路主要有主控电路、液晶显示电路、复位电路和脉搏信号检测电路组成。
2.1 主控电路设计
主控电路的设计主要由STC89C52单片机、晶振电路、复位电路组成。Proteus中的单片机主控电路仿真如图2所示。
图2 Proteus中的单片机主控电路仿真图
由于电路在仿真过程中没有相应的脉搏信号,所以设置了按键模块,用以模拟脉搏信号的输入[3]。模拟脉搏信号的按键输入电路如图3所示。
图3 模拟脉搏信号的按键输入电路图
按键模拟的人体脉搏跳动产生的脉冲信号首先被光电传感器ST188采集,采集得到的脉搏信号通过采集电路处理后,所测得的结果与单片机的P3.2引脚相连。将控制系统中单片机中断触发设定为负跳变触发,当按键模拟的脉搏跳动产生的脉冲信号的下降沿到达时,主控系统中的单片机就会触发产生中断,设定算法程序会对脉冲信号开始计时,在下一个脉冲信号的下降沿出现时,主控系统中的单片机会计算出前后相邻两个下降沿之间的时间间隔ΔT,计算所得到的结果(即ΔT)就是被检测驾驶员的一次脉搏跳动。这就是模拟出的一次脉冲信号的跳动原理。
计算出的结果通过单片机P1口与液晶显示器的DB口进行数据传输,数据再次进行处理后显示出来。
显示屏显示出检测的脉搏值后,主控系统中的单片机将显示出的结果与预先设定人的正常脉搏跳动的标准范围(60~100次/分)进行分析和比较。如果检测出的脉搏值A在60~100次/分内,则说明该驾驶人员脉搏正常,也就是该驾驶人员没有进行危险的疲劳驾驶行为;如果检测出的脉搏值A<60次/分(疲劳时心率一般<60次/分),则说明该驾驶人员脉搏不正常,即该驾驶人员处于疲劳驾驶,声光报警系统就会发出报警提示。脉搏监控模块的电路如图4所示。
图4 脉搏监控模块的电路图
为了更好的提示驾驶人员,并及时观察显示屏上的脉搏值,电路中设置了一个报警电路,通过单片机系统控制。每次检测到脉冲信号时,与主控系统中单片机P3.7引脚连接的蜂鸣器SP都会发出“嘀嘀”提示音。当再次听到蜂鸣器发出相同的提示音时,则说明1 min的检测脉搏计数已经结束。使用这种检测方法对驾驶人员及时做出有效、高速、准确的判断,判断他是否处于疲劳驾驶状态。
为了更加准确的检测出相应的结果,本系统设计的有效测量范围为50~199次/分。在检测脉搏信号时避免可能出现的干扰信号,主控系统单片机会对检测的2个脉冲之间的时间间隔ΔT进行检测,也就是突发信号的出现不在预先设定的有效测量范围之内时,会忽略该干扰带来的影响并且不显示出来。这样在实际运用中会有效降低疲劳驾驶系统中的脉搏测量出现的不良误差。
2.2 液晶显示部分与STC89C52的接口
用STC89C52单片机P0口作为数据线,用P1.0、P1.1、P1.2分别作为LCD的RS、R/W、E。RS是寄存器选择,R/W是读写引脚,E是使能端。在显示模块初始化时,清屏、设置8位数据接口位,1行显示行,5×7点阵字型显示,再设置整体显示,最后设置正向增量方式且不移位[4]。Proteus环境中的单片机主控系统与液晶显示器引脚连接如图5所示。
2.3 脉搏检测电路的设计
脉搏检测电路模块设计中最重要的是采集微弱的脉搏信号,所以采集微弱的脉搏信号电路的功能是由光电传感器ST188将采集的脉搏信号转换为电信号(几十mV),因为转换后的电信号非常微弱(几十mV),所以转换后的电信号要通过放大电路对电信号进行放大100倍,达到几V的标准。又因为放大后的信号波形是不规则的脉冲信号波形,所以要对信号进行滤波整形,整形后得出的方波信号电压为几V。信号经过放大整形电路最后输出的电压满足了计数器的要求。信号放大、滤波和整形电路框图如图6所示。
图6 脉搏信号放大、滤波和整形电路框图
人体脉搏信号的采集使用红外光电转换器ST188采集信号。嵌入在方向盘特定位置的红外光电转换器ST188中的红外光发射端发射出红外光,照射驾驶人方向盘的指头中血脉流动情况,把脉搏跳动的物理信号转换为电信号,其原理电路如图7所示。
图7 传感器信号调节原理电路
因为光电传感器ST188模块供电仅需要非常小的强电流供电(选用+5V电源),所以红外管VD采用ST188模块。传感器信号调节原理电路中R4取值为330 K,R5取值为20 K。把光电传感器放置特定的指尖脉搏之处,光电二极管检测到的物理信号会随人脉搏强度的变化而发生变化。
因检测到的脉搏信号输出值十分微弱,一般在μV级别,而且输出的电信号一般有较大的噪声干扰,因此需要利用LM358搭建一个放大和滤波电路将检测的脉搏信号进行放大、滤波。Proteus中的放大滤波电路如图8所示。
图8 放大滤波电路
检测到的脉搏信号经转换后得到电信号,电信号经过了放大和滤波电路后仍然是不规则的脉冲信号,还有一些低频干扰信号。这种信号不满足计数器计数的要求,所以需要对信号进行相应的整形,整形后得出具体的方波信号以便对脉冲个数进行计数。本设计的整形电路采用电压比较器,放大滤波后的波形整形主要是为了提高抗干扰能力。因为LM358内部含有2个独立的高增益和内部频率补偿电路,所以集成运放采用了LM358模块。为了直观、有效地检测脉搏的跳动,在LM358上接一个LED灯用来指示检测脉搏跳动的状态,LM358连接电路如图9所示。
图9 LM358连接电路
2.4 时钟电路
在STC89C52单片机控制系统中,它的时钟电路有外部和内部2种时钟方式[5]。本系统设计需要的时钟频率是12 MHz,电路需要三点式电容振荡电路来帮助晶振起振,所以需要在时钟电路两端上接负载电容X1,这样就能达到晶振起振的效果。在Proteus中XTAL2、XTAL1两端分别接2个33pF的谐振电容,这样是为了对特定频率的电压产生阻抗通道,方便不受阻抗的信号通过。在时钟电路提供稳定的时钟信号后,单片机控制系统就能够逐步从只读存储器(ROM)中读取指令执行程序,便于以后的计数。晶振电路如图10所示。
2.5 复位电路
图10 晶振电路
复位电路也是单片机控制系统中必要的外部电路[6]。单片机控制系统的部分电路中,在振荡器运行时,RST的引脚需要保持2个周期的高电平输入信号,复位过程才能够完成。此时,CPU将发出内部复位信号。在测得RST是高电平后的第二个周期时进行的复位操作,在此之后,检测的每个周期都将重复复位操作模式,直到检测到RST变为低电平时停止重复操作。正常情况下,电源供电电压(Vcc)上升时间小于1 ms,内部振荡器启用时间也是小于10 ms。此时,把RST的引脚通过10 μF的电容接到Vcc上再与10 kΩ的电阻和地连接,便能产生上电自动复位。如图11所示复位电路。
图11 复位电路
3 系统的软件设计
3.1 主程序及系统流程图
本系统设计使用C语言编程和Keil软件开发工具,将系统的各个功能进行模块化处理,其中各模块具有分工明确的特点,主函数只需要调用相应的模块子程序。模块化的设计方式能够更好理清主程序思路,也方便于程序理解和其他功能的扩展。本系统设计的整体流程如图12所示。
图12 系统设计整体流程图
3.2 检测脉搏信号的子程序设计
脉搏测量是在定时器中断中测量脉搏间隔得到的结果。主要是记录第一次脉搏跳动的时间并记录下时间,当下一次脉搏跳动时再次记录下时间,然后算出两次脉搏跳动的时间间隔。当连续两次检测时间间隔小于8×50 ms=400 ms不处理,当超过25×50 ms=1.25 s没有检测到信号,就停止信号的检测,然后再由60 s除以时间间隔,得出相应的脉搏数。
3.3 显示子程序设计
显示模块程序首先要对显示模块进行初始化,判断是否有按键按下,并判断按键按下的取键码是什么。如果是数字键和清零键将相应值送入显示缓冲并显示。如果按下功能键,就判断是哪个功能键并将相应值送入缓冲区等待数值输入将结果送入缓冲区,等待数值输入将结果显示。如果功能键是函数,输入数值后将结果送入缓冲区直接显示。
4 系统的测试及分析
4.1 硬件测试
先用Proteus软件绘制本系统的电路图,然后用Keil软件编写模块运行的C程序,最后用仿真软件进行模拟仿真电路的运行情况。在软件测试中原理图不会出错,主要是程序编写中会出现很多错误以及一些函数功能无法实现,经过多次程序的修改基本上达到预期效果。软件调试如图13所示。
图13 软件测试结果
4.2 软件测试与分析
根据要求和软件的流程图,将编写好的程序,通过生成Hex软件,在Proteus软件上进行仿真,用软件连接好硬件原理图并测试(如图14-图16),运行测试是否实现所需求的指标。
图14 按键模拟正常状态下的脉搏检测结果
图15 按键模拟正常状态下的脉搏检测结果
图16 按键模拟人在疲劳状态时的检测结果
5 结语
系统设计分为硬件电路设计及相应的程序设计完成对驾驶人员疲劳驾驶状态的实时检测并提醒,通过Proteus仿真实际硬件电路的电路连接及工作性能,最终系统实现了通过对驾驶人员脉搏信号的检测及头部距离方向盘距离的实时检测,能够对疲劳驾驶状态成功检测并报警,系统具有易于实现、成本低、功耗低、可行性强的广阔应用前景。