基于有限狀態(tài)機的車(chē)身防盜報警的實(shí)現
引言:
本文引用地址:http://dyxdggzs.com/article/196974.htm隨著(zhù)汽車(chē)保有量的增長(cháng),汽車(chē)安全防盜問(wèn)題愈加重要?,F在大部分車(chē)都實(shí)現了防盜報警(anti thief alarm,縮寫(xiě)ATA)功能,主要是通過(guò)超聲波檢測的方式判斷是否存在非法進(jìn)入【1】,然后啟動(dòng)聲光報警。這種方式可以有效檢測出非法進(jìn)入,但也存在誤報的可能,給周邊環(huán)境帶來(lái)很大的困擾。在筆者為某車(chē)型設計的集成式車(chē)身控制器中,通過(guò)檢測解鎖閉鎖動(dòng)作、點(diǎn)火狀態(tài)、車(chē)身狀態(tài)和防盜狀態(tài)綜合判斷是否安全鎖車(chē)、是否暴力進(jìn)入以及是否非法點(diǎn)火,從而實(shí)現安全鎖車(chē)和防盜報警功能,本文首先介紹防盜報警單元(以下簡(jiǎn)稱(chēng)ATA)的工作原理及其狀態(tài)機的設計,然后介紹了聲光警示、安全鎖車(chē)的機制及其軟件實(shí)現。
ATA工作原理:
一個(gè)有效的ATA單元需要正確觸發(fā)報警警示動(dòng)作,同時(shí)避免誤觸發(fā)報警給用戶(hù)帶來(lái)的不便,這是通過(guò)判斷是否正常進(jìn)入車(chē)內和正常點(diǎn)火實(shí)現的。
首先在進(jìn)行鎖車(chē)時(shí),通過(guò)喇叭和轉向燈提示用戶(hù)安全鎖車(chē),只有當四門(mén)兩蓋狀態(tài)(四個(gè)車(chē)門(mén)開(kāi)關(guān)、發(fā)動(dòng)機蓋開(kāi)關(guān)、行李箱開(kāi)關(guān))全部為關(guān)閉狀態(tài)且點(diǎn)火信號無(wú)效時(shí)才能安全鎖車(chē)。安全鎖車(chē)后進(jìn)入防盜狀態(tài),對四門(mén)兩蓋狀態(tài)及點(diǎn)火信號進(jìn)行監測【2】,如果未經(jīng)解鎖動(dòng)作而檢測到車(chē)門(mén)或行李箱或發(fā)動(dòng)機蓋被打開(kāi),則認為是非法進(jìn)入,如果檢測到點(diǎn)火信號有效,則認為是非法點(diǎn)火,這時(shí)通過(guò)喇叭和轉向燈啟動(dòng)聲光報警,進(jìn)行解鎖動(dòng)作或者在5秒中內檢測到點(diǎn)火鑰匙ON/OFF切換兩次,停止報警回到正常狀態(tài)。ATA結構如圖1所示:
圖1:ATA結構示意圖
Figure 1:ATA Structure Schematic
ATA單元在鑰匙鎖車(chē)和解鎖動(dòng)作下進(jìn)行門(mén)鎖控制的同時(shí),以狀態(tài)機的形式實(shí)現防盜報警狀態(tài)的跳轉,同時(shí)伴隨著(zhù)一些警示動(dòng)作向用戶(hù)提示當前的車(chē)身狀態(tài),下面首先對防盜報警狀態(tài)及其跳轉進(jìn)行分析,描述狀態(tài)跳轉的過(guò)程,然后描述車(chē)身狀態(tài)警示動(dòng)作的設計。
ATA狀態(tài)機設計:
根據汽車(chē)使用方式和安全防盜的需要,設計以下幾個(gè)狀態(tài):正常狀態(tài)NORMAL、防盜狀態(tài)SECURITY、等待退出防盜狀態(tài)QUIT_SECURITY、報警狀態(tài)ALARM,正常狀態(tài)對應汽車(chē)被正常使用的狀態(tài),防盜狀態(tài)對應安全鎖車(chē)后的狀態(tài),等待退出防盜狀態(tài)是個(gè)中間暫態(tài),對應在防盜狀態(tài)中,用戶(hù)解鎖車(chē)門(mén)而不打開(kāi)的情況,報警狀態(tài)對應非法進(jìn)入或非法點(diǎn)火的狀態(tài)。下面以狀態(tài)機的方式介紹下這四種ATA狀態(tài)的跳轉。狀態(tài)圖如圖2所示:
圖2 ATA狀態(tài)圖
Figure 2:ATA State diagram
在四門(mén)兩蓋全閉、點(diǎn)火信號無(wú)效的條件下,鑰匙遙控閉鎖或前門(mén)閉鎖,ATA進(jìn)入SECURITY狀態(tài),此時(shí)啟動(dòng)對車(chē)身狀態(tài)和解鎖動(dòng)作的監測;在SECURITY狀態(tài)下檢測到四門(mén)兩蓋打開(kāi)或點(diǎn)火信號有效,進(jìn)入ALARM狀態(tài),這時(shí)啟動(dòng)聲光報警,在SECURITY狀態(tài)下解鎖,進(jìn)入QUIT_SECURITY狀態(tài);QUIT_SECURITY是一個(gè)中間暫態(tài),它至多維持20s時(shí)間,超時(shí)則自動(dòng)閉鎖并再次進(jìn)入SECURITY狀態(tài),這樣可以防止用戶(hù)誤按遙控解鎖鍵帶來(lái)的安全性問(wèn)題,如果在此期間車(chē)門(mén)打開(kāi),則進(jìn)入NORMAL狀態(tài);在A(yíng)LARM狀態(tài)下,報警一個(gè)循環(huán)后檢測到四門(mén)兩蓋全閉且點(diǎn)火信號無(wú)效,返回SECURITY狀態(tài),也可以通過(guò)解鎖或者在5S內點(diǎn)火信號ON/OFF切換兩次而進(jìn)入正常狀態(tài)。具體代碼設計在此不再贅述。
ATA警示動(dòng)作:
由ATA狀態(tài)機可以看出,狀態(tài)跳轉的條件為解鎖閉鎖動(dòng)作、四門(mén)兩蓋狀態(tài)和點(diǎn)火信號,ATA需要在狀態(tài)跳轉的過(guò)程中根據這些條件進(jìn)行相應的提示和警示【3】。
在鎖車(chē)時(shí),根據四門(mén)兩蓋狀態(tài)以及點(diǎn)火信號,判斷是否可以安全鎖車(chē),如果可以,則執行閉鎖動(dòng)作,同時(shí)轉向燈閃爍一次、喇叭鳴響一次;如果四門(mén)兩蓋存在打開(kāi)或微開(kāi)的狀況,不執行閉鎖動(dòng)作,同時(shí)轉向燈閃爍三次、喇叭鳴響三次,提示車(chē)主檢查某個(gè)未關(guān)上的車(chē)門(mén)或行李箱或發(fā)動(dòng)機蓋。解鎖則比較簡(jiǎn)單,轉向燈閃爍兩次以示區別即可。
在安全鎖車(chē)進(jìn)入防盜狀態(tài)后,BCM進(jìn)入低功耗模式,同時(shí)使能四門(mén)兩蓋及點(diǎn)火信號的開(kāi)關(guān)中斷喚醒功能,當存在非法進(jìn)入或非法點(diǎn)火的情況,會(huì )通過(guò)四門(mén)兩蓋或點(diǎn)火信號的開(kāi)關(guān)狀態(tài)體現出來(lái),這時(shí)喚醒CPU,同時(shí)啟動(dòng)聲光報警-轉向燈閃爍、喇叭鳴叫40s,循環(huán)四次,退出報警狀態(tài)則停止聲光報警。
對于四種ATA狀態(tài),則通過(guò)一個(gè)功率非常小的報警LED燈的閃爍方式進(jìn)行區分,NORMAL狀態(tài)下LED熄滅,SECURITY狀態(tài)和ALARM狀態(tài)采取周期為4s、占空比為10%的PWM方式閃爍,在暫態(tài)QUIT_SECURITY狀態(tài)下,LED以200ms為周期快速閃爍。
下面給出喇叭警示相關(guān)的代碼,其中喇叭控制DrivePort和時(shí)間計時(shí)部分的代碼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;
}
}
}
安全鎖車(chē)
安全鎖車(chē)是ATA單元的一個(gè)重要組成部分,如圖2所示,它也是進(jìn)入防盜狀態(tài)的關(guān)鍵觸發(fā)條件。在四門(mén)兩蓋全閉、點(diǎn)火信號無(wú)效的條件下,按下遙控閉鎖開(kāi)關(guān)或轉動(dòng)前門(mén)鑰匙孔可以觸發(fā)安全鎖車(chē)。為了避免誤鎖車(chē),需要對前門(mén)鑰匙閉鎖開(kāi)關(guān)和遙控閉鎖開(kāi)關(guān)進(jìn)行一定的消抖和過(guò)濾,同樣的情況也適用于解鎖操作,誤解鎖對于汽車(chē)安全的影響不言而喻【5】。
對于A(yíng)TA單元來(lái)說(shuō),前門(mén)鑰匙閉鎖開(kāi)關(guān)是一個(gè)物理開(kāi)關(guān)信號,遙控閉鎖開(kāi)關(guān)按下時(shí)每隔一定周期會(huì )發(fā)送相應的RF報文,在一定時(shí)間間隔內檢測是否存在遙控閉鎖開(kāi)關(guān)按下的RF報文可以判斷該開(kāi)關(guān)是按下?tīng)顟B(tài)還是松開(kāi)狀態(tài),把它們統一為開(kāi)關(guān)信號,邏輯上對應以下三個(gè)變量:switch_state開(kāi)關(guān)狀態(tài)、swon_event無(wú)效到有效的變化、swoff_event有效到無(wú)效的變化【6】,需要閉鎖開(kāi)關(guān)維持150ms的按下時(shí)間,才認為是有效的閉鎖信號,該部分的消抖程序原理是統計開(kāi)關(guān)按下的維持時(shí)間是否超過(guò)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;
}
當開(kāi)關(guān)按下,啟動(dòng)150ms的定時(shí)器,定時(shí)器超時(shí),CountOver=1,這時(shí)判斷開(kāi)關(guān)在此150ms期間的有效次數ValidTimes是否為1,便可以判斷是否有效的閉鎖信號。
結語(yǔ)
本文設計的ATA單元以人機操作和汽車(chē)狀態(tài)兩個(gè)方面交互推進(jìn)車(chē)身防盜報警狀態(tài)的流轉,邏輯嚴密,功能設計合理,準確報警并有效避免了誤報,是一個(gè)很好的防盜報警解決方案,有很好的實(shí)用價(jià)值和借鑒意義。
評論