基于有限状态机的车身防盗报警的实现
扫描二维码
随时随地手机看文章
引言:
随着汽车保有量的增长,汽车安全防盗问题愈加重要。现在大部分车都实现了防盗报警(anti thief alarm,缩写ATA)功能,主要是通过超声波检测的方式判断是否存在非法进入【1】,然后启动声光报警。这种方式可以有效检测出非法进入,但也存在误报的可能,给周边环境带来很大的困扰。在笔者为某车型设计的集成式车身控制器中,通过检测解锁闭锁动作、点火状态、车身状态和防盗状态综合判断是否安全锁车、是否暴力进入以及是否非法点火,从而实现安全锁车和防盗报警功能,本文首先介绍防盗报警单元(以下简称ATA)的工作原理及其状态机的设计,然后介绍了声光警示、安全锁车的机制及其软件实现。
ATA工作原理:
一个有效的ATA单元需要正确触发报警警示动作,同时避免误触发报警给用户带来的不便,这是通过判断是否正常进入车内和正常点火实现的。
首先在进行锁车时,通过喇叭和转向灯提示用户安全锁车,只有当四门两盖状态(四个车门开关、发动机盖开关、行李箱开关)全部为关闭状态且点火信号无效时才能安全锁车。安全锁车后进入防盗状态,对四门两盖状态及点火信号进行监测【2】,如果未经解锁动作而检测到车门或行李箱或发动机盖被打开,则认为是非法进入,如果检测到点火信号有效,则认为是非法点火,这时通过喇叭和转向灯启动声光报警,进行解锁动作或者在5秒中内检测到点火钥匙ON/OFF切换两次,停止报警回到正常状态。ATA结构如图1所示:
图1:ATA结构示意图
Figure 1:ATA Structure Schematic
ATA单元在钥匙锁车和解锁动作下进行门锁控制的同时,以状态机的形式实现防盗报警状态的跳转,同时伴随着一些警示动作向用户提示当前的车身状态,下面首先对防盗报警状态及其跳转进行分析,描述状态跳转的过程,然后描述车身状态警示动作的设计。
ATA状态机设计:
根据汽车使用方式和安全防盗的需要,设计以下几个状态:正常状态NORMAL、防盗状态SECURITY、等待退出防盗状态QUIT_SECURITY、报警状态ALARM,正常状态对应汽车被正常使用的状态,防盗状态对应安全锁车后的状态,等待退出防盗状态是个中间暂态,对应在防盗状态中,用户解锁车门而不打开的情况,报警状态对应非法进入或非法点火的状态。下面以状态机的方式介绍下这四种ATA状态的跳转。状态图如图2所示:
图2 ATA状态图
Figure 2:ATA State diagram
在四门两盖全闭、点火信号无效的条件下,钥匙遥控闭锁或前门闭锁,ATA进入SECURITY状态,此时启动对车身状态和解锁动作的监测;在SECURITY状态下检测到四门两盖打开或点火信号有效,进入ALARM状态,这时启动声光报警,在SECURITY状态下解锁,进入QUIT_SECURITY状态;QUIT_SECURITY是一个中间暂态,它至多维持20s时间,超时则自动闭锁并再次进入SECURITY状态,这样可以防止用户误按遥控解锁键带来的安全性问题,如果在此期间车门打开,则进入NORMAL状态;在ALARM状态下,报警一个循环后检测到四门两盖全闭且点火信号无效,返回SECURITY状态,也可以通过解锁或者在5S内点火信号ON/OFF切换两次而进入正常状态。具体代码设计在此不再赘述。
ATA警示动作:
由ATA状态机可以看出,状态跳转的条件为解锁闭锁动作、四门两盖状态和点火信号,ATA需要在状态跳转的过程中根据这些条件进行相应的提示和警示【3】。
在锁车时,根据四门两盖状态以及点火信号,判断是否可以安全锁车,如果可以,则执行闭锁动作,同时转向灯闪烁一次、喇叭鸣响一次;如果四门两盖存在打开或微开的状况,不执行闭锁动作,同时转向灯闪烁三次、喇叭鸣响三次,提示车主检查某个未关上的车门或行李箱或发动机盖。解锁则比较简单,转向灯闪烁两次以示区别即可。
在安全锁车进入防盗状态后,BCM进入低功耗模式,同时使能四门两盖及点火信号的开关中断唤醒功能,当存在非法进入或非法点火的情况,会通过四门两盖或点火信号的开关状态体现出来,这时唤醒CPU,同时启动声光报警-转向灯闪烁、喇叭鸣叫40s,循环四次,退出报警状态则停止声光报警。
对于四种ATA状态,则通过一个功率非常小的报警LED灯的闪烁方式进行区分,NORMAL状态下LED熄灭,SECURITY状态和ALARM状态采取周期为4s、占空比为10%的PWM方式闪烁,在暂态QUIT_SECURITY状态下,LED以200ms为周期快速闪烁。
下面给出喇叭警示相关的代码,其中喇叭控制DrivePort和时间计时部分的代码TimerStart和TimerStop【4】等在此不再赘述。
void HornTweet(HornOper mode)
{
if(SILENCE==mode){
if(SILENCE!=Alarm_spkr_cyout){
DrivePort(ALARM_SPKR_OUT,DRIVEOFF);
TimerStop(SPKR_FLASH_MS);
TimerStop(SPKR_PERIOD_3S);
TimerStop(SPKR_SHOUT_30MS);
Alarm_spkr_cyout=SILENCE;
}
}else if((TWEETONCE==mode)||(TWEETTWICE==mode)||(TWEET3TIMES==mode)){
if(mode!=Alarm_spkr_cyout){
DrivePort(ALARM_SPKR_OUT,DRIVEON);
if(TWEETONCE==mode){
TimerStart(SPKR_FLASH_MS,360,0,1);
}else if(TWEETTWICE==mode){
TimerStart(SPKR_FLASH_MS,360,0,3);
}else if(TWEET3TIMES==mode){
TimerStart(SPKR_FLASH_MS,360,0,5);
}
Alarm_spkr_cyout=mode;
}
}
}
安全锁车
安全锁车是ATA单元的一个重要组成部分,如图2所示,它也是进入防盗状态的关键触发条件。在四门两盖全闭、点火信号无效的条件下,按下遥控闭锁开关或转动前门钥匙孔可以触发安全锁车。为了避免误锁车,需要对前门钥匙闭锁开关和遥控闭锁开关进行一定的消抖和过滤,同样的情况也适用于解锁操作,误解锁对于汽车安全的影响不言而喻【5】。
对于ATA单元来说,前门钥匙闭锁开关是一个物理开关信号,遥控闭锁开关按下时每隔一定周期会发送相应的RF报文,在一定时间间隔内检测是否存在遥控闭锁开关按下的RF报文可以判断该开关是按下状态还是松开状态,把它们统一为开关信号,逻辑上对应以下三个变量:switch_state开关状态、swon_event无效到有效的变化、swoff_event有效到无效的变化【6】,需要闭锁开关维持150ms的按下时间,才认为是有效的闭锁信号,该部分的消抖程序原理是统计开关按下的维持时间是否超过150ms,程序如下所示:
CountOver=CountTimes(FRONTDOORKEY_LOCK_SWITCH,FRONTDRKEY_LOCK_150MS,&Fdkey_lock150ms_validtimes);
if(1==CountOver){
CountOver=0;
if(1==Fdkey_lock150ms_validtimes){
Fdkeydrivdr_lk_signal=1;
}
Fdkey_lock150ms_validtimes=0;
}else{
;
}
CountTimes函数如下所示:
uchar CountTimes(SwId SwitchId,TimerId TmId,uchar* ValidTimes)
{
uchar CountOver;
CountOver=0;
if(1==Sw[SwitchId].swon_event){
TimerStart(TmId,150,0,1);
}else if(1==Sw[SwitchId].swoff_event){
TimerStop(TmId);
}else{
;
}
if(1==TM[TmId].overflow_flag){
TM[TmId].overflow_flag=0;
CountOver=1;
if(ON==Sw[SwitchId].switch_state){
(*ValidTimes)++;
}else{
;
}
}else{
;
}
return CountOver;
}
当开关按下,启动150ms的定时器,定时器超时,CountOver=1,这时判断开关在此150ms期间的有效次数ValidTimes是否为1,便可以判断是否有效的闭锁信号。
结语
本文设计的ATA单元以人机操作和汽车状态两个方面交互推进车身防盗报警状态的流转,逻辑严密,功能设计合理,准确报警并有效避免了误报,是一个很好的防盗报警解决方案,有很好的实用价值和借鉴意义。