汽車記錄儀數(shù)據(jù)采集系統(tǒng)的設(shè)計(jì)
隨著汽車產(chǎn)業(yè)的迅猛發(fā)展,汽車記錄儀的需求也成倍增長。汽車記錄儀又稱為“汽車黑匣子”,能完整、準(zhǔn)確地記錄汽車行駛狀態(tài)下的各種信息[1],能將汽車的行駛軌跡、制動性能、開關(guān)量信號完整記錄,并能根據(jù)需要隨時調(diào)出數(shù)據(jù)進(jìn)行分析或者通過專用軟件在電腦上再現(xiàn)。它被認(rèn)為是確保汽車安全的有效手段,可以迅速獲取有關(guān)行車數(shù)據(jù),改善營運(yùn)狀況,成為車輛交通管理必不可少的設(shè)備。數(shù)據(jù)采集系統(tǒng)作為汽車記錄儀的重要組成部分直接關(guān)系到記錄儀的各項(xiàng)性能,對記錄儀整體的功能影響甚大。
1 硬件電路結(jié)構(gòu)
1.1 實(shí)時時鐘模塊
由于系統(tǒng)產(chǎn)生的各種數(shù)據(jù)和記錄都與時間密切相關(guān),對時鐘的實(shí)時性要求很高,同時記錄儀本身存在著斷電的危險(xiǎn),為了準(zhǔn)確記錄車輛行駛狀態(tài),并對異常情況進(jìn)行記錄,因此選擇實(shí)時時鐘芯片來提供日期和時間。實(shí)時時鐘芯片是一種不僅能支持每天時間更新,而且能夠進(jìn)行日期更新的永久時鐘電路[2]。本文采用DALLAS公司的DS1302芯片,它性能高、功耗低,時鐘校準(zhǔn)也較為容易,通過3V鋰電池和車內(nèi)蓄電池兩種方式供電,可以保證在蓄電池出現(xiàn)故障的情況下,該時鐘芯片仍然能夠正常工作,從而使記錄儀的數(shù)據(jù)同樣準(zhǔn)確、可靠。其內(nèi)部自帶31B的靜態(tài)RAM,存儲容量滿足應(yīng)用的需要。數(shù)據(jù)在CLK的上升沿串行輸入,在進(jìn)行單字節(jié)或多字節(jié)傳送時,開始的第一個字節(jié)為命令字節(jié),用于指定31個字節(jié)中哪個將被訪問。當(dāng)進(jìn)行任何數(shù)據(jù)傳送時,其最高有效位MSB(位7)必須為邏輯1,如果為零,則禁止寫DS1302。其時鐘電路如圖1所示,Vcc1與3V鋰電池相連,Vcc2與蓄電池相連,5、6、7引腳分別接S3C2410的時鐘端、數(shù)據(jù)端和復(fù)位端,通過主控制器S3C2410對時鐘模塊進(jìn)行統(tǒng)一管理。
1.2 車速采集模塊
記錄儀從車輛啟動開始就不停地對車輛的速度進(jìn)行實(shí)時檢測,并實(shí)時保存。速度是一個模擬變量,是時刻變化的。車速信號通過傳感器以脈沖形式輸入,為了防止周圍環(huán)境及本身的干擾,采用單光耦芯片TLP521,切斷輸入和輸出通道間直接的電信號聯(lián)系,主要就是通過電-光-電的變換將電信號隔離開來。通過屏蔽和光耦隔離,得到波形干凈的信號。為了得到良好的矩形波,使車速測量達(dá)到一定的精度,本系統(tǒng)采用施密特觸發(fā)器LM311來完成波形的整形,信號采集功能完成后,采集到的信號需要送到可編程邏輯器件中進(jìn)一步處理,然后再傳送給主芯片S3C2410,盡量將所有的干擾信號在進(jìn)入主控制器之前降到最低。在實(shí)際控制過程中各種干擾信號是不可避免的,為了盡可能地消除或減少干擾信號對系統(tǒng)的控制作用,除了在系統(tǒng)硬件及環(huán)境方面采取措施以外,在控制算法上也采取了一定的措施來抑制干擾信號的影響,在程序中采用連續(xù)多次采樣求平均值的辦法予以濾波[3]。車速脈沖采集模塊硬件電路如圖2所示。
1.3 開關(guān)量采集模塊
開關(guān)量信號包括方向燈、倒燈、車門、遠(yuǎn)光燈、近光燈、剎車、鳴號、車輛啟動等這類行駛過程中很重要的數(shù)字開關(guān)量,將它們采集并保存下來對事后分析有很大幫助[4]??梢酝ㄟ^ARM芯片的I/O端口對這些信號進(jìn)行輸入。但這些信號是高壓信號,直接接到ARM板上可能會損壞CPU,這里采用光耦芯片TLP521對它們進(jìn)行隔離,避免CPU受損。在S3C2410中,可以通過GPnCON(n是I/O口的組號)寄存器對GPIO引腳的使用功能進(jìn)行設(shè)置。系統(tǒng)每隔0.2s對開關(guān)量信號采集一次,采集來的開關(guān)量可以從GPnDAT寄存器中讀取。芯片的接口方式為4腳SPI,能夠大大減少處理器需要提供的引腳數(shù)量[5]。當(dāng)任一開關(guān)量輸入信號狀態(tài)發(fā)生變化時,通過中斷的方式通知主處理器,從而減輕了處理器頻繁查詢的負(fù)擔(dān)。圖3是一路開關(guān)信號采集電路,其他開關(guān)量電路與此相同。
2 軟件的設(shè)計(jì)
記錄儀數(shù)據(jù)采集系統(tǒng)軟件要求上電復(fù)位后,首先進(jìn)行自檢;然后顯示初始界面(包括當(dāng)前時間、行駛速度等);最后根據(jù)速度傳感器傳過來的脈沖個數(shù)以及持續(xù)時間判斷汽車是否啟動,若未啟動則返回,若已啟動則進(jìn)入各數(shù)據(jù)量的檢測。記錄儀軟件設(shè)計(jì)包括顯示、速度采集、實(shí)時時鐘、開關(guān)量采集、數(shù)據(jù)傳送等, 采集系統(tǒng)軟件流程圖如圖4所示。
汽車記錄儀的初始化函數(shù)主要工作是為設(shè)備分配設(shè)備編號,設(shè)備的存取是通過一組固定的入口點(diǎn)來進(jìn)行的,這套接口函數(shù)是由file_operations結(jié)構(gòu)定義的,汽車記錄儀主要包括以下成員:
Static int _ _init s3c2410_ts_init (void)
{ … …
ret = register_chrdev(0,DEVICE_NAME, &s3c2410_fops);};
static struct file_operations s3c2410_fops = {
owner: THIS_MODULE,
/*指向擁有該結(jié)構(gòu)的模塊的指針*/
open: s3c2410_ts_open, /*打開設(shè)備*/
read: s3c2410_ts_read, /*用來從設(shè)備中讀取數(shù)據(jù)*/
release: s3c2410_ts_release,
/*file結(jié)構(gòu)被釋放時,將調(diào)用這個操作*/
poll: s3c2410_ts_poll,
/*用來查詢讀取或者寫入是否會被阻塞*/
};最后都需要一個清除函數(shù),該函數(shù)在模塊被移除前注銷接口,并向系統(tǒng)中返回所有資源
Static void _ _exit s3c2410_ts_exit (void)
{ ……
unregister_chrdev(tsMajor, DEVICE_NAME);
…… };
設(shè)測速函數(shù)為void mk_int()(void)interrupt()。測量汽車的行駛速度,實(shí)際上就是測量汽車速度傳感器產(chǎn)生的矩形脈沖寬度。測得該脈沖的寬度后,然后根據(jù)公式(1)得出汽車的行駛速度。
K=(convert/(number*wave_width*co))*(real_speed/display_speed) (1)
其中,number表示速度傳感器轉(zhuǎn)一圈產(chǎn)生的脈沖數(shù),wave_width表示每個脈沖低電平的寬度,co代表車輛每行駛1km速度傳感器的轉(zhuǎn)數(shù),real_speed是車輛的標(biāo)稱速度,用于糾正系統(tǒng)誤差,display-speed是車輛的實(shí)測速度,用于糾正系統(tǒng)誤差,convert是車速的轉(zhuǎn)換系數(shù),該系數(shù)與系統(tǒng)的晶體振蕩頻率有關(guān)。其他部分相關(guān)程序如下:
(1)extern void flash_clear( ) extern void s3c2410_4k_clear( )清空S3C2410內(nèi)存中和實(shí)時時鐘芯片中的所有內(nèi)容,這些只是在出廠初始化時使用[6]。
(2)extem void accident_time_record( )記錄每次PC機(jī)上載和下傳操作的時間。
(3)void accident_deal(void)非法關(guān)機(jī)處理程序[7]。記錄儀在運(yùn)行的過程當(dāng)中,很有可能出現(xiàn)人為的或非人為的斷電現(xiàn)象,在這種情況下,為了保證非法關(guān)機(jī)不丟失數(shù)據(jù),在整個程序運(yùn)行期間,描述汽車運(yùn)行狀態(tài)的一些重要的數(shù)據(jù)都保存在S3C2410中,當(dāng)記錄儀一上電時,就可以根據(jù)這些數(shù)據(jù)恢復(fù)到上次非法關(guān)機(jī)時刻的狀態(tài)[8]。
系統(tǒng)通過LCD進(jìn)行人機(jī)交換,其顯示的基本函數(shù)如下:(1)void init_lcd( )LCD初始化程序; (2)void write_cmd(unsigned char cmd) 寫指令到指令寄存器,用來控制顯式模式,設(shè)置顯示寄存器的地址;(3)void write_hc(unsigned int word)寫8位數(shù)據(jù)到顯示寄存器,即顯示16×8點(diǎn)陣的半寬ASCII碼字符;(4)void write_word(unsigned int word) 寫16位數(shù)據(jù)到顯示寄存器;(5)void clear_lcd( )清除LCD顯示屏,并將光標(biāo)移到起始位置。系統(tǒng)的整體軟件結(jié)構(gòu)如圖5所示。
汽車記錄儀是汽車電子化、智能化的一個重要應(yīng)用。本文通過對汽車記錄儀數(shù)據(jù)采集系統(tǒng)的研究,從硬件電路設(shè)計(jì)和軟件分析兩方面對實(shí)時時鐘信號、車速采集信號、開關(guān)量信號分別進(jìn)行了討論,將此數(shù)據(jù)采集系統(tǒng)應(yīng)用于汽車記錄儀中,具有抗干擾能力強(qiáng)、精度高、實(shí)用性好等優(yōu)點(diǎn)。
系統(tǒng)涉及的三個模塊可以分別單獨(dú)修改制做。主板的布線簡單,成本較低。如果以后修改ARM電路板導(dǎo)致主板也需要修改的話可以降低整個系統(tǒng)的修改/升級成本。
系統(tǒng)包含一個掉電預(yù)備電源,當(dāng)出現(xiàn)外部干擾導(dǎo)致記錄儀意外掉電時,該電源能夠迅速觸發(fā)中斷,從而保證實(shí)時數(shù)據(jù)不丟失。
系統(tǒng)主機(jī)模塊采用高效的32位ARM嵌入式處理器為核心,能夠有效地提高系統(tǒng)實(shí)時性。優(yōu)化編寫的代碼對多任務(wù)進(jìn)行了統(tǒng)籌兼顧地合理調(diào)度,有效地保證了實(shí)時性。此外,處理器豐富的內(nèi)外部中斷源的使用為復(fù)雜程序的靈活轉(zhuǎn)換提供了方便,減輕了處理器負(fù)擔(dān)。