西南交大電腦鼠課程設(shè)計(jì)_第1頁
西南交大電腦鼠課程設(shè)計(jì)_第2頁
西南交大電腦鼠課程設(shè)計(jì)_第3頁
西南交大電腦鼠課程設(shè)計(jì)_第4頁
西南交大電腦鼠課程設(shè)計(jì)_第5頁
已閱讀5頁,還剩22頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、電子技術(shù)課程設(shè)計(jì)報(bào)告學(xué) 院: 專 業(yè): 年 級: 姓 名: 學(xué) 號: 指導(dǎo)老師: 第一章 課程設(shè)計(jì)任務(wù)和總體設(shè)計(jì)1.1 課程設(shè)計(jì)任務(wù)該課程設(shè)計(jì)以兩人組隊(duì)的形式,制作尋線型電腦鼠。要求能夠在8×8的迷宮中搜索路徑并計(jì)算出最短路徑。其中迷宮由25mm寬的黑線組成。電腦鼠第一次進(jìn)入迷宮和返回迷宮時(shí),可以循著黑線走到終點(diǎn)并記錄迷宮信息,第二次進(jìn)入迷宮時(shí),根據(jù)第一次所記錄的迷宮信息選擇最短路徑?jīng)_刺到終點(diǎn)。1.2 總體設(shè)計(jì)思路和步驟尋線型電腦鼠不同于以前的走迷宮,是利用紅外傳感器進(jìn)行路線探測并選擇前進(jìn)方向的小型智能機(jī)器人。其設(shè)計(jì)步驟包括:系統(tǒng)設(shè)計(jì)、利用Altium Designer軟件繪制原理圖

2、和PCB圖,電腦鼠硬件焊接組裝、軟件代碼書寫調(diào)試和總體調(diào)試。硬件部分主要由傳感器,單片機(jī),電機(jī)驅(qū)動(dòng)組成。傳感器采用紅外傳感器,由發(fā)射管和接收管組成,可探測黑線迷宮。單片機(jī)采用IAP15W413AS芯片,用于編寫和實(shí)現(xiàn)程序。電機(jī)驅(qū)動(dòng)由單片機(jī)產(chǎn)生的PWM以及L9110芯片進(jìn)行驅(qū)動(dòng)。軟件部分主要由產(chǎn)生PWM函數(shù),搜尋路徑法則,記錄信息,測速盤組成。此課程設(shè)計(jì)中電腦鼠按照左手法則進(jìn)行路線搜索,根據(jù)測速盤的計(jì)數(shù)得到迷宮坐標(biāo)并儲(chǔ)存。第一次排除迷宮中的死路,第二次便可沿迷宮中最短路徑走出迷宮。第二章 硬件設(shè)計(jì)2.1 硬件設(shè)計(jì)步驟硬件設(shè)計(jì)步驟如圖1所示。設(shè)計(jì)原理圖、生成PCB板之后進(jìn)行手動(dòng)布線,再根據(jù)PCB板

3、將原件、輪子、軸承、電機(jī)、齒輪等器件進(jìn)行組裝,調(diào)整傳感器角度使之能夠達(dá)到良好的接受效果。最后進(jìn)行電路測試,測試方式在軟件設(shè)計(jì)部分說明。2.2 主控模塊(單片機(jī))包括單片機(jī)(圖2)和電腦下載部分(圖3)。單片機(jī)采用了STC15W4K32S4芯片,其原理圖為:圖2尋線型電腦鼠PCB板制作單片機(jī)電機(jī)驅(qū)動(dòng)紅外傳感器電機(jī)等組裝原理圖繪制調(diào)整角度調(diào)試檢測元器件焊接生成PCB圖并布線圖1管腳圖:圖3圖42.3 傳感器模塊傳感器模塊運(yùn)用了5對發(fā)光二極管(白)+紅外光敏三極管(黑)的組合(如圖7),成一條直線置于電腦鼠前端用于探測賽道。其中左前與右前的探測器用于糾正電腦鼠直線行走時(shí)由于 2 個(gè)電機(jī)轉(zhuǎn)動(dòng)不一致導(dǎo)致

4、的軌道偏離。左、前和右方的三個(gè)探測器用于探測距離電腦鼠特定距離內(nèi)的左右和前方有無線路。用于提供紅外信號的30kHz 多的信號可以由STC15W4K32S4單片機(jī)的時(shí)鐘輸出口輸出,占空比固定為 50%。當(dāng)發(fā)射的光線集中于白色地區(qū)時(shí),光線會(huì)被反射,黑色的接收管就會(huì)將其吸收;反之,發(fā)射光線集中的地方是黑色的時(shí)候,光線會(huì)被吸收而沒有反射。單個(gè)的傳感器模塊如圖5圖5發(fā)光二極管電路圖如圖6.圖6實(shí)物圖見圖7. 圖72.4 電機(jī)驅(qū)動(dòng)模塊電腦鼠的前進(jìn)、拐彎和旋轉(zhuǎn)等動(dòng)作必須依靠兩個(gè)電機(jī)的轉(zhuǎn)動(dòng)來控制。具體為:直行:兩個(gè)電機(jī)同方向轉(zhuǎn)動(dòng);轉(zhuǎn)彎:兩個(gè)電機(jī)一個(gè)轉(zhuǎn)一個(gè)不轉(zhuǎn)或者一個(gè)正轉(zhuǎn)一個(gè)反轉(zhuǎn)。要使電機(jī)轉(zhuǎn)動(dòng),需要一定的電壓,

5、以電壓控制電機(jī)的運(yùn)轉(zhuǎn)。而為了獲得一個(gè)較為合適的電壓值,往往需要調(diào)節(jié)電阻。通過不斷重復(fù)地開、關(guān)操作,實(shí)現(xiàn)我們需要的“脈沖寬度調(diào)制”(簡稱pwm調(diào)制)。當(dāng)pwm信號與電機(jī)相連時(shí),電機(jī)的旋轉(zhuǎn)速度就可以根據(jù)我們的 程序設(shè)定來工作。電機(jī)正、反轉(zhuǎn)以及剎車的控制是通過兩個(gè)L9110芯片來控制的。圖8為L9110的應(yīng)用電路圖。圖8圖9為 其原理圖。圖9除L9110之外,該模塊還使用了74HC00芯片參與pwm控制。原理圖如圖10圖102.5 測速模塊電腦鼠設(shè)計(jì)使用直流電機(jī),一方面通過對電機(jī)的轉(zhuǎn)速加以運(yùn)算可獲得電腦鼠所在方位,記憶當(dāng)前迷宮情況;一方面在編程時(shí),了解電機(jī)轉(zhuǎn)速對電腦鼠行走速度可以進(jìn)行更好地控制,使其

6、能夠在盡量短的時(shí)間內(nèi)遍歷迷宮且走到終點(diǎn)。采用紅外發(fā)射二極管和紅外光敏三極管組成一對對射管實(shí)現(xiàn)對兩個(gè)電機(jī)轉(zhuǎn)速進(jìn)行測量,需要分別在兩個(gè)電機(jī)的一端添加碼盤。其實(shí)物圖如圖11.圖112.6 電源電腦鼠的電源為5號鐵鋰電池和7號鐵鋰電池各一節(jié),分別為單片機(jī)和電機(jī)供電,提供電壓約為3.2V左右。電源原理圖如圖12所示。圖12至此,電腦鼠的硬件設(shè)計(jì)基本完成,完整的原理圖、PCB圖見附錄。焊接PCB板成品圖如圖13.圖13第三章 軟件設(shè)計(jì)3.1 程序流程圖(圖14)出發(fā)MCU各狀態(tài)字初始化紅外檢測,讀取傳感器的值中斷檢測到終點(diǎn)路徑優(yōu)化,去除死路檢測回到起點(diǎn)最短路徑?jīng)_刺終點(diǎn)結(jié)束圖14第四章 最終結(jié)果課程設(shè)計(jì)結(jié)果

7、:電腦鼠可完成尋線并到達(dá)終點(diǎn),有時(shí)候也能順利返回起點(diǎn)。在焊接過程中,因?yàn)橛泄饬⒎奖荣惖慕?jīng)驗(yàn),焊接工作比較順利,除了中途有一次不小心將一個(gè)芯片的兩個(gè)引腳焊在了一起,然后我們及時(shí)的用儀器解決了這一問題。而軟件部分,雖然用的原代碼是同學(xué)間分享流傳的,但是也是通過自己的調(diào)試,修改才完成的。另外,在學(xué)長的指導(dǎo)下,也對右手算法程序中左轉(zhuǎn)優(yōu)先級不高這一缺點(diǎn)進(jìn)行了完善。第五章 總結(jié)及體會(huì)這次課程設(shè)計(jì)讓我受益匪淺,無論從知識上還是其他的各個(gè)方面。上課的時(shí)候的學(xué)習(xí)從來沒有見過真正的單片機(jī),只是從理論的角度去理解枯燥乏味。但在實(shí)習(xí)中見過甚至使用了單片機(jī)及其系統(tǒng),能夠理論聯(lián)系實(shí)際的學(xué)習(xí),開闊了眼界,提高了單片機(jī)知識的

8、理解和水平。在這次課程設(shè)計(jì)中又讓我體會(huì)到了合作與團(tuán)結(jié)的力量,當(dāng)遇到不會(huì)或是設(shè)計(jì)不出來的地方,我們就會(huì)在QQ群里討論或者是同學(xué)之間相互幫助。團(tuán)結(jié)就是力量,無論在現(xiàn)在的學(xué)習(xí)中還是在以后的工作中,團(tuán)結(jié)都是至關(guān)重要的,有了團(tuán)結(jié)會(huì)有更多的理念、更多的思維、更多的情感。單片機(jī)是很重要的一門課程,老師曾說過,如果學(xué)好一門單片機(jī),就憑這個(gè)技術(shù)這門手藝找一個(gè)好工作也不成問題。盡管我們在課堂學(xué)到的內(nèi)容很有限,但在以后的學(xué)習(xí)中單片機(jī)還需要好好的深入研究和學(xué)習(xí),學(xué)好了單片機(jī)也就多了一項(xiàng)生存的本錢。最后感謝老師、學(xué)長們對我們的精心指導(dǎo)和幫助,感謝同學(xué)們對我的幫助。附錄1:原理圖附錄2:PCB圖附錄3:程序代碼#incl

9、ude"stdio.h"#include"action.h" /電機(jī)驅(qū)動(dòng)頭文件#include "bmp_pixel.h"#include "NOKIA_5110.h"#include"configuration.h" u16 gz1 = 0; voidStop_On_Going() Wheel_Control(LEFT,1,255); /1表示正向轉(zhuǎn),data越大,轉(zhuǎn)速越小 Wheel_Control(RIGHT,1,255); void Turn_Right() /右轉(zhuǎn)的具體實(shí)現(xiàn) doWhe

10、el_Control(LEFT,1,32);Wheel_Control(RIGHT,0,45);while(P1&0xf8=0xd8|P1&0xf8=0x98|P1&0xf8=0xc8); void Go_straight()/直走的具體實(shí)現(xiàn) Wheel_Control(LEFT,1,42); Wheel_Control(RIGHT,1,55); void Turn_Left() do Wheel_Control(LEFT,1,52); Wheel_Control(RIGHT,1,65); while(Left_Detector=1); /在左轉(zhuǎn)之前,先走一段距離,直到

11、最左邊的燈走出黑線(為實(shí)現(xiàn)直走>左轉(zhuǎn)) if(Middle_Detector=0) Go_straight(); else do Wheel_Control(LEFT,0,32);/左齒輪反轉(zhuǎn),右齒輪正轉(zhuǎn) Wheel_Control(RIGHT,1,45);while(P1&0xf8=0xd8|P1&0xf8=0x98|P1&0xf8=0xc8); voidTurn_back() /調(diào)頭的具體實(shí)現(xiàn) xxx. doWheel_Control(LEFT,0,42);Wheel_Control(RIGHT,1,55);while(P1&0xf8 = 0xd8);

12、voidLeft_Adjust() /左偏->向右微調(diào)的具體實(shí)現(xiàn)doWheel_Control(LEFT,0,72);/左輪子轉(zhuǎn)速快一點(diǎn)就可以解決左偏問題Wheel_Control(RIGHT,1,55);while(P1&0xf8=0xd8|P1&0xf8=0xc8|P1&0xf8=0xe8|P1&0xf8=0xf0);voidRight_Adjust() /右偏向->左微調(diào) 的具體實(shí)現(xiàn) do Wheel_Control(LEFT,1,62);Wheel_Control(RIGHT,0,75);while(P1&0xf8=0xd8|P1&a

13、mp;0xf8=0x98|P1&0xf8=0xb8|P1&0xf8=0x78);void Find_gz();void main()u16 mode = 0;u8 sensor = 0; /功能模塊初始化/GPIO_config(); /STC15W4K32S4 PWM復(fù)用口 由高阻初始化為雙向口 EXTI_config(); /外部中斷 測速Timer_config(); /定時(shí)器PCA_config(); /PWM UART_config(); /串口ADC_config(); /AD 電壓檢測/液晶屏初始化LCD_init(); LCD_clear();LCD_draw_

14、bmp_pixel(15,0,BMP,48,56);delay_ms(250);delay_ms(250);delay_ms(250);delay_ms(250);LCD_clear();LCD_write_english_string(2,0," Welcome To ");LCD_write_english_string(2,1," S W J T U ");LCD_write_english_string(2,2," DNS VER 2.1 ");LCD_write_english_string(2,3,"Nokia5

15、110 LCD ");LCD_write_chinese_string(1,4,12,6,0,2); /wait for the start key down/while(Start_Key);/ 延時(shí)啟動(dòng)(start按鍵按下,等待n秒后啟動(dòng))delay_ms(250);delay_ms(250);delay_ms(250);delay_ms(250); delay_ms(250);/delay_ms(250);/delay_ms(250);/delay_ms(250);/delay_ms(250);/delay_ms(250);/delay_ms(250);/LCD_clear()

16、; /開總中斷SET_EA(); /* add your program here !.*/ while(1) P1=0xff; sensor = P1&0xf8;if(gz1=0)switch(sensor)case 0x10 : /00010000case 0x08 :/00001000case 0x18 : mode = 1; break; /00011000 左轉(zhuǎn)/算法體現(xiàn),先從左遍歷圖case 0xa0 : /10100000case 0xd0 : /11010000case 0x88 :/10001000case 0xd8 : mode = 2; break; /11011

17、000 直走case 0x80 :/10000000 case 0x00 : /00000000case 0xc0 : mode = 3; break; /11000000 右轉(zhuǎn)case 0xf8 : mode = 4; break; /11111000 掉頭case 0xe0 :/01001000 case 0x78 :/01111000case 0x38 :/00111000case 0xb8 :/10111000case 0x98 : mode = 10; break; /10011000 頭右偏,后續(xù)調(diào)整case 0x90 : you zhuan yi chang chu licase

18、 0xe8 :/11101000case 0xc8 :/11001000case 0xf0 : mode = 11; break; /11110000 頭偏左,后續(xù)調(diào)整 default : mode = 5; break; /其他情況,執(zhí)行右轉(zhuǎn)switch(mode)case 1 : Turn_Left(); break; case 2 : Go_straight(); break;case 3 : Turn_Right(); break;case 4 : Turn_back(); break;case 5 : Find_gz();break;case 10 : Left_Adjust();

19、break;case 11 : Right_Adjust(); break;default : Go_straight(); break;void Find_gz() gz1 = 1 ; do if(Left_Detector & Left_middle_Detector =0) Wheel_Control(LEFT,0,72);Wheel_Control(RIGHT,1,85); else if(Right_middle_Detector & Right_Detector = 0) Wheel_Control(LEFT,1,62);Wheel_Control(RIGHT,0,

20、75); while(P1&0xf8=0xd8); gz1 = 0 ;/*功能說明*本文件為電機(jī)控制程序*/#include "Action.h"/*function name :void Wheel_Control(bit side , u8 data_CCAPnH)*param :side = LEFT or RIGHT dir = WHEEL_FRONT or WHEEL_BACK data_CCAPnH 為輸入CCAPnH的8bit數(shù)據(jù) *return value :none*description :control the left or right wh

21、eel's running*/void Wheel_Control(bit side , bit dir , u8 data_CCAPnH) if(dir=WHEEL_FRONT) /選擇的輪子前進(jìn) if(side=RIGHT) Motor_Right_Control = 1; PWMn_Update(PCA0,data_CCAPnH); else if(side=LEFT) Motor_Left_Control = 1; PWMn_Update(PCA1,data_CCAPnH); else if(dir=WHEEL_BACK) if(side=RIGHT) Motor_Right_

22、Control = 0; PWMn_Update(PCA0,data_CCAPnH); else if(side=LEFT) Motor_Left_Control = 0; PWMn_Update(PCA1,data_CCAPnH); /*function name :void TurnRight()*param :none*return value :none*description :控制電腦鼠向右轉(zhuǎn)*/#if IN_PLACEvoid TurnRight() u8 flg=1; TX1_write2buff(0xDD); left_count=right_count=0; Wheel_C

23、ontrol(LEFT,WHEEL_FRONT,SPEED_INIT_LEFT); Wheel_Control(RIGHT,WHEEL_FRONT,SPEED_INIT_RIGHT); while(flg=1) if(right_count=60|left_count=60) Wheel_Control(LEFT, WHEEL_FRONT,SPEED_INIT_RIGHT); Wheel_Control(RIGHT,WHEEL_BACK, SPEED_INIT_LEFT); if(left_count=125|right_count=125) Wheel_Control(LEFT,WHEEL_

24、FRONT,0Xff);/左輪停止 Wheel_Control(RIGHT,WHEEL_BACK,0Xff); left_count=0; right_count=0; flg=0; #elsevoid TurnRight() u8 flg=1; left_count=right_count=0; Wheel_Control(LEFT,WHEEL_FRONT,SPEED_INIT_LEFT); Wheel_Control(RIGHT,WHEEL_FRONT,0XFF); while(flg=1) if(left_count=90|right_count=90) Wheel_Control(LE

25、FT,WHEEL_FRONT,0Xff);/左輪停止 left_count=0; right_count=0; flg=0; #endif/*function name :void TurnRight()*param :none*return value :none*description :控制電腦鼠向左轉(zhuǎn)*/#ifIN_PLACE void TurnLeft() u8 flg=1; TX1_write2buff(0xEE); left_count=right_count=0; Wheel_Control(RIGHT,WHEEL_FRONT,SPEED_INIT_RIGHT); Wheel_

26、Control(LEFT,WHEEL_FRONT,SPEED_INIT_LEFT); while(flg=1) if(right_count=60|left_count=60) Wheel_Control(RIGHT,WHEEL_FRONT,SPEED_INIT_RIGHT); Wheel_Control(LEFT,WHEEL_BACK,SPEED_INIT_LEFT); if(right_count=125|left_count=125) Wheel_Control(RIGHT,WHEEL_FRONT,0Xff); /右輪停止 Wheel_Control(LEFT,WHEEL_BACK,0X

27、ff); left_count=0; right_count=0; flg=0; #elsevoid TurnLeft() u8 flg=1; left_count=right_count=0; Wheel_Control(RIGHT,WHEEL_FRONT,SPEED_INIT_RIGHT); Wheel_Control(LEFT,WHEEL_FRONT,0xff); while(flg=1) if(right_count=90|left_count=90) Wheel_Control(RIGHT,WHEEL_FRONT,0Xff); /右輪停止 left_count=0; right_co

28、unt=0; flg=0; #endif/*function name :void TurnBack()*param :none*return value :none*description :控制電腦鼠向后轉(zhuǎn)*/void TurnBack() u8 flg=1; TX1_write2buff(0xFF); left_count=right_count=0; Wheel_Control(RIGHT,WHEEL_BACK,SPEED_INIT_RIGHT); /右輪后退 Wheel_Control(LEFT,WHEEL_FRONT,SPEED_INIT_LEFT); /左輪前進(jìn) while(flg=1) if(left_count=115|left_count=115) Wheel_Control(RIGHT,WHE

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論