版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、<p><b> 機(jī)器人課程設(shè)計(jì)</b></p><p> 自主行走機(jī)器人小車的設(shè)計(jì)</p><p> 學(xué)院: </p><p> 班級: </p><p> 姓名: </p><p> 學(xué)號: </
2、p><p> 摘要:本文通過對ARM開發(fā)和研究,實(shí)現(xiàn)移動(dòng)機(jī)器人小車自主行走,速度反饋和紅外線避障的功能。</p><p> 小車系統(tǒng)的組成主要包括避障傳感器部分,電機(jī)控制部分,速度反饋部分以及ARM嵌入式系統(tǒng)核心控制部分。避障傳感器系統(tǒng)采用紅外線技術(shù),主要完成對障礙物的感應(yīng);移動(dòng)機(jī)器人小車的電機(jī)控制轉(zhuǎn)速部分采用步進(jìn)電機(jī)作為電機(jī)首選;還有速度反饋的部分,由于ARM板內(nèi)部沒有記數(shù)的功能,我們就
3、設(shè)計(jì)了傳感器數(shù)據(jù)讀取的一個(gè)系統(tǒng)。最后,貫穿整篇文章的是對機(jī)器人的核心部分(基于ARM嵌入式系統(tǒng))的研究和設(shè)計(jì),主要讓操作系統(tǒng)完成控制功能(主要是通過接收避障系統(tǒng)感應(yīng)外界環(huán)境所返回的信號,進(jìn)而控制運(yùn)動(dòng)控制系統(tǒng),從而完成一個(gè)自主運(yùn)動(dòng)的智能功能)。</p><p> 關(guān)鍵詞:ARM板;自主行走;紅外線感應(yīng);嵌入式操作系統(tǒng);電機(jī)</p><p> 1 機(jī)器人實(shí)現(xiàn)方法和實(shí)現(xiàn)過程</p&g
4、t;<p> 以S3C44B0X實(shí)驗(yàn)板為平臺,以及避障系統(tǒng)和運(yùn)動(dòng)控制系統(tǒng)兩部分結(jié)合起來構(gòu)成整個(gè)移動(dòng)機(jī)器人最主要的硬件部分。其中,實(shí)驗(yàn)板為移動(dòng)機(jī)器人的中樞神經(jīng)部分,它承擔(dān)著對于外部硬件的全權(quán)管理(包括接收外部硬件的傳遞過來的信息,對信息進(jìn)行相應(yīng)的處理,以及把處理后的信息再傳遞給外部硬件);避障系統(tǒng)為整個(gè)機(jī)器人系統(tǒng)的感應(yīng)部分,一切外界環(huán)境的識別都有避障系統(tǒng)來完成;運(yùn)動(dòng)控制系統(tǒng)為整個(gè)機(jī)器人系統(tǒng)的移動(dòng)部分,它承擔(dān)著讓機(jī)器人能自由
5、的在物理環(huán)境中移動(dòng)的功能。</p><p><b> 1.1 實(shí)現(xiàn)過程</b></p><p> 以S3C44B0開發(fā)板構(gòu)建整個(gè)機(jī)器人的中樞神經(jīng),主要是采用嵌入式操作系統(tǒng)來管理。</p><p> 這里具體工作主要包括將uClinux操作系統(tǒng)移植入ARM,以及在操作系統(tǒng)下編寫外部驅(qū)動(dòng)程序來識別和控制外圍硬件(主要是避障系統(tǒng)和運(yùn)動(dòng)控制系統(tǒng))
6、。</p><p> 避障系統(tǒng)設(shè)計(jì):采用紅外線來實(shí)現(xiàn)避障(電路設(shè)計(jì),調(diào)試)。</p><p> 運(yùn)動(dòng)控制系統(tǒng)設(shè)計(jì):采用直流電機(jī)來實(shí)現(xiàn)機(jī)器人的移動(dòng)功能(電路設(shè)計(jì),調(diào)試)。</p><p> 軟件設(shè)計(jì)部分:主要是應(yīng)用程序配合外部硬件驅(qū)動(dòng)程序。下文將詳細(xì)介紹軟件實(shí)現(xiàn)的具體方法和實(shí)現(xiàn)代碼。</p><p> 2 自主行走機(jī)器人的行走控制方案
7、</p><p> 2.1 直流電機(jī)的控制方案</p><p> 一個(gè)電動(dòng)小車整體的運(yùn)行性能,首先取決于它的電池系統(tǒng)和電機(jī)驅(qū)動(dòng)系統(tǒng)。電動(dòng)小車的驅(qū)動(dòng)系統(tǒng)一般由控制器、功率變換器及電動(dòng)機(jī)三個(gè)主要部分組成。電動(dòng)小車的驅(qū)動(dòng)不但要求電機(jī)驅(qū)動(dòng)系統(tǒng) 具有高轉(zhuǎn)矩重量比、寬調(diào)速范圍、高可靠性,而且電機(jī)的轉(zhuǎn)矩-轉(zhuǎn)速特性受電源功率的影響,這就要求驅(qū)動(dòng)具有盡可能寬 的高效率區(qū)。我們所使用的電機(jī)一般為直流電機(jī)
8、,主要用到永磁直流電機(jī)、伺服電機(jī)及步進(jìn)電機(jī)三種。直流電機(jī)的控制很簡單,性能出眾,直流電源也容易實(shí)現(xiàn)。這里主要介紹這種直流電機(jī)的驅(qū)動(dòng)及控制。</p><p><b> 2.2 驅(qū)動(dòng)電路</b></p><p> 2.2.1驅(qū)動(dòng)芯片介紹</p><p> L298是ST公司生產(chǎn)的一種高電壓、大電流電機(jī)驅(qū)動(dòng)芯片,直接采用,TTL邏輯電平控制,
9、可用來驅(qū)動(dòng)繼電器、線圈、直流電動(dòng)機(jī)、步進(jìn)電動(dòng)機(jī)等電感性負(fù)載。該芯片的主要特點(diǎn)是:工作電壓高,最高工作電壓可達(dá)46V;輸出電流大,瞬間峰值電流可達(dá)3A,持續(xù)工作電流為2A;內(nèi)含兩個(gè)H橋的高電壓大電流全橋式驅(qū)動(dòng)器,可以用來驅(qū)動(dòng)直流電動(dòng)機(jī)和步進(jìn)電動(dòng)機(jī)、繼電器、線圈等感性負(fù)載;采用標(biāo)準(zhǔn)TTL邏輯電平信號控制;具有兩個(gè)使能控制端,在不受輸入信號影響的情況下允許或禁止器件工作有一個(gè)邏輯電源輸入端,使內(nèi)部邏輯電路部分在低電壓下工作;可以外接檢測電阻,
10、將變化量反饋給控制電路。其芯片原理結(jié)構(gòu)圖如下:</p><p><b> 原理圖</b></p><p> 2.2.2 驅(qū)動(dòng)電路</p><p> 直流電機(jī)驅(qū)動(dòng)電路使用最廣泛的就是H型全橋式電路,這種驅(qū)動(dòng)電路可以很方便實(shí)現(xiàn)直流電機(jī)的四象限運(yùn)行,分別對應(yīng)正轉(zhuǎn)、正轉(zhuǎn)制動(dòng)、反轉(zhuǎn)、反轉(zhuǎn)制動(dòng)。 它的基本原理圖</p><p>
11、; 如圖1所示: </p><p> 全橋式驅(qū)動(dòng)電路的4只開關(guān)管都工作在斬波狀態(tài),S1、S2為一組,S3、S4 為另一組,兩組的狀態(tài)互補(bǔ),一組導(dǎo)通則另一組必須關(guān)斷。當(dāng)S1、S2導(dǎo)通時(shí),S3、 S4關(guān)斷,電機(jī)兩端加正向電壓,可以實(shí) 現(xiàn)電機(jī)的正轉(zhuǎn)或反轉(zhuǎn)制動(dòng);當(dāng)S3、S4導(dǎo) 通時(shí),S1、S2關(guān)斷,電機(jī)兩端為反向電壓,電機(jī)反轉(zhuǎn)或正轉(zhuǎn)制動(dòng)。</p><
12、;p> 此部分是單純的硬件設(shè)計(jì),沒涉及到軟件方面,但是實(shí)現(xiàn)驅(qū)動(dòng)電機(jī)的功能時(shí),我們軟件輸出必須通過驅(qū)動(dòng)電路來實(shí)現(xiàn)驅(qū)動(dòng)。所以這個(gè)部分和軟件設(shè)計(jì)也是密不可分的一個(gè)環(huán)節(jié)。</p><p><b> 3 避障系統(tǒng)設(shè)計(jì)</b></p><p> 3.1 常用避障電路的實(shí)現(xiàn)方法</p><p> 機(jī)器人小車避障電路設(shè)計(jì)常用的方法有兩類:一種
13、是超聲波發(fā)射,接收傳感器;另一種是紅外線發(fā)射傳感器。超聲波指向性強(qiáng),能量消耗緩慢,在介質(zhì)中傳播的距離較遠(yuǎn),因而超聲波經(jīng)常用于距離的測量,但超聲波技術(shù)受干擾影響比較大。采用紅外線技術(shù)設(shè)計(jì)避障電路,主要優(yōu)點(diǎn)是廉價(jià),而且,紅外線常用于遙控電路,技術(shù)比較常熟,電路電路設(shè)計(jì)也比較簡單,但是,它的避碰距離不是很遠(yuǎn),一般最遠(yuǎn)也不會(huì)超過1m。</p><p> 考慮到實(shí)驗(yàn)室的條件以及技術(shù)實(shí)用性,本項(xiàng)目主要采用的是紅外線技術(shù)設(shè)計(jì)
14、避障電路。</p><p> 3.2 紅外線避障系統(tǒng)的實(shí)現(xiàn)</p><p> 3.2.1紅外線避障電路基本原理</p><p> 采用紅外線技術(shù)設(shè)計(jì)避障電路方法一般有兩種[11],一種是基于紅外線發(fā)射二級管和紅外線接收二級管來設(shè)計(jì);另外一種是基于紅外線發(fā)射二極管以及紅外線接收頭來設(shè)計(jì),兩種方法的最大區(qū)別就在于接收電路,前者主要是要自行設(shè)計(jì)出紅外接收二極管的接
15、收電路,而后者用到的紅外接收頭內(nèi)部就是一個(gè)接收電路,所以后者就比較簡潔,而且效果比前者要好的多。</p><p> 3.2.2紅外發(fā)射軟件中斷設(shè)計(jì)</p><p> 紅外線設(shè)置檢測到障礙后會(huì)向ARM的中斷寄存器發(fā)送一個(gè)高低電平的脈沖信號,我們軟件通過讀取這個(gè)電平脈沖來調(diào)用電機(jī)的轉(zhuǎn)彎程序,以實(shí)現(xiàn)小車的避障功能。</p><p> 軟件設(shè)計(jì)過程中,我把寄存器PCO
16、NG設(shè)置為控制寄存器,將PDATG設(shè)置成數(shù)字寄存器,通過改變PCONG的 高低電平來獲得PDATG的數(shù)值,如果是高電平,保持原來的轉(zhuǎn)速,即沒遇到障礙,如果是低電平就調(diào)用電機(jī)轉(zhuǎn)彎的程序。</p><p><b> 程序?qū)崿F(xiàn)如下:</b></p><p> #include <stdio.h></p><p> #include
17、<stdlib.h></p><p> #include<unistd.h></p><p> #include<fcntl.h></p><p> #include<linux/rtc.h></p><p> #include<linux/ioctl.h></p>
18、;<p> #include <linux/errno.h></p><p> #include <linux/fs.h></p><p> #define PCONG(*(volatile unsigned *)0x01d20040) //定義地址</p><p> #define PDATG(*(v
19、olatile unsigned *)0x01d20044) //定義地址</p><p> int value[2];</p><p> typedef unsigned long U32;</p><p> void delay(U32 time)</p><p><b> {</b></p&
20、gt;<p> while(time--);</p><p><b> }</b></p><p> int start_motor(int r ,int l)</p><p><b> {</b></p><p><b> int fd,i;</b>&
21、lt;/p><p> U32 times1,times2;</p><p> value[0]=r;</p><p> value[1]=l;</p><p> fd=open("/dev/motor_drv",O_RDWR); //打開電機(jī)驅(qū)動(dòng)程序</p><p> if(fd=
22、=-1)</p><p><b> {</b></p><p> perror("open");</p><p><b> exit(-1);</b></p><p><b> }</b></p><p> write(fd
23、,value,2*sizeof(int));</p><p> delay(10000);</p><p> close(fd);</p><p><b> return 0;</b></p><p><b> }</b></p><p> int main()&l
24、t;/p><p><b> {</b></p><p><b> int i;</b></p><p> PCONG &= 0xfffffff3;/*PG1->input*/</p><p> while(1) {</p><p> if(PDA
25、TG & 0X00000002) {/*HIGH LEVEL*/</p><p> printf("紅外線沒檢測到障礙\n");</p><p><b> }</b></p><p><b> else {</b></p><p> printf("
26、;紅外線檢測障礙\n");</p><p> /*call the motor driver*/</p><p> start_motor(50,0); /*調(diào)用電機(jī)左轉(zhuǎn)程序*/</p><p><b> sleep(1);</b></p><p> start_m
27、otor(50,50);</p><p><b> }</b></p><p><b> }</b></p><p><b> return 0;</b></p><p><b> }</b></p><p> 這個(gè)方案是
28、通過應(yīng)用程序直接讀取寄存器數(shù)據(jù)來實(shí)現(xiàn)中斷過程,實(shí)際上還可以通過系統(tǒng)的中斷控制來設(shè)置寄存器的值,然后再調(diào)用中斷程序?qū)崿F(xiàn)想要的結(jié)果,第二個(gè)方案比較復(fù)雜,而且還涉及到系統(tǒng)的驅(qū)動(dòng)程序調(diào)用,實(shí)現(xiàn)過程中的中斷感應(yīng)可能存在問題,所以本次項(xiàng)目還是運(yùn)用了應(yīng)用程序的實(shí)現(xiàn)。</p><p> 4 速度測量實(shí)時(shí)反饋</p><p><b> 4.1 方案總述</b></p>
29、;<p> S3C44B0X本身不具有外部脈沖計(jì)數(shù)功能,可利用可編程定時(shí)計(jì)數(shù)器82C54在S3C44B0X系統(tǒng)中實(shí)現(xiàn)測量電機(jī)轉(zhuǎn)速.</p><p> 在機(jī)器人控制中,我們需要知道它的狀態(tài),這就需要測量.對于機(jī)器人行走常需要分時(shí)或連續(xù)測量和顯示其轉(zhuǎn)速及瞬時(shí)轉(zhuǎn)速.為了能精確地測量轉(zhuǎn)速外,還要保證測量的實(shí)時(shí)性,要求能測得瞬時(shí)轉(zhuǎn)速.轉(zhuǎn)速測量方法分為模擬式和數(shù)字式兩種,模擬式采用測速發(fā)電機(jī)為檢測元件,得到
30、的信號是電壓量,而數(shù)字式通常采用光電編碼器、圓光柵、霍爾元件等為檢測元件,得到的信號是脈沖信號.隨著微型計(jì)算機(jī)的廣泛應(yīng)用,特別是高性能/價(jià)格比的單片機(jī)的涌現(xiàn),轉(zhuǎn)速測量普遍采用了以單片機(jī)為核心的數(shù)字法,智能化微電腦式代替了一般機(jī)械式或模擬量結(jié)構(gòu).</p><p> 4.2 方案選擇和實(shí)施</p><p> 4.2.1 選擇方案</p><p> 在我們的這個(gè)項(xiàng)
31、目中選用霍爾集成元件作為傳感器,主要因?yàn)樗旧聿慌禄覊m,適合露天場地,且體積小,價(jià)格便宜,可單電源供電,使用極其方便,因此本測量系統(tǒng)轉(zhuǎn)速信號檢測點(diǎn)采用霍爾集成傳感器作為轉(zhuǎn)速檢測探頭.</p><p> 4.2.2 任務(wù)實(shí)施</p><p> 把探頭(霍爾元件)固定在距齒輪外圓lmm的支架上[3],在霍爾元件的正對面貼一小塊磁鋼(B>18000T,B為磁鋼強(qiáng)度要求),當(dāng)測速齒輪的每
32、個(gè)齒經(jīng)過探頭正前方時(shí),改變了磁通密度,探頭就輸出一個(gè)標(biāo)準(zhǔn)的脈沖信號.檢測元件選用型號為CS3020開關(guān)集成霍爾傳感器.此元件是OC門,因此在輸出端與電源之間要接一個(gè)電阻,</p><p> 4.2.3 計(jì)數(shù)模塊設(shè)計(jì)</p><p> 鑒于S3C44B0X本身不具有外部脈沖計(jì)數(shù)功能,需要在已有的硬件資源基礎(chǔ)上擴(kuò)展外圍電路。利用可編程定時(shí)計(jì)數(shù)器82C54是個(gè)很好的選擇。</p>
33、<p> Intel 82C54是專用的可編程定時(shí)計(jì)數(shù)芯片[15],82C54通過對加在其cLK 輸入引腳的脈沖進(jìn)行計(jì)數(shù), 脈沖最高頻率可以達(dá)到10MHz, 使用靈活,功能強(qiáng)大。采用82C54對系統(tǒng)外圍進(jìn)行硬件設(shè)計(jì)。S3C44B0X的數(shù)據(jù)線D0~D7通過74LVCA245接82C54的數(shù)據(jù)線,74LVCA245的作用是實(shí)現(xiàn)了CPU 的3.3V 電壓和82C54的5V 電壓的穩(wěn)定轉(zhuǎn)換。片選可使用S3C44B0X的任意空余片
34、選nGCSx,如果整個(gè)系統(tǒng)還有其他外圍電路需要較多片選,也可利用S3C44B0X的地址線接74HC138譯碼器擴(kuò)展出多路片選信號供系統(tǒng)其它資源使用。</p><p> 5 ARM開發(fā)平臺及uClinu操作系統(tǒng)的設(shè)計(jì)</p><p> 5.1 ARM開發(fā)平臺</p><p> 5.1.1 基本設(shè)置</p><p> 首先,要了解一下
35、如何通過串口終端與ARM板進(jìn)行通信,將隨板配帶的串口線(DB9 為雙母,直連)一端接FS44B0X 開發(fā)板的COM1,串口線的另一端接電腦的COM1(或COM2),接好后,在PC機(jī)上打開一個(gè)超級終端。</p><p> 在linux下,打開gnome終端,在命令行里輸入minicom –s。然后對串口終端進(jìn)行一下配置。選中Serial port setup,按照要求配置串口功能屬性。保存退出。鍵入minicom
36、,給ARM開發(fā)板上電,在命令行模式下鍵入ap,設(shè)置。這樣linux的串口終端便建立起來了(這樣,在linux操作系統(tǒng)下,uclinux內(nèi)核鏡像image.rom可以直接通過該串口燒寫入ARM目標(biāo)板)。</p><p> 5.2 uClinux內(nèi)核編譯</p><p> ARM上的uclinux操作系統(tǒng)是出廠前就被開發(fā)人員燒入的[14],很多功能都不具備,編譯uclinux內(nèi)核的目的,不
37、僅僅在于學(xué)習(xí)怎樣編譯內(nèi)核,還在于通過配置來完善uclinux操作系統(tǒng)</p><p> 5.3設(shè)備驅(qū)動(dòng)程序設(shè)計(jì)</p><p> 設(shè)備驅(qū)動(dòng)程序:motor_driv.c</p><p><b> 驅(qū)動(dòng)程序原理:</b></p><p> 通過輸入來設(shè)置寄存器的值,經(jīng)過PWM波形輸出來實(shí)現(xiàn)電機(jī)的輸入,電機(jī)的輸入是經(jīng)
38、過電機(jī)驅(qū)動(dòng)板來驅(qū)動(dòng)電機(jī)的轉(zhuǎn)速。</p><p> 以下是電機(jī)驅(qū)動(dòng)程序的部分代碼:</p><p> #define rPCOND(*(volatile unsigned *)0x1d2001c)</p><p> #define rPDATD(*(volatile unsigned *)0x1d20020)</p><p>
39、#define rPUPD(*(volatile unsigned *)0x1d20024)</p><p> #define rPCONE(*(volatile unsigned *)0x1d20028)</p><p> #define rPDATE(*(volatile unsigned *)0x1d2002c)</p><p> #defi
40、ne rPUPE(*(volatile unsigned *)0x1d20030)</p><p> /* Timer */</p><p> #define rTCFG0(*(volatile unsigned *)0x1d50000)</p><p> #define rTCFG1(*(volatile unsigned *)0x1d50004
41、)</p><p> #define rTCON(*(volatile unsigned *)0x1d50008)</p><p> #define rTCNTB0(*(volatile unsigned *)0x1d5000c)</p><p> #define rTCMPB0(*(volatile unsigned *)0x1d50010)&l
42、t;/p><p> #define rTCNTO0(*(volatile unsigned *)0x1d50014)</p><p> #define rTCNTB1(*(volatile unsigned *)0x1d50018)</p><p> #define rTCMPB1(*(volatile unsigned *)0x1d5001c)<
43、;/p><p> #define rTCNTO1(*(volatile unsigned *)0x1d50020)</p><p> #define rTCNTB2(*(volatile unsigned *)0x1d50024)</p><p> #define rTCMPB2(*(volatile unsigned *)0x1d50028)<
44、/p><p> #define rTCNTO2(*(volatile unsigned *)0x1d5002c)</p><p> #define rTCNTB3(*(volatile unsigned *)0x1d50030)</p><p> #define rTCMPB3(*(volatile unsigned *)0x1d50034)</
45、p><p> #define rTCNTO3(*(volatile unsigned *)0x1d50038)</p><p> #define rTCNTB4(*(volatile unsigned *)0x1d5003c)</p><p> #define rTCMPB4(*(volatile unsigned *)0x1d50040)</p
46、><p> #define rTCNTO4(*(volatile unsigned *)0x1d50044)</p><p> void init()</p><p><b> {</b></p><p> rPCONE&=0xffff00ff;</p><p> rPCONE
47、|=0x0001aa00;</p><p> rPDATE=0x00000000;</p><p> rPCOND=0x00000050;</p><p> rPDATD=0x0c;</p><p><b> }</b></p><p> void change_lmotor_stat
48、e(U16 Freq, int Hil )</p><p><b> {</b></p><p> if( Freq > MaxBeepFreq )</p><p> Freq = MaxBeepFreq;</p><p> if(Hil>100)</p><p> Hil
49、= 100;</p><p> rTCON &= 0xfffff0ff;// clear manual update bit, stop Timer1</p><p> rTCFG0 &= 0xffffff00;// set Timer 1&2 prescaler 0</p><p> rTCFG1 &am
50、p;= 0xffffff0f;// set Timer 1 MUX 1/16 </p><p> rTCFG1 |= 0x00000030;</p><p> rTCNTB1 = (MCLK)/(Freq*16); </p><p> rTCMPB1 = (rTCNTB1*(50-0.5*Hil))/100; </
51、p><p> printk("TCNTO:%d;TCNTB:%d,TCMPB1:%d\n",rTCNTO1,rTCNTB1,rTCMPB1);</p><p> rTCON|= 0x00000200;// manual update</p><p> rTCON&= 0xfffff0ff; // clear man
52、al update bit</p><p> rTCON |= 0x00000d00;// auto reload, inverter on, start Timer 1</p><p> rTCON &= 0xffff0fff;// clear manual update bit, stop Timer2</p><p> r
53、TCFG0 &= 0xffff00ff;// set Timer 2&3 prescaler 0</p><p> rTCFG1 &= 0xfffff0ff;// set Timer 2 MUX 1/16</p><p> rTCFG1 |= 0x00000300;</p><p> rTCNTB2 = (MC
54、LK)/(Freq*16); </p><p> rTCMPB2 = (rTCNTB2*(50-0.5*Hil))/100;</p><p> rTCON|= 0x00002000;// manual update</p><p> rTCON&= 0xffff0fff
55、; // clear manal update bit</p><p> rTCON |= 0x00009000;// auto reload, inverter off, start Timer 2</p><p><b> }</b></p><p> //****************************
56、*****************************************************// right_motor:</p><p> //*********************************************************************************</p><p> void change_rmotor_stat
57、e(U16 Freq, int Hir)</p><p><b> {</b></p><p> if(Freq>MaxBeepFreq)</p><p> Freq = MaxBeepFreq;</p><p> if(Hir>100)</p><p> Hir = 100
58、;</p><p> rTCON &= 0xfff0ffff;// clear manual update bit, stop Timer3</p><p> rTCFG0 &= 0xffff00ff;// set Timer 2&3 prescaler 0</p><p> rTCFG1 &= 0
59、xffff0fff;// set Timer 3 MUX 1/16</p><p> rTCFG1 |= 0x00003000;</p><p> rTCNTB3 = (MCLK)/(Freq*16);</p><p> rTCMPB3 = (rTCNTB3*(50+0.5*Hir))/100;
60、 rTCON|= 0x00020000;// manual update</p><p> rTCON&= 0xfff0ffff; // clear manal update bit</p><p> rTCON |= 0x000d0000; </p><p> rTCON &am
61、p;= 0xff0fffff;// clear manual update bit, stop Timer4</p><p> rTCFG0 &= 0xff00ffff;// set Timer 4&5 prescaler 0</p><p> rTCFG1 &= 0xfff0ffff;// set Timer 4 MUX 1/
62、16</p><p> rTCFG1 |= 0x00030000;</p><p> rTCNTB4 = (MCLK)/(Freq*16); </p><p> rTCMPB4 = (rTCNTB4*(50+0.5*Hir))/100; </p><
63、p> rTCON|= 0x00200000;// manual update</p><p> rTCON&= 0xff0fffff; // clear manal update bit</p><p> rTCON |= 0x00900000;}</p><p> static int motor_dr
64、v_write (struct file *filp, const char *buf,size_t count,loff_t *f_pos)</p><p><b> { </b></p><p> if(*buf==0&&buf[4]==0)</p><p><b> { </b><
65、/p><p> change_lmotor_state(50,0) ;</p><p> change_rmotor_state(50,0) ;</p><p> rTCON &=0xfeeeeff;</p><p> //printk("%d\n",buf[4]);</p><p>
66、 //for (j=0;j<6;j++)</p><p> printk("it is stoped!\n");</p><p> //printk("it is %d\n",*buf++);</p><p><b> }</b></p><p> else {i
67、nt uc[2];</p><p> int *data=(int *)buf;</p><p> unsigned int fre=50;</p><p> printk("write sucess:\n");</p><p> copy_from_user(uc,data,count);</p>
68、<p> printk("uc is:%d...%d\n",uc[0],uc[1]);</p><p> change_lmotor_state(fre,uc[0]) ;</p><p> change_rmotor_state(fre,uc[1]) ;</p><p> //delay(10000000);</p>
69、<p> //rTCON &= ~0x1000;</p><p> //printk("寫操作完成!\n");</p><p><b> } }</b></p><p> 設(shè)備驅(qū)動(dòng)程序?qū)?yīng)的Makefile </p><p> Makefile內(nèi)容顯示如下:
70、</p><p> CC = /opt/host/armv4l/bin/armv4l-unknown-linux-gcc</p><p> LD = /opt/host/armv4l/bin/armv4l-unknown-linux-ld</p><p> CFLAGS=-D__KERNEL__-I/HHARM2410-R3/kernel/include/li
71、nux-I/HHARM2410-R3/kernel/include-Wall-Wstrict-prototypes-Wno-trigraphs-Os-mapcs-fno-strict-aliasing-fno-common-fno-common–pipe-mapcs-32-march=armv4-mtune=arm9tdmi-mshort-load-bytes-msoft-float-DKBUILD_BASENAME=motor_dri
72、v-I/opt/host/armv4l/src/linux/include –DMODULE</p><p> motor_driv.o: motor_driv.c</p><p> $(CC) $(CFLAGS) -c $^ -o $@</p><p> cp motor_driv.o / -f</p><p><b>
73、clean:</b></p><p><b> -rm-f *.o</b></p><p> 通過應(yīng)用程序來調(diào)用設(shè)備驅(qū)動(dòng)的實(shí)現(xiàn),下面是start_motor.c應(yīng)用程序的內(nèi)容:</p><p> #include<unistd.h></p><p> #include<fcntl.h
74、></p><p> #include<linux/rtc.h></p><p> #include<linux/ioctl.h></p><p> #include <linux/errno.h></p><p> #define DEFAULT_RSPEED50</p>
75、<p> #define DEFAULT_LSPEED50</p><p> typedef unsigned int U32;</p><p> void delay(U32 time)</p><p><b> {</b></p><p> while(time--);</p>
76、<p><b> }</b></p><p> int main(int argc ,char **argv)</p><p><b> {</b></p><p><b> int fd;</b></p><p><b> int i;<
77、/b></p><p><b> int r,l;</b></p><p> unsigned long data[2];</p><p> int retval;</p><p> printf("you have entry the main");</p><p&
78、gt; fd=open("/dev/motor_drv",O_RDWR);</p><p> if(argc == 1) {/*default setting*/</p><p> r = DEFAULT_RSPEED;</p><p> l = DEFAULT_LSPEED;</p><p><b>
79、; }</b></p><p><b> else {</b></p><p> char *r_speed;</p><p> char *l_speed;</p><p> r_speed = argv[1];</p><p> l_speed = argv[2];&l
80、t;/p><p> r = atoi(r_speed);</p><p> l = atoi(l_speed);</p><p><b> }</b></p><p> if(r <= -100 || r >= 100 || l <= -100 || l >= 100) {</p>
81、<p> printf("error:you must input the arguments between (-100,100)\n");</p><p> return -1;</p><p><b> }</b></p><p> data[0] = r;</p><p>
82、; data[1] = l;</p><p> if(fd == -1) {</p><p> error("open");</p><p><b> exit(-1);</b></p><p><b> }</b></p><p> retv
83、al = write(fd,&data,sizeof(data));</p><p> return retval;</p><p><b> }</b></p><p> 將驅(qū)動(dòng)程序編譯入內(nèi)核</p><p> 第一步, 將驅(qū)動(dòng)程序到嵌入式uclinux 系統(tǒng)</p><p>
84、 將motor_driv.c 復(fù)制到uClinux-dist/linux-2.4.x/drivers/char 目錄下,在該目錄Makefile 中增加如下代碼:</p><p> ifeq ( $(CONFIG—MOTORDRIVE) ,y) </p><p> L -OBJS + = motor_driv.o</p><p><b> Endif
85、</b></p><p> 第二步, 修改config.in文件</p><p> 在uClinux/linux-2.4.x/arch/m68knommu 目錄下config. in 中</p><p> 字符設(shè)備段里增加如下代碼:</p><p> bool ′support for MOTOR_DRIV′CONFIG—
86、MOTORDRIVE y</p><p> 系統(tǒng)編譯驅(qū)動(dòng)程序,運(yùn)行make xconfig;make dep;make linux;make linux.text;make linux.data;cat linux.text linux.data > linux.bin。 第三步,建立設(shè)備節(jié)點(diǎn)</p><p> 在 /uclinux/romfs/romfs/dev/目錄下創(chuàng)
87、建設(shè)備:mknod motor c 220 0。并且在/uclinux/appsrc/下運(yùn)行make,生成新的romfs.s19文件。 </p><p> 到這里,在uclinux操作系統(tǒng)中增加設(shè)備驅(qū)動(dòng)程序便完成了,只要將新的linux.bin與romfs.s19燒入目標(biāo)板中,即可通過運(yùn)行應(yīng)用程序來調(diào)用設(shè)備驅(qū)動(dòng)程序了。就這樣,我們的項(xiàng)目已經(jīng)基本完成。很多細(xì)節(jié)問題可能沒有考慮到,希望在以后的學(xué)習(xí)和生活中再去完善
88、和總結(jié)吧。</p><p><b> 6 設(shè)計(jì)總結(jié)</b></p><p><b> 總結(jié):</b></p><p> 本文主要對基于ARM開發(fā)的自主式移動(dòng)機(jī)器人小車進(jìn)行了研究,實(shí)現(xiàn)了小車的最基本功能。</p><p> 小車的基本系統(tǒng)主要包括避障傳感器部分,電機(jī)控制部分,速度反饋部分以及
89、ARM嵌入式系統(tǒng)核心控制部分。首先,是設(shè)計(jì)出了避障傳感器系統(tǒng),該系統(tǒng)采用紅外線技術(shù),主要完成對障礙物的感應(yīng);其次,是設(shè)計(jì)出了移動(dòng)機(jī)器人小車的電機(jī)控制轉(zhuǎn)速部分,該系統(tǒng)采用步進(jìn)電機(jī)作為電機(jī)首選,同時(shí)采用集成芯片L297加L298配合使用來作為電機(jī)的驅(qū)動(dòng)控制部分;</p><p> 該系統(tǒng)目前完成的主要功能就是:小車前進(jìn),轉(zhuǎn)彎,后退行使,若系統(tǒng)發(fā)現(xiàn)前方有障礙物,那么運(yùn)動(dòng)控制系統(tǒng)內(nèi)的電機(jī)就轉(zhuǎn)彎;若系統(tǒng)發(fā)現(xiàn)前方?jīng)]有障礙物
90、,那么電機(jī)就繼續(xù)前進(jìn)。</p><p> 還可以將電機(jī)轉(zhuǎn)動(dòng)的真實(shí)數(shù)據(jù)給傳送回來。</p><p><b> 。</b></p><p><b> 參考文獻(xiàn):</b></p><p> [1] 求是科技,單片機(jī)典型模塊設(shè)計(jì)實(shí)例導(dǎo)航[J] ,人民郵電出版社,2002年8月。</p>
91、<p> [2] 張俊謨,單片機(jī)中級教程[M], 北京航空航天大學(xué)出版社,2001年6月。</p><p> [3] 王昊等,通用電子元器件的選用與檢測[J] ,電子工業(yè)出版社,1998年6月。</p><p> [4] 王力等,protel 99se典型實(shí)例[L] ,人民郵電出版社,1996年5月。</p><p> [5] 朱金剛,系列單片機(jī)
92、C語言編程入門 ,電子制手2003年第一期。</p><p> [6] 張德偉等,偉福仿真器實(shí)際應(yīng)用中的常見問題探討[H], 實(shí)驗(yàn)室研究與探索 2006年7月第25卷第7期。</p><p> [7] Alessandro Rbuini LINUX DEVIE DRIVA[K],中國電力出版社,1999年6月。</p><p> [8] Karim Yagh
93、mour BUILDING EMBEDDED LINUX SYSTEMS[F] ,中國電力出版社,</p><p><b> 1998年6月。</b></p><p> [9] 楊虎等,CGI步步高[J] ,機(jī)械工業(yè)出版社,2000年6月。</p><p> [10] 邁克、普瑞德科,機(jī)器人控制器與程序設(shè)計(jì)[M] , 科學(xué)出版社,2001
94、年3月。</p><p> [11] 陳永甫,紅外控測與控制電路[L] ,人民郵電出版社,1998年7月。</p><p> [12] 周金華、王松德,紅外線地射接收演示裝置設(shè)計(jì)[K] ,洛陽師范院校學(xué)報(bào)2004年第2期。</p><p> [13] 李巖、榮盤祥 基于S3C44B0X嵌入式uClinux系統(tǒng)原理及應(yīng)用[K],清華大學(xué)出版社,</p>
溫馨提示
- 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. 眾賞文庫僅提供信息存儲(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 自由行走機(jī)器人課程設(shè)計(jì)
- 機(jī)器人課程設(shè)計(jì)
- 機(jī)器人課程設(shè)計(jì)
- 機(jī)器人行走設(shè)計(jì)電路課程設(shè)計(jì)
- 智能機(jī)器人小車畢業(yè)設(shè)計(jì)
- 機(jī)器人行走電路課程設(shè)計(jì)
- 機(jī)器人課程設(shè)計(jì)報(bào)告
- 迷宮機(jī)器人課程設(shè)計(jì)
- 足式行走機(jī)器人設(shè)計(jì)-機(jī)械控制課程設(shè)計(jì)
- 滅火機(jī)器人課程設(shè)計(jì)
- 兩足機(jī)器人課程設(shè)計(jì)報(bào)告
- 工業(yè)機(jī)器人課程設(shè)計(jì)學(xué)習(xí)報(bào)告
- 機(jī)械課程設(shè)計(jì)---爬桿機(jī)器人
- 機(jī)器人小車運(yùn)動(dòng)軌跡的控制方法設(shè)計(jì)研究.pdf
- 基于嵌入式技術(shù)的機(jī)器人小車設(shè)計(jì).pdf
- 哈工大自動(dòng)控制元件課程設(shè)計(jì)撿乒乓球機(jī)器人小車
- 智能掃地機(jī)器人課程設(shè)計(jì)
- 機(jī)械原理課程設(shè)計(jì)--爬桿機(jī)器人
- 輪式移動(dòng)機(jī)器人課程設(shè)計(jì)
- 輪式移動(dòng)機(jī)器人課程設(shè)計(jì)
評論
0/150
提交評論