|
51hei論壇是我們學(xué)習(xí)嵌入式的非常好的平臺(tái),大家不要亂發(fā)水貼,影響交流氛圍.
單片機(jī)實(shí)踐之閉門造車 安徽師范大學(xué) 07級(jí)電子信息工程
一、造車綜述
從2003年全國電子設(shè)計(jì)大賽以來智能小車一直備受青睞,大家都在前人的基礎(chǔ)上紛紛亮出自己的得意之作。且大部分是以循跡小車為主題,主控芯片自然是用的贊助商提供的片子為多。其中飛思卡爾、MPS430等都是智能小車的熱門主控芯片,甚者有采用FPGA、DSP、ARM來做控制臺(tái)的,個(gè)人覺得Cortex-M3很適合,不過既然是單片機(jī)實(shí)踐自然要從基礎(chǔ)的做起,這樣以后也可以很方便的移植到Cortex-M3上。而此文為大家介紹的是采用STC12C5A60S2為主控芯片,STC89S52為從處理器搭建的智能小車平臺(tái)。
簡單介紹一下智能小車平臺(tái)需要實(shí)現(xiàn)的功能:上位機(jī)無線遙控可發(fā)送速度、轉(zhuǎn)向、行車時(shí)間、軌跡、測距、自動(dòng)蔽障等控制命令,同時(shí)可以反饋實(shí)時(shí)速度、距離、電源電壓、功率等狀態(tài)數(shù)據(jù)。
二、總體方案
測速采用光電管或者霍爾傳感器來實(shí)現(xiàn),而這些傳感器的待處理信號(hào)都是開關(guān)量也就是周期性的脈沖,故測速需要占用兩只定時(shí)器。測距離目前常用的有超聲波測距、紅外測距兩種,這兩種方案都至少占用一只定時(shí)器。電機(jī)調(diào)速采用PWM信號(hào),如果采用定時(shí)器來產(chǎn)生PWM信號(hào)的話又需要占用一只定時(shí)器。再算上一些串行口、定時(shí)器查詢等估計(jì)別說是普通的AT89S52就連AVR的片子也很吃力,所以采用兩片單片機(jī)也變得合情合理了。而且也為以后擴(kuò)展其他信號(hào)傳感器提供接口。一般片級(jí)通信多是采用SPI通信,51的片子很少有支持,所以大部分SPI多是軟件模擬的(某些串行的AD轉(zhuǎn)換)。不過這里要是使用模擬的SPI來實(shí)現(xiàn)片級(jí)通信的話會(huì)由于沒有SPI中斷給通信帶來很大的局限性,或者有些人會(huì)想到使用定時(shí)器中斷來查詢實(shí)現(xiàn)軟件模擬的SPI片級(jí)通信,而這樣又會(huì)占用定時(shí)器(不考慮定時(shí)器服用的情況下)。分析考慮所需的資源,最終選取STC12C5A60S2作為主控制器,該芯片自帶2路PWM控制器、2個(gè)定時(shí)器、2個(gè)串行口支持獨(dú)立的波特率發(fā)生器、3路可編程時(shí)鐘輸出、10位AD轉(zhuǎn)換器、一個(gè)SPI接口等。
測速模塊掛在STC12C5A60S2上面并配置一路PWM輸出至直流電機(jī)驅(qū)動(dòng)模塊(后輪驅(qū)動(dòng)),同時(shí)通過光耦隔離控制直流電機(jī)轉(zhuǎn)向以及步進(jìn)電機(jī)步進(jìn)節(jié)拍。STC89S52負(fù)責(zé)超聲測距通過串行口發(fā)送至STC12C5A60S2。主控芯片綜合處理各方面的信息,通過另一個(gè)串行口與PC機(jī)通信。無線模塊最初采用自帶串行接口的藍(lán)牙模塊,但由于藍(lán)牙距離不夠、重啟系統(tǒng)需重新配置等原因后期采用NRF2401來替代。總體結(jié)構(gòu)框圖如下(采用Microsoft Office Visio繪制)
三、硬件原理
1、電機(jī)驅(qū)動(dòng):
智能小車采用12V直流電機(jī)為后輪驅(qū)動(dòng)力,6V步進(jìn)電機(jī)為前輪轉(zhuǎn)向控制提供動(dòng)力,故智能車平臺(tái)需驅(qū)動(dòng)12V直流電機(jī)和6V步進(jìn)電機(jī)。由于需要控制小車的車速以及小車行駛的方向(包括轉(zhuǎn)向以及前進(jìn)、后退、停車),直流電機(jī)驅(qū)動(dòng)采用常用的H橋電路,通過控制信號(hào)選通對(duì)管與否實(shí)現(xiàn)電機(jī)的正反轉(zhuǎn),并改變所加電壓的占空比來改變電機(jī)轉(zhuǎn)速。這里采用電機(jī)驅(qū)動(dòng)專用芯片L298N,該芯片可驅(qū)動(dòng)兩路5-36V的直流電機(jī)或者一路四拍的步進(jìn)電機(jī)。同時(shí)在L298N與主控芯片間通過四路光耦TLP521-4隔離消除干擾信號(hào)。
搭建好電路后不要直接在小車上調(diào)試,外界一只相同電壓的電機(jī)測試模塊。在STC12C5A60S2上配置好串口、PWM,實(shí)現(xiàn)串口接收的數(shù)據(jù)直接賦值給PWM定時(shí)器CCAP1L、CCAP1H。利用串口調(diào)試助手發(fā)送控制信息給STC12C5A60S2,同時(shí)輔助外界電源更改L298N的IN1和IN2,共同完成L298N電機(jī)驅(qū)動(dòng)模塊的調(diào)試。
2、光電對(duì)管測速
光電對(duì)管采用TCRT5000,由一只特殊的發(fā)光二極管和光電三極管構(gòu)成,當(dāng)二極管發(fā)出的光打在光電三極管的基極B上時(shí)三極管CE導(dǎo)通。而正常情況下二極管的光不能到達(dá)光電管的基極上,故通過在車輪上貼反射片即可實(shí)現(xiàn)對(duì)小車的測速。假設(shè)車輪均勻貼有n片反射片,測得光電三極管的輸出脈沖頻率為f,則車速=f/n。為了提高測速的精度,在信號(hào)后級(jí)添加比較器調(diào)理信號(hào)為標(biāo)準(zhǔn)的方波,調(diào)節(jié)比較器運(yùn)放的偏置電壓使方波信號(hào)最適合于測速。
同樣適用外界電機(jī)(已配有自制的編碼盤),給電機(jī)加電讓其帶動(dòng)編碼盤旋轉(zhuǎn),將光電對(duì)管靠近編碼盤,用示波器觀測輸出脈沖信號(hào)的有無與好壞,調(diào)節(jié)比較器偏置電壓使脈沖最接近于方波且幅度大于3.3V。
3、超聲測距
超聲波測距的方法有多種:如往返時(shí)間檢測法、相位檢測法、聲波幅值檢測法。本設(shè)計(jì)采用往返時(shí)間檢測法測距。其原理是超聲波傳感器發(fā)射一定頻率的超聲波,借助空氣媒質(zhì)傳播,到達(dá)測量目標(biāo)或障礙物后反射回來,經(jīng)反射后由超聲波接收器接收脈沖,其所經(jīng)歷的時(shí)間即往返時(shí)間,往返時(shí)間與超聲波傳播的路程的遠(yuǎn)近有關(guān)。測試傳輸時(shí)間可以得出距離。假定s為被測物體到測距儀之間的距離,測得的時(shí)間為T,超聲波傳播速度為V表示,則有關(guān)系式S=VT/2 。
超聲波發(fā)射部分是為了讓超聲波發(fā)射換能器TCT40-16T能向外界發(fā)出40 kHz左右的方波脈沖信號(hào)。編程由單片機(jī)端口輸出40 kHz左右的方波脈沖信號(hào),由于單片機(jī)端口輸出功率不夠,40 kHz方波脈沖信號(hào)分成兩路,送給一個(gè)由74HC04組成的推挽式電路進(jìn)行功率放大以便使發(fā)射距離足夠遠(yuǎn),滿足測量距離要求,最后送給超聲波發(fā)射換能器TCT40-16T以聲波形式發(fā)射到空氣中。發(fā)射部分的電路,如圖4所示。圖中輸出端上拉電阻R31,R32,一方面可以提高反向器74HC04輸出高電平的驅(qū)動(dòng)能力,另一方面可以增加超聲換能器的阻尼效果,縮短其自由振蕩的時(shí)間。
上述TCT40-16T發(fā)射的在空氣中傳播,遇到障礙物就會(huì)返回,超聲波接收部分是為了將反射波(回波)順利接收到超聲波接收換能器TCT40-16R進(jìn)行轉(zhuǎn)換變成電信號(hào),并對(duì)此電信號(hào)進(jìn)行放大、濾波、整形等處理后,這里用索尼公司生產(chǎn)的集成芯片CX20106,得到一個(gè)負(fù)脈沖送給單片機(jī)的INT0引腳,以產(chǎn)生一個(gè)中斷。
接在CX20106的第五腳上的電阻,用以設(shè)置帶通濾波器的中心頻率f0,阻值越大,中心頻率越低。電路中采用一只粗調(diào)的可變電阻和一只精密調(diào)節(jié)的電阻串聯(lián)而成。調(diào)節(jié)函數(shù)信號(hào)發(fā)生器產(chǎn)生40K的方波,接在超聲發(fā)射電路的輸入端,同時(shí)用示波器觀測超聲接收電路的輸出端。用書本等模擬障礙物,調(diào)節(jié)兩只電阻觀測示波器看接收端否會(huì)產(chǎn)生電平跳變。
若產(chǎn)生跳變則發(fā)射與接收電路調(diào)試完成。
4、電源模塊
對(duì)于小車而言電源是整個(gè)系統(tǒng)的咽喉,考慮到體積、重量、電能容量等。這里我們選取8節(jié)1.5V鋰電池串聯(lián)起來作為總電源輸出(12V),采用LM78L05、LM317構(gòu)成整個(gè)電源模塊。
5、無線通信模塊
無線通信采用現(xiàn)成的串行接口的藍(lán)牙模塊,只需要配置主從機(jī)、信道、通信密鑰、波特率即可實(shí)現(xiàn)無線串行通信。這樣PC和主控STC12C5A60S2只需將通信理解為串行通信,給程序構(gòu)架帶來便利。不過需要考慮通信接口的問題:STC12C5A60S2是5V電壓供電,TXD和RXD的通信電信號(hào)自然是以5V為參考電平;藍(lán)牙模塊是3.3V電壓供電,TXD和RXD的通信電信號(hào)自然是以3.3V為參考電平。所以我們需要添加電平轉(zhuǎn)換,實(shí)現(xiàn)STC12C5A60S2與藍(lán)牙模塊的正常通信。一般電平轉(zhuǎn)換可以使用專用的芯片74xHCT或164245,電阻分壓法、OC/OD 器件法、晶體管上拉電阻法等。不過對(duì)比幾種方案同時(shí)考慮電平兼容、電源次序、速度/頻率、輸出驅(qū)動(dòng)能力等,最終選取晶體管法,電路如下,圖中NPN的管子可以選取8050,1815等,不過倒不是所有的NPN的管子都可行,調(diào)試時(shí)使用9014就不能實(shí)現(xiàn)正常通信,估計(jì)是輸出驅(qū)動(dòng)能力不夠的緣故。由于藍(lán)牙的通信范圍約束,我們還采用射頻NRF2401來實(shí)現(xiàn)遠(yuǎn)距離的無線通信,由于篇幅有限這里不予細(xì)述。
四、軟件構(gòu)架
1、主控STC12C5A60S2
配置STC12C5A60S2定時(shí)器0為定時(shí)器方式2、10ms中斷,定時(shí)器1為計(jì)數(shù)器方式,初值為0。累計(jì)100次定時(shí)器0中斷為1秒,此時(shí)TL1即光電對(duì)管輸入的脈沖頻率,最終Speed=L*TL1/n(n為后輪上反射紙的片數(shù),L為后輪的周長)。同時(shí)在此一秒內(nèi)觸發(fā)AD采集一次電源電壓Voltage送入內(nèi)存。當(dāng)Voltage低于與設(shè)電壓值時(shí)蜂鳴器報(bào)警。
配置STC12C5A60S2串行口2為方式2、獨(dú)立波特率發(fā)生器9600、允許接收中斷。當(dāng)串口2接收到PC機(jī)數(shù)據(jù)轉(zhuǎn)入中斷處理程序,檢測接收到的數(shù)據(jù)最高位,以此來區(qū)分?jǐn)?shù)據(jù)是控制信號(hào)還是速度信息。
配置STC12C5A60S2串行口1為方式1、波特率固定、允許接收中斷。當(dāng)串口1接收到從處理器STC89S52數(shù)據(jù)將轉(zhuǎn)入中斷處理程序,將接收到的數(shù)據(jù)處理后送至主控的內(nèi)存當(dāng)中,以備主控芯片使用,同時(shí)等待PC命令隨時(shí)傳給PC機(jī)控制臺(tái)。
配置STC12C5A60S2脈寬調(diào)制PWM為8位、無中斷。主程序中循環(huán)執(zhí)行PwmContral函數(shù)實(shí)時(shí)更改PWM定時(shí)器CCAP1L、CCAP1H的值。
PwmContral()程序如下(AutoFlags為超聲自動(dòng)調(diào)速標(biāo)志):
uchar Pid(uchar Setpoint,uchar Achieved)
{
float P=5,I=1,D=0.5;
float Eun=0.0,En=0.0,En1=0.0,En2=0.0;
int Output0=0,Output1=50;
En=Setpoint-Achieved;
Eun=P*En-I*(En-En1)+D*(En1-En2);
Eun=Eun/500;
Output0=Output1+(int)Eun;
Output1=Output0;
En2=En1;
En1=En;
return Output0;
}
uchar AutoDistance(uchar D,uchar S)
{
uint Output;
uint t;
t=D/S;
Output=0xff-0.75*t;
return Output;
}
void PwmContral()
{
if(AutoFlags==1)
{
PwmTemp = AutoDistance(Distance,Speed);
if(PwmTemp>256)
PwmTemp=256;
if(PwmTemp<0)
PwmTemp=0;
PwmLower=PwmTemp;
PwmHigher=PwmTemp;
CCAP1L=PwmLower;
CCAP1H=PwmHigher;
}
if(AutoFlags==0)
{
if((Speed-ContralSpeed)<=-100||(Speed-ContralSpeed)>=100)
PwmTemp=Pid(ContralSpeed,Speed);
if(PwmTemp>256)
PwmTemp=256;
if(PwmTemp<0)
PwmTemp=0;
PwmLower=PwmTemp;
PwmHigher=PwmTemp;
CCAP1L=PwmLower;
CCAP1H=PwmHigher;
}
}
2、從處理器STC89S52
配置STC89S52串行口為方式1、波特率固定、允許接收中斷(與主控的串行口1作雙機(jī)通信交換數(shù)據(jù)信息)。此種情況下需將主控芯片與從處理器的晶振選取為同一數(shù)值,這里我們選取12M。若是選取11.0592M會(huì)導(dǎo)致測距的定時(shí)器0和定時(shí)器1算得的時(shí)間不準(zhǔn)確,極大影響測距結(jié)果。同時(shí)主控選取12M晶振的同時(shí)也會(huì)影響它與PC機(jī)之間的雙機(jī)通信,故我們配置STC12C5A60S2的串行口2為獨(dú)立波特率發(fā)生器。
配置STC89S52定時(shí)器0為16為定時(shí)器、初值為0、開定時(shí)器0允許中斷,定時(shí)器1為方式2、中斷產(chǎn)生40K方波、關(guān)定時(shí)器1。定時(shí)器0中斷處理程序中開定時(shí)器1允許中斷、重裝初值。定時(shí)器1中斷處理程序中產(chǎn)生40K方波,通過控制產(chǎn)生2個(gè)脈沖后關(guān)掉定時(shí)器1,開外部中斷0。
外部中斷0處理程序中,關(guān)掉定時(shí)器0、定時(shí)器1和總中斷EA同時(shí)置位接收成功標(biāo)志ReceFlags,最終發(fā)送超聲波到接收到超聲波時(shí)間差為Time=256*TH0+TL0。對(duì)于時(shí)間Time需要作適當(dāng)?shù)男拚a(bǔ)償,帶入Distance=Time*0.017即可得到小車與前方障礙物的距離。將Distance送入STC89S52的內(nèi)存中,以備通過串行口發(fā)送至主控的串行口1。
主程序中等待ReceFlags,當(dāng)接收成功清除標(biāo)志同時(shí)通過短延時(shí)控制測量間隔,也就是再一次發(fā)送2個(gè)脈沖的超聲波時(shí)間。
3、上位機(jī)界面
2.JPG (81.27 KB, 下載次數(shù): 145)
下載附件
2013-7-11 09:40 上傳
采用Visual Baisc6.0編寫智能車控制臺(tái),使用MSCcom串口通信控件實(shí)現(xiàn)數(shù)據(jù)傳輸,實(shí)時(shí)監(jiān)測與控制。
4、雙機(jī)通信
考慮到小車需要實(shí)時(shí)反饋速度以及測得前方的障礙物的距離,同時(shí)需要將居多控制命令發(fā)送給小車。由于主控芯片是8位的片子,串口緩沖區(qū)大小就是1個(gè)字節(jié)(8位數(shù)據(jù)),一般將信息數(shù)據(jù)送入堆棧,不過對(duì)于數(shù)據(jù)處理就變得復(fù)雜了。這里為了便捷我們考慮到速度值和控制命令都可以控制在1字節(jié)以內(nèi),只是需要區(qū)分這些信息而已。這里我們約定控制命令都以最高位為標(biāo)志位,當(dāng)最高位為1時(shí)是控制信息,為0時(shí)是速度信息。同時(shí)考慮到速度會(huì)超過0x7f所以在上位機(jī)上將速度除以2,等待下位機(jī)接收之后再還原。當(dāng)然還需要對(duì)反饋的數(shù)據(jù)流作處理,將速度與上0xfe、距離或上0x01,以此通過最低位來區(qū)分?jǐn)?shù)據(jù)流。
五、造車心得:
小車從規(guī)劃到完工一共花了4天時(shí)間,雖然很普通也沒有什么創(chuàng)新之處,卻也和以往的小車不大一樣。既然上位機(jī)已經(jīng)可以往小車發(fā)送各種控制命令和信息了,那么只要我們在PC端的控制臺(tái)上多花點(diǎn)時(shí)間,小車就有他的價(jià)值所在了。比如說雷區(qū)探雷,在小車上安裝探雷的傳感器,PC機(jī)解析人工提供的路徑為控制命令和信息,按規(guī)律發(fā)送給小車,實(shí)現(xiàn)小車的人工智能。
學(xué)習(xí)單片機(jī)就是需要不停的實(shí)踐,哪怕看起來很簡單的你也需要自己去體會(huì)一下。就拿超聲測距說事,很久以前就有所了解,覺得這玩意太簡單了只不過是測一個(gè)時(shí)間而已(定時(shí)器一開一關(guān)當(dāng)時(shí)就這樣認(rèn)為的)。然而自己去弄了才知道,需要考慮的問題很多,或許你會(huì)想到網(wǎng)上有現(xiàn)成的程序參考一下不就得了。但是如果等下一次你接觸的很少有人研究怎么辦,你去參考誰?有一套自己解決問題的方法比什么都強(qiáng),而這個(gè)就來自多次的——單片機(jī)實(shí)踐。
1、由于文章中有大量的圖片,論壇上傳圖片不太方便所以就上傳一個(gè)pdf版的完整篇啦,各位見諒一下
下載地址:http://www.torrancerestoration.com/f/閉門造車.pdf
2、文中提及的框圖是用Visio畫的,上傳全部框架
下載地址:http://www.torrancerestoration.com/f/框圖Visio.rar
3、第一版本無線采用的是藍(lán)牙傳輸,后來采用nRF2401作為無線傳輸,上傳文檔一篇(自己寫的不要拍磚啊 HoHo)
下載地址:http://www.torrancerestoration.com/f/NR2401無線通信.pdf
上傳程序代碼:
1、小車程序包括STC12C5A60S2和STC89C51的程序,程序框架是我個(gè)人寫的驅(qū)動(dòng)庫Easy Hw OS,反正就是這樣結(jié)構(gòu)我看著舒服移植也很方便,同時(shí)也方便大家看。小弟初學(xué)程序?qū)懙牟缓,望各位多多提點(diǎn)意見,便于我成長,也不枉我敲這么多字,呵呵。
點(diǎn)擊此處下載:http://www.torrancerestoration.com/f/DoubleTransfer.rar
2、nRF2401的程序包,為了方便以后使用采用AT89C2051加上nRF2401構(gòu)成通信節(jié)點(diǎn),很方便的實(shí)現(xiàn)無線串行通信,用戶直接使用無須考慮其他問題。不過2051很少用了,可以在STC中找一款替代的片子,我看了一下一般在1.8元左右的STC片子都可以用來替代,價(jià)格在這擺著呢,相關(guān)的說明請(qǐng)看——NR2401無線通信.pdf。
點(diǎn)擊此處下載:http://www.torrancerestoration.com/f/NFR2401無線串口.rar
3、上位機(jī)控制臺(tái)采用Visual Basic 6.0編寫,程序還沒達(dá)到預(yù)期的功能。是初版的不過模型已經(jīng)搞定了,接下來就是將一系列的命令打包就可以啦,上傳源代碼
點(diǎn)擊此處下載 :http://www.torrancerestoration.com/f/智能車控制臺(tái).rar
|
|