電子設(shè)計大賽智能小車步進(jìn)電機(jī)控制.doc
《電子設(shè)計大賽智能小車步進(jìn)電機(jī)控制.doc》由會員分享,可在線閱讀,更多相關(guān)《電子設(shè)計大賽智能小車步進(jìn)電機(jī)控制.doc(20頁珍藏版)》請在裝配圖網(wǎng)上搜索。
第五屆合肥學(xué)院電子設(shè)計大賽 設(shè)計報告 競賽題目:智能電動車(I題) 參賽隊伍:電子信息與電氣工程系 隊員姓名:翁同玖 嚴(yán)旭東 湯川 隊員學(xué)號: 0 7 0 5 0 7 6 0 1 8 0 7 0 5 0 7 6 0 0 5 0 7 0 5 0 7 6 0 1 7 【摘 要】: 本設(shè)計以單片機(jī)作為主控芯片,控制兩個步進(jìn)電機(jī)的正反轉(zhuǎn),實現(xiàn)了小車的不同方向運(yùn)動。利用紅外對管做成的紅外傳感器來檢測路面信息,完成了小車的巡線功能。避障與尋光均采用紅外對管來實現(xiàn)。采用LCD1602液晶顯示屏來顯示時間與路程等信息。 【關(guān)鍵詞】: 巡線 避障 尋光 顯示 Abstract: This design uses single slice of machine as the lord controls chip and control two steps to enter electrical engineering of positive and negative turn, carried out different direction sport of small car.Make use of a red outside to examine a road noodles information to the red unauthorized biography machine that the tube makes into, completed the cruising of small car line function.Avoid Zhang with look for the light all adopt red outside to tube to carry out.Adopt LCD1602 the LCDs show to hold to show informations, such as time and road...etc.. Keyword: Search online Avoid object Search light Show Information 目 錄 1.總體概括 1 2.方案的論證與比較 1 2.1 主控芯片的選擇 1 2.2 智能巡線設(shè)備的選擇 1 2.3 顯示設(shè)備的選擇 2 2.4 聲光信號設(shè)備的選擇 2 3 電路設(shè)計 3 3.1單元電路設(shè)計 3 3.1.1 尋光電路的設(shè)計 3 3.1.2 紅外檢測電路設(shè)計 3 3.1.3 金屬探測電路的設(shè)計 4 3.2 電機(jī)驅(qū)動電路設(shè)計 5 4.軟件設(shè)計 7 4.1主程序流程圖 7 4.2程序清單 8 5.調(diào)試結(jié)果 8 6總結(jié)與體會 8 7.參考文獻(xiàn): 8 1.總體概括 具體的系統(tǒng)方框圖如下所示: 圖1 系統(tǒng)框圖 2.方案的論證與比較 2.1 主控芯片的選擇 方案一:采用單個單片機(jī)作為主控芯片。由于AT89S52具有32個I/O口,能滿足小車各部分對I/O口的需求,另外只用一個單片機(jī)可以很好的控制小車。 方案二:采用雙單片機(jī)作為主控芯片。利用兩塊AT89S52分別對小車的各部分進(jìn)行監(jiān)測和控制,雖然減輕了單個單片機(jī)的負(fù)擔(dān),提高了系統(tǒng)的工作效率,但是存在很多的I/O的資源浪費,并且兩個單片機(jī)不容易控制,所以不采用該方案。使用方案一 2.2 智能巡線設(shè)備的選擇 方案一:采用普通發(fā)光二極管及光敏電阻組成的發(fā)射接收方案。該方案在實際使用時,容易受到外界光源的干擾,有時甚至檢測不到。主要是因為可見光的反射效果跟地表的平坦程度、地表材料的反射情況都有直接關(guān)系。雖然可采取超高亮度發(fā)光二極管降低一定的干擾,但這又增加額外的功率損耗。 方案二:采用反射式紅外對管,雖然易受環(huán)境的影響,識別的可靠程度不高,但是由于其結(jié)構(gòu)簡單,體積小巧,易于安裝,完全能用多個該傳感器構(gòu)成高精度的控制輻射網(wǎng)絡(luò)提高識別的可靠性、準(zhǔn)確性,考慮到實際應(yīng)用環(huán)境,因此我們采用方案二。 2.3 顯示設(shè)備的選擇 方案一:采用傳統(tǒng)數(shù)碼管作為顯示設(shè)備。傳統(tǒng)數(shù)碼管具有低能耗、低損耗、低壓、長壽命、耐老化、防曬、防潮、防火、防高(低)溫的特點;對外界環(huán)境要求低,易于維護(hù);同時其精度比較高,精確可靠,操作簡單,程序編寫容易,資源占用少。本設(shè)計要求顯示的內(nèi)容較多,如果利用傳統(tǒng)數(shù)碼管來顯示,則需要好幾塊數(shù)碼管,這樣占用單片機(jī)很多的I/O口,并且不夠美觀,也不易區(qū)分各塊數(shù)碼管顯示的是什么內(nèi)容。所以,該方案不被采用。 方案二:采用液晶顯示屏(LCD)顯示時間和路程。液晶顯示器具有功耗低、無輻射危險、平面直角顯示以及影像穩(wěn)定等,可視面積大,畫面效果好,也可以顯示漢字,分辨率高,抗干擾能力強(qiáng),顯示內(nèi)容多等特點。因此,只要用一塊液晶顯示器就可以顯示設(shè)計要求的全部內(nèi)容。此外,液晶顯示器與單片機(jī)連接電路較簡單,且占用的I/O口較少。基于以上分析,我們采用該方案,用LCD1602進(jìn)行顯示。 2.4 聲光信號設(shè)備的選擇 本設(shè)計要求小車在直道上檢測到金屬時發(fā)出聲光指示信息,在發(fā)聲方面,我們使用蜂鳴器代替揚(yáng)聲器,因為揚(yáng)聲器功耗比較大,體積也較大,而本設(shè)計對聲音信號要求不高,所以我們使用功耗與體積都較小的蜂鳴器。在發(fā)光方面,我們選擇普通的發(fā)光二極管。 3 電路設(shè)計 3.1單元電路設(shè)計 3.1.1 尋光電路的設(shè)計 該單元電路主要是實現(xiàn)小車尋光入庫,考慮到光源是放在車庫里,而且光源離地面有一定的高度,為了使小車能夠精確駛?cè)霂熘?,我們采用三個光敏傳感器。用金屬支架將三個光敏傳感器固定在車的中間部分,并使光敏傳感器盡可能與光源保持水平,這三個傳感器組成一個120度的扇形,相鄰兩個之間的角度為60度。其中一路如圖所示: 圖2 尋光電路圖 其他兩個電路與此電路相同。接收管未接收到光源發(fā)出的紅外光時,接收管不導(dǎo)通,正向輸入的電壓大于基準(zhǔn)電壓,通過電壓比較器進(jìn)行比較輸出高電平,接收管接收到光源發(fā)出的紅外光后,接收管導(dǎo)通,正向輸入的電壓將會小于基準(zhǔn)電壓,通過電壓比較器進(jìn)行比較輸出低電平。單片機(jī)可直接對接收到的信號進(jìn)行判斷是否檢測到光源,并通過對檢測到的信號進(jìn)行處理來決定小車的運(yùn)動方向。 3.1.2 紅外檢測電路設(shè)計 該設(shè)計采用紅外對管構(gòu)成的紅外傳感器,具體電路如圖所示: 圖3 紅外對管電路 我們在小車的前端底部安裝三對相同的紅外對管,用來檢測地面信號,每個紅外對管都有一個發(fā)射管和一個接收管,發(fā)射管發(fā)射紅外線到地面,如果遇到黑線則光信號會被吸收,否則會被反射回來。檢測到黑線接收管不導(dǎo)通,輸出高電平,否則輸出低電平。單片機(jī)根據(jù)接收到的高低電平來決定小車如何行駛。另外在小車的正前端安裝一對紅外對管,用來檢測前方是否有障礙物。探測原理與檢測地面的原理相同,當(dāng)小車前端的紅外對管發(fā)射出的紅外光線被反射回來時,說明前方有障礙物,此時小車會進(jìn)行相應(yīng)的反應(yīng)。 3.1.3 金屬探測電路的設(shè)計 此部分電路的功能是檢測軌道上的鋁錢幣,在此我們使用的金屬傳感器是電感接近式開關(guān)。該傳感器由LC高頻振蕩器和放大處理電路組成,利用金屬物體在接近這個能產(chǎn)生電磁場的振蕩感應(yīng)頭時,使物體內(nèi)部產(chǎn)生渦流。這個渦流反作用于接近開關(guān),使接近開關(guān)振蕩能力衰減,內(nèi)部電路的參數(shù)發(fā)生變化,由此識別出有無金屬物體接近,進(jìn)而控制開關(guān)的通或斷。 其工作原理圖如下所示: 圖4 接近式開關(guān)原理圖 當(dāng)小車遇到鋁錢幣時,控制開關(guān)將會發(fā)生變化,輸出電壓為零伏,否則輸出的是1.12V。由于兩者都屬于低電平,在此我們再次使用電壓比較器,使兩種不同情況下,分別輸出高低電平,并將其傳給單片機(jī)。單片機(jī)根據(jù)接收到的信號判斷是否有鋁錢幣。 3.2 電機(jī)驅(qū)動電路設(shè)計 本設(shè)計使用的步進(jìn)電機(jī)是四項六線式,用L297和L298N驅(qū)動芯片驅(qū)動,其中一個的驅(qū)動電路如圖所示(另外一個于此相同): 圖5 .步進(jìn)電機(jī)驅(qū)動電路 單片機(jī)AT89S52通過I/O口向L297的17和18腳發(fā)送驅(qū)動控制信號,從而控制步進(jìn)電機(jī)的速度及正反轉(zhuǎn)。 4.軟件設(shè)計 4.1主程序流程圖 4.2程序清單 #include "xiaoche.h" #include "lcd1602.h" //unsigned int s=10; //unsigned int s2,i2=1,j2=1,k2=1; unsigned int jj=0; unsigned int kk=0; unsigned int d[5]={0}; void Delay(unsigned int t) //延時1 { while(t--); } void go(void) //直行 { cwright=1; cwleft=1; m=2; step_mode=0; } void back() //后直行 { m=2; cwright=0; cwleft=0; step_mode=0; } void tleft() //左拐 { //cwleft=0; //cwright=1; m=0; step_mode=0; } void tleft_1(void) { m=4; cwleft=0; cwright=1; step_mode=0; } void tright() //右拐 { //cwleft=1; //cwright=0; m=1; step_mode=0; } void tright_1(void) { m=5; cwleft=1; cwright=0; step_mode=0; } void searchline (void) //巡線+金屬探測 { unsigned int s=10; unsigned int i,j,k,z; kk=1; while(1) { i=s_L; j=s_M; k=s_R; z=js; s=z*8+i*4+j*2+k; switch(s) { case 7:shengguang();break; case 5:shengguang();break; case 2:go();shengguang();break; case 4:tright();shengguang();break; case 6:tright();shengguang();break; case 1:tleft();shengguang();break; case 3:tleft(); shengguang();break; //case 0:go();shengguang();break; case 15: case 13: case 10:go();break; case 12:tright();break; case 14:tright();break; case 9:tleft();break; case 11:tleft(); break; case 8:go();break; } if(s==0){Stop_0(5); break; } // go();shengguang(); // if(s==8){break;} Display(); //if(ii==1){a=d[0];} //if(ii==2){d2=a;} //if(ii==3){d3=a;} //if(ii==4){ //{Stop_0(10);} //Display(); //stop(); shengguang(); //Delay1ms(1000); //break; } } void searchlight () { unsigned int s1,i1=1,j1=1,k1=1; unsigned int s2,i2=0,j2=0,k2=0; while(1) { i1=left2 ; j1=forest3; k1=right1; s1=i1*4+j1*2+k1; i2=s_L; j2=s_M; k2=s_R; s2=4*i2+2*j2+k2; switch(s1) { case 7:go();break; case 5:go();break; case 2: case 4:tleft();break; case 6:tleft();break; case 1:tright();break; case 3:tright(); break; //case 0:go();break; }Display(); if(s1==0){break;} //go(); if(s2==7){break;} } } //金屬探測 void shengguang() { unsigned int i=0; ii++; d[ii]=a; light=1; alrm=1; for(i=0;i<5;i++) { alrm=!alrm; light=!light; Delay(10000); } alrm=1; light=1; } void init() { TMOD=0x11;//T0,T1都使用16位定時器,不受外部外部引腳電平控制 TH0=0xfc; TL0=0x17; TH1=0x3c; TL1=0xb0;//定時50ms EA=1; ET0=1; ET1=1; TR0=1; TR1=1; } void time() interrupt 3 using 1 { TH1=0x3c; TL1=0xb0; TCount++; if(TCount==20) { TCount=0; second++; if(second==90) { stop(); } } } void Delay1ms(Word n) //延時2 { Word a; for(;n>0;n--) for(a=0;a<120;a++) ; } void Stop_0(Word n) //停車1 { while(n--) { Display(); stop(); Delay1ms(500); alrm=!alrm; light=!light; Delay(1000); } alrm=1; light=1; } void stop(void) //停車2 { m=3; step_mode=0; } void step() interrupt 1 { if(!step_mode){step_time=3000;step_mode=1;} if(jj)step_time=1800; if(kk)step_time=1500; TH0=(Byte)((65535-step_time)/256); TL0=(Byte)((65535-step_time)%256); if(m==0){moto_clkl=~moto_clkl;c++;} if(m==1){moto_clkr=~moto_clkr;c++;} if(m==2){moto_clkl=~moto_clkl;moto_clkr=~moto_clkr;c++;} if(m==3); if(m==4){moto_clkl=~moto_clkl;moto_clkr=~moto_clkr;c++;} if(m==5){moto_clkl=~moto_clkl;moto_clkr=~moto_clkr;c++;} //if(step_time>1000)step_time-=200; //c++;b++; if(c==37){a+=1;c=0;} } void Display1() { Lcd_Init(); Lcd_DisplayString(0,0,"Time:"); Lcd_DisplayOneChar(7,0,s); Lcd_DisplayString(9,0,"Num:"); Lcd_DisplayString(0,1,"D1 :"); Lcd_DisplayString(7,1,"cm"); Lcd_DisplayOneChar(13,0,ii+0x30); Lcd_DisplayOneChar(6,0,second%10+0x30); Lcd_DisplayOneChar(5,0,second/10+0x30); Lcd_DisplayOneChar(4,1,d[1]/100+0x30); Lcd_DisplayOneChar(5,1,d[1]%100/10+0x30); Lcd_DisplayOneChar(6,1,d[1]%10+0x30); } void Display2() { Lcd_Init(); Lcd_DisplayString(0,0,"Time:"); Lcd_DisplayOneChar(7,0,s); Lcd_DisplayString(9,0,"Num:"); Lcd_DisplayString(0,1,"D2 :"); Lcd_DisplayString(7,1,"cm"); Lcd_DisplayOneChar(13,0,ii+0x30); Lcd_DisplayOneChar(6,0,second%10+0x30); Lcd_DisplayOneChar(5,0,second/10+0x30); Lcd_DisplayOneChar(4,1,d[2]/100+0x30); Lcd_DisplayOneChar(5,1,d[2]%100/10+0x30); Lcd_DisplayOneChar(6,1,d[2]%10+0x30); } void Display3() { Lcd_Init(); Lcd_DisplayString(0,0,"Time:"); Lcd_DisplayOneChar(7,0,s); Lcd_DisplayString(9,0,"Num:"); Lcd_DisplayString(0,1,"D3 :"); Lcd_DisplayString(7,1,"cm"); Lcd_DisplayOneChar(13,0,ii+0x30); Lcd_DisplayOneChar(6,0,second%10+0x30); Lcd_DisplayOneChar(5,0,second/10+0x30); Lcd_DisplayOneChar(4,1,d[3]/100+0x30); Lcd_DisplayOneChar(5,1,d[3]%100/10+0x30); Lcd_DisplayOneChar(6,1,d[3]%10+0x30); } void Display4() { Lcd_Init(); Lcd_DisplayString(0,0," Over! Thank you!"); } void Display() { //init(); Lcd_DisplayOneChar(13,0,ii+0x30); Lcd_DisplayOneChar(6,0,second%10+0x30); Lcd_DisplayOneChar(5,0,second/10+0x30); Lcd_DisplayOneChar(4,1,a/100+0x30); Lcd_DisplayOneChar(5,1,a%100/10+0x30); Lcd_DisplayOneChar(6,1,a%10+0x30); } main() {// unsigned int s2,i2=1,j2=1,k2=1; //step_intset(); Lcd_Init(); Lcd_DisplayString(0,0,"Time:"); Lcd_DisplayOneChar(7,0,s); Lcd_DisplayString(9,0,"Num:"); Lcd_DisplayString(0,1,"Dis:"); Lcd_DisplayString(7,1,"cm"); //unsigned int s2=1,i2=1,j2=1,k2=1; init(); searchline(); go();Display(); kk=0; while(forest); jj=1; stop();Display(); Delay1ms(500); back();Display(); Delay1ms(60); tleft_1();Display(); Delay1ms(390); stop();Display(); Delay1ms(200); go();Display(); Delay1ms(2000); tright_1();Display(); Delay1ms(370); go();Display(); Delay1ms(1000); go();Display(); //Delay1ms(2000); // Delay1ms(1500); while(!forest); go();Display(); while(forest); //stop();Display(); //Delay1ms(300); tright_1();Display(); Delay1ms(360); jj=0; //go();Display(); //Delay1ms(100); go();Display(); while(right); jj=1; stop();Delay1ms(500); go();Display(); Delay1ms(900); tleft_1();Display(); Delay1ms(390); go();Display(); Delay1ms(1000); //tleft_1();Display(); //Delay1ms(340); //go();Display(); // Delay1ms(300); searchlight (); // go(); // i2=s_L; // j2=s_M; // k2=s_R; // s2=4*i2+2*j2+k2; // while (s2==7); // jj=0; // stop();Display(); // Delay1ms(1000); //go();Display(); //if(s2==7) //{ stop();Display(); Delay1ms(100); back(); Display(); Delay1ms(1000); tleft_1();Display(); Delay1ms(750); back(); Display(); Delay1ms(2200); //} //go();Display(); //Delay1ms(200); //stop();Display(); EA=0; Delay1ms(1000); Display1(); Delay1ms(3000); Display2(); Delay1ms(3000); Display3(); Delay1ms(3000); Display4(); //Delay1ms(3000); while(1); } 5.調(diào)試結(jié)果 1)小車?yán)眉t外對管能夠成功進(jìn)行巡線、避障。 ①:小車的電機(jī)驅(qū)動脈沖在 1500 左右,小車可以在躲避障礙物時候,準(zhǔn)確的轉(zhuǎn)外實現(xiàn)延時并且尋光功能。 ②:小車的電機(jī)驅(qū)動脈沖在 1500左右,是小車的性能達(dá)到最優(yōu),正在巡線轉(zhuǎn)彎的車體抖動達(dá)到最小值。 ③:小車的避障的紅外對管與地面的距離在4cm以及角度在85左右,能夠準(zhǔn)確實現(xiàn)避障,且車體轉(zhuǎn)彎達(dá)到90 2)小車?yán)眉t外對管尋光進(jìn)入車庫。 ①:當(dāng)小車駛出障礙區(qū),加以脈沖在1800左右,可以使其在尋光過程中,避免車身旋轉(zhuǎn)角度過大。 ②:小車的尋光的紅外對管(車身左側(cè))與地面的距離在6cm以及角度在95左右,能夠準(zhǔn)確實現(xiàn)尋光,和車身180度旋轉(zhuǎn),倒入車庫 3)小車的顯示模塊。 ①:小車的總路程、總時間、被檢測的金屬數(shù)目以及被檢測金屬與其實位置的距離,適時顯示小車行駛的路程和時間 6總結(jié)與體會 經(jīng)過近四周左右的時間,我們終于完成了小車的制作和程序的編寫。制作過程中,我們克服了許多困難,通過參考前人的經(jīng)驗,完成了小車主體的器件分布規(guī)劃和焊接。期間出現(xiàn)了很多錯誤,但都被及時發(fā)現(xiàn)并糾正了。從中我們體會到前期規(guī)劃的重要性,在焊之前考慮一下器件的焊接順序和可能出現(xiàn)的問題,這樣在焊的時候才會比較流暢,布線也比較清楚,查錯也很容易。 編程是整個小車制作的重點,我們通過對小車電路、比賽規(guī)則、外部環(huán)境等情況的研究,編寫出了相應(yīng)的程序,經(jīng)過幾次調(diào)試最終完成了比賽用程序。通過編寫程序,我們感到AT89S52的功能的確很強(qiáng)大。 對于這次比賽,很感謝學(xué)校和系里領(lǐng)導(dǎo)給了我們參與這次比賽的機(jī)會,也很感謝實驗室的學(xué)長和指導(dǎo)老師給予我們的幫助,通過實際操作加深了我們對理論知識的理解和運(yùn)用能力,相信我們的努力能使我們?nèi)〉煤玫某煽儭? 7.參考文獻(xiàn): 【1】《51單片機(jī)C語言應(yīng)用程序設(shè)計實例精講》 戴佳 戴衛(wèi)恒 編 電子工業(yè)出版社 【2】《全國大學(xué)生電子設(shè)計競賽獲獎作品匯編》 全國大學(xué)生電子設(shè)計競賽組委會 編 北京理工大學(xué)出版社 【3】《全國大學(xué)生電子設(shè)計競賽制作實訓(xùn)》 黃智偉 編 北京航空航天大學(xué)出版社 【4】《全國大學(xué)生電子設(shè)計競賽系統(tǒng)設(shè)計》 黃智偉 編 北京航空航天大學(xué)出版社 【5】《常用電子元器件設(shè)別/檢測/選用一讀通》趙廣林 編 電子工業(yè)出版社 【6】《電子技術(shù)基礎(chǔ) 模擬部分(第五版)》康華光 編 高等教育出版社- 1.請仔細(xì)閱讀文檔,確保文檔完整性,對于不預(yù)覽、不比對內(nèi)容而直接下載帶來的問題本站不予受理。
- 2.下載的文檔,不會出現(xiàn)我們的網(wǎng)址水印。
- 3、該文檔所得收入(下載+內(nèi)容+預(yù)覽)歸上傳者、原創(chuàng)作者;如果您是本文檔原作者,請點此認(rèn)領(lǐng)!既往收益都?xì)w您。
下載文檔到電腦,查找使用更方便
9.9 積分
下載 |
- 配套講稿:
如PPT文件的首頁顯示word圖標(biāo),表示該P(yáng)PT已包含配套word講稿。雙擊word圖標(biāo)可打開word文檔。
- 特殊限制:
部分文檔作品中含有的國旗、國徽等圖片,僅作為作品整體效果示例展示,禁止商用。設(shè)計者僅對作品中獨創(chuàng)性部分享有著作權(quán)。
- 關(guān) 鍵 詞:
- 電子設(shè)計 大賽 智能 小車 步進(jìn) 電機(jī) 控制
鏈接地址:http://www.szxfmmzy.com/p-7851419.html