摘 要:為了準(zhǔn)備第三屆“飛思卡爾杯全國(guó)大學(xué)生智能汽車(chē)競(jìng)賽”,針對(duì)智能汽車(chē)比賽計(jì)時(shí)的問(wèn)題,設(shè)計(jì)制作了一種單賽道智能小車(chē)計(jì)時(shí)器。采用對(duì)射式光電開(kāi)關(guān)作為傳感器,巧妙地運(yùn)用MAX232的DC/DC轉(zhuǎn)換器功能,利用RS 232接口輸入脈沖信號(hào)計(jì)時(shí),完成硬件接口電路。采用C++.NET編程,設(shè)計(jì)完成智能車(chē)計(jì)時(shí)控制程序。該計(jì)時(shí)器硬件線路簡(jiǎn)單,成本低廉,實(shí)際應(yīng)用效果良好,可以廣泛應(yīng)用于智能賽車(chē)競(jìng)賽和性能測(cè)試研究。
關(guān)鍵詞:計(jì)時(shí)器;智能車(chē)競(jìng)賽;串行接口;光電開(kāi)關(guān)
中圖分類(lèi)號(hào):TP391文獻(xiàn)標(biāo)識(shí)碼:B文章編號(hào):1004373X(2008)1919203
Timer for Intelligent Car
OU Yiwen1,HAN Yi2,WANG Guiping1
(1.School of Electronic and Control Engineering,Chang′an University,Xi′an,710062,China;2.School of Automobile,Chang′an University,Xi′an,710062,China)
Abstract:Preparing for the third\"Freescale Cup National Undergraduates Intelligent Car Contest\",a timer is manufactured to solve the problem of timing.A photoelectric switch is used as a sensor to give the signal of timing pulse to computer via serial port.The Max232, which has dual charge-pump DC-DC voltage converters,C++.NET is used to programme.The timer is inexpensive and do work well.
Keywords:timer;intelligent car contest;serial port;photoelectric switch
1 引 言
為了加強(qiáng)大學(xué)生實(shí)踐創(chuàng)新能力和團(tuán)隊(duì)精神,培養(yǎng)面向未來(lái)的科技尖端人才,教育部在已舉辦全國(guó)數(shù)學(xué)建模、電子設(shè)計(jì)、機(jī)械設(shè)計(jì)、結(jié)構(gòu)設(shè)計(jì)4大專業(yè)競(jìng)賽的基礎(chǔ)上設(shè)立了第5項(xiàng)大學(xué)生設(shè)計(jì)競(jìng)賽——全國(guó)大學(xué)生智能汽車(chē)競(jìng)賽。由于目前市場(chǎng)上專用的電子計(jì)時(shí)器價(jià)格較高,一般院校經(jīng)費(fèi)有限,難于購(gòu)買(mǎi),通常采用秒表計(jì)時(shí),由于人反應(yīng)時(shí)間的限制及秒表本身的精度不高,計(jì)時(shí)精度較差。針對(duì)智能汽車(chē)比賽計(jì)時(shí)的問(wèn)題,充分利用調(diào)試所用PC機(jī)資源,設(shè)計(jì)制作了一種價(jià)格便宜、計(jì)時(shí)準(zhǔn)確的智能汽車(chē)競(jìng)賽用計(jì)時(shí)器。
該計(jì)時(shí)器巧妙地運(yùn)用MAX232的DC/DC轉(zhuǎn)換器功能和PC機(jī)RS 232接口中的CTS端輸入計(jì)時(shí)脈沖,采用C++.NET編程,設(shè)計(jì)完成單賽道智能車(chē)計(jì)時(shí)控制程序,線路設(shè)計(jì)簡(jiǎn)單明了,經(jīng)實(shí)際使用性能可靠,使用方便,成本低廉。
2 硬件構(gòu)成
如圖1所示,計(jì)時(shí)器主要由光電傳感器、電平轉(zhuǎn)換電路、電源和PC機(jī)組成。由于RS 232信號(hào)的電平為:邏輯1(MARK)=-3~-15 V,邏輯0(SPACE)=+3~+15 V,而光電傳感器的輸出在0~+5 V之間,因此光電傳感器的輸出脈沖必須先經(jīng)過(guò)轉(zhuǎn)換電路,再?gòu)腞S 232輸入PC機(jī)。PC機(jī)檢測(cè)到串口狀態(tài)的改變,控制計(jì)時(shí)器的開(kāi)、關(guān)。

光電傳感器采用對(duì)射式光電開(kāi)關(guān),它包含了在結(jié)構(gòu)上相互分離且光軸相對(duì)放置的發(fā)射器和接收器,發(fā)射器發(fā)出的光線直接進(jìn)入接收器,當(dāng)被檢測(cè)物體經(jīng)過(guò)發(fā)射器和接收器之間且阻斷光線時(shí),光電開(kāi)關(guān)就產(chǎn)生了開(kāi)關(guān)信號(hào)[2 ]。計(jì)時(shí)器采用南海振華電子廠的PT-A光電開(kāi)關(guān),經(jīng)實(shí)際測(cè)量,當(dāng)供電10 V時(shí),如果接收器與發(fā)射器之間沒(méi)有障礙物阻擋,輸出高電平+3.57 V,如果有障礙物阻擋,則輸出0 V。
由于光電開(kāi)關(guān)輸出負(fù)脈沖,即小車(chē)經(jīng)過(guò)計(jì)時(shí)區(qū)時(shí)的信號(hào)電平為低電平,必須利用三極管和繼電器的常閉觸點(diǎn)將負(fù)脈沖進(jìn)行翻轉(zhuǎn),并轉(zhuǎn)換成串口可識(shí)別的高低電平,做為計(jì)時(shí)脈沖從RS 232的CTS針腳輸入PC機(jī),電路連接如圖2所示,其中1為繼電器,2為光電開(kāi)關(guān)。從圖中可以看出,電路需要三種電源,分別為+5 V和±10 V。一般來(lái)說(shuō),電路應(yīng)盡量使用單電源,考慮到串口電平的要求和電路的簡(jiǎn)單化,可以利用MAX232的DC/DC轉(zhuǎn)換器功能得到±10 V的電壓。
MAX232芯片是Maxim公司生產(chǎn)的低功耗、單5 V電源供電、雙RS 232發(fā)送/接收器,它的內(nèi)部包含了+5 V及±10 V的兩個(gè)電荷泵電壓轉(zhuǎn)換器,可以把輸入的+5 V轉(zhuǎn)換成RS 232所需的±10 V電壓。MAX232可以從+10 V(V+)和-10 V(V-)輸出端獲取少量的電源功率,為外部電路供電。由于V+、V-未經(jīng)穩(wěn)壓,輸出電壓會(huì)隨負(fù)載電流的增大而下降,當(dāng)V+、V-為外部電路提供電流時(shí),不能使V+、V-低于EIA/TIA-232E驅(qū)動(dòng)器輸出電壓最小值±5 V的限制[1,5]。實(shí)驗(yàn)結(jié)果顯示,當(dāng)MAX232為光電開(kāi)關(guān)提供工作電流時(shí),V+降為+8 V,V-為-10 V,電壓范圍大于±5 V,因此可以用MAX232驅(qū)動(dòng)光電開(kāi)關(guān)。

3 軟件設(shè)計(jì)
串口是常用的計(jì)算機(jī)與外部串行設(shè)備之間的數(shù)據(jù)通道。實(shí)現(xiàn)串口通信有多種方法[4~9],并且各有優(yōu)缺點(diǎn),考慮到計(jì)時(shí)信號(hào)是單脈沖信號(hào),可以從串口的某一個(gè)針腳輸入,而不是數(shù)據(jù)的接收和發(fā)送,可以通過(guò)檢測(cè)串口針腳的狀態(tài)來(lái)得到計(jì)時(shí)脈沖信號(hào)。
在C++.NET中,有一個(gè)GetCommModemStatus()函數(shù)可以檢測(cè)串口4個(gè)針腳的狀態(tài),具體返回值如表1所示。
經(jīng)過(guò)選擇,計(jì)時(shí)器采用CTS針腳作為信號(hào)輸入端, PC機(jī)通過(guò)不斷檢測(cè)CTS針腳的狀態(tài)來(lái)得到計(jì)時(shí)脈沖。設(shè)計(jì)流程如圖3所示。
在C++.NET中提供了很多時(shí)間控制函數(shù),在要求誤差不大于1 ms的情況下,可以采用GetTickCount()函數(shù),該函數(shù)的返回值是DWORD型,表示以ms為單位的計(jì)算機(jī)啟動(dòng)后經(jīng)歷的時(shí)間。比賽開(kāi)始時(shí)調(diào)用一次GetTickCount(),得到時(shí)刻T1,到達(dá)終點(diǎn)后再調(diào)用一次GetTickCount(),得到時(shí)刻T2,T2-T1的時(shí)間差即為小車(chē)跑完一圈所用的時(shí)間。計(jì)時(shí)開(kāi)始前先用CreateFile()打開(kāi)串口,計(jì)時(shí)脈沖從CTS輸入PC機(jī)。

程序原代碼如下:
main()
{…
m_hcomm=CreateFile(m_comm,GENERIC_READ,0,NULL,OPEN_EXISTING,F(xiàn)ILEFLAG_OVERLAPPED,NULL);//打開(kāi)串口
GetCommModemStatus(m_hcomm, status);
if(status==0) return;
if(status MS_CTS_ON)//開(kāi)始計(jì)時(shí)
{k=::GetTickCount();
mm= float(k)/1000;
}
SetTimer(1,10,TimerProc);
…
}
void CALLBACK TimerProc(HWND hWnd,UINT nMsg,UINT nTimerid,DWORD dwTime)//回調(diào)函數(shù)
{ k=::GetTickCount();
ss=float(k)/1000-mm;
s.Format(\"%.3f\",ss);
SetDlgItemText(hWnd,IDCEDIT1,s);
}
為了能實(shí)時(shí)顯示時(shí)間的變化,可以使用SetTimer(1,10,TimerProc)函數(shù),每隔一段時(shí)間刷新顯示小車(chē)賽跑時(shí)間的變化。計(jì)時(shí)結(jié)束后調(diào)用KillTimer(1)關(guān)閉計(jì)時(shí)器,同時(shí)調(diào)用CloseHandle (m_hcomm)關(guān)閉串口。
4 去抖動(dòng)方法
在實(shí)驗(yàn)中發(fā)現(xiàn),由于小車(chē)車(chē)體的不規(guī)則,在小車(chē)經(jīng)過(guò)計(jì)時(shí)區(qū)時(shí),CTS針腳的輸入信號(hào)會(huì)出現(xiàn)抖動(dòng)脈沖,如圖4所示。

為了消除抖動(dòng)脈沖的影響,可以有兩種方法,一是使用Sleep()函數(shù)的延時(shí)功能,在檢測(cè)到高電平后,延時(shí)一段時(shí)間,再次檢測(cè)CTS針腳,如果仍是高電平,則記錄時(shí)間,否則為抖動(dòng)脈沖。由于Sleep()函數(shù)不僅使TimerProc線程暫停,同時(shí)還使整個(gè)程序進(jìn)程暫停,影響了程序的界面操作,因此采用第二種方法。首先假設(shè)車(chē)體經(jīng)過(guò)計(jì)時(shí)區(qū)所需時(shí)間不大于4 s,當(dāng)?shù)谝粋€(gè)高脈沖到來(lái)時(shí),記錄下時(shí)間為T(mén)1,將第二個(gè)高脈沖到來(lái)的時(shí)間記為T(mén)2,如果T3-T1小于4 s,則認(rèn)為是抖動(dòng)脈沖,如果T2-T1大于4 s,則將結(jié)果記錄下來(lái)作為比賽成績(jī)輸出顯示。代碼如下:
//將脈沖上升沿作為計(jì)時(shí)信號(hào)
if(status==0){ di=1;gao=0;}
if(MS_CTS_ON status) gao=1;
if(di==1gao==1){ii++;di=2;}
//第一圈的成績(jī)
if(ii==2di==2)
{chengji[1]=ss;
if(chengji[1]<4){ii=1;di=0;}
else
{show.Format(\"%.3f\",chengji[1]);
SetDlgItemText(hWnd,IDC_EDIT2,show);
di=0;return;
}
}
5 結(jié) 語(yǔ)
這款智能車(chē)計(jì)時(shí)器采用計(jì)算機(jī)進(jìn)行計(jì)時(shí)處理,充分利用了計(jì)算機(jī)內(nèi)部時(shí)鐘計(jì)時(shí)的高精度,而且通過(guò)計(jì)算機(jī)也可以很方便地選擇串口和設(shè)定賽車(chē)比賽圈數(shù)。實(shí)際使用證明,該智能車(chē)計(jì)時(shí)器具有操作簡(jiǎn)單,方便易用,可長(zhǎng)時(shí)間工作,輸出可視化的優(yōu)點(diǎn),同時(shí)計(jì)時(shí)精度高,成本低廉,滿足比賽訓(xùn)練與計(jì)時(shí)的要求,可以廣泛應(yīng)用于智能賽車(chē)競(jìng)賽和性能測(cè)試研究。
參考文獻(xiàn)
[1]MAXIM +5V-Powered,Multichannel RS 232 Drivers/Receivers[EB/OL].http://cn.ic-on-line.cn/IOL/viewpdf/MAX232CPE1664.htm.
[2]光電開(kāi)關(guān)應(yīng)用簡(jiǎn)介[DB/OL].http://www.ttet.cn/Article/JYXUYINGYONG/quanganqi/200709/6037.html.
[3]李雪梅.用51單片機(jī)制作加、減計(jì)時(shí)器[J].電子制作,2007(4):24-25.
[4]劉艷玲.采用MAX232實(shí)現(xiàn)MCS-51單片機(jī)與PC機(jī)的通信[J].天津理工學(xué)院學(xué)報(bào),1999,15(2):57-61.
[5]徐興元,沈憲章,甕嘉民.PC機(jī)與單片機(jī)串行通信的一種新方法[J].礦山機(jī)械,2005(1):64-65.
[6]王宏偉,吳建設(shè).基于VC++6.0的串行通信設(shè)計(jì)與實(shí)現(xiàn)[J].黃石高等專科學(xué)校學(xué)報(bào),2003,19(2):16-19.
[7]曹連民,石健,黃德杰.VC++中實(shí)現(xiàn)PC機(jī)與單片機(jī)的串行通訊[J].山東科技大學(xué)學(xué)報(bào):自然科學(xué)版,2003(1):100-102.
[8]王琳瑯,張伯珩,邊川平.Windows環(huán)境下PC機(jī)與單片機(jī)串行通信的實(shí)現(xiàn)[J].現(xiàn)代電子技術(shù),2004,27(3):81-83.
[9]曾自強(qiáng),王玉菡.用VC++實(shí)現(xiàn)單片機(jī)與PC機(jī)串口通信的三種方法[J].自動(dòng)化與儀器儀表,2005(3):60-63.
[10]鄭阿奇,丁有和,劉毅.Visual C++.NET程序設(shè)計(jì)教程[M].北京:機(jī)械工業(yè)出版社,2005.
作者簡(jiǎn)介 歐意文 女,1986年出生,長(zhǎng)安大學(xué)電子與控制工程學(xué)院學(xué)生。
韓 毅 男,1975年出生,博士,主要研究領(lǐng)域?yàn)闄C(jī)電一體化與項(xiàng)目管理。
汪貴平 男,1963年出生,教授,碩士研究生導(dǎo)師,主要研究方向是智能測(cè)控。