版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、<p><b> 機器人課程設(shè)計</b></p><p> 自主行走機器人小車的設(shè)計</p><p> 學院: </p><p> 班級: </p><p> 姓名: </p><p> 學號: </
2、p><p> 摘要:本文通過對ARM開發(fā)和研究,實現(xiàn)移動機器人小車自主行走,速度反饋和紅外線避障的功能。</p><p> 小車系統(tǒng)的組成主要包括避障傳感器部分,電機控制部分,速度反饋部分以及ARM嵌入式系統(tǒng)核心控制部分。避障傳感器系統(tǒng)采用紅外線技術(shù),主要完成對障礙物的感應(yīng);移動機器人小車的電機控制轉(zhuǎn)速部分采用步進電機作為電機首選;還有速度反饋的部分,由于ARM板內(nèi)部沒有記數(shù)的功能,我們就
3、設(shè)計了傳感器數(shù)據(jù)讀取的一個系統(tǒng)。最后,貫穿整篇文章的是對機器人的核心部分(基于ARM嵌入式系統(tǒng))的研究和設(shè)計,主要讓操作系統(tǒng)完成控制功能(主要是通過接收避障系統(tǒng)感應(yīng)外界環(huán)境所返回的信號,進而控制運動控制系統(tǒng),從而完成一個自主運動的智能功能)。</p><p> 關(guān)鍵詞:ARM板;自主行走;紅外線感應(yīng);嵌入式操作系統(tǒng);電機</p><p> 1 機器人實現(xiàn)方法和實現(xiàn)過程</p&g
4、t;<p> 以S3C44B0X實驗板為平臺,以及避障系統(tǒng)和運動控制系統(tǒng)兩部分結(jié)合起來構(gòu)成整個移動機器人最主要的硬件部分。其中,實驗板為移動機器人的中樞神經(jīng)部分,它承擔著對于外部硬件的全權(quán)管理(包括接收外部硬件的傳遞過來的信息,對信息進行相應(yīng)的處理,以及把處理后的信息再傳遞給外部硬件);避障系統(tǒng)為整個機器人系統(tǒng)的感應(yīng)部分,一切外界環(huán)境的識別都有避障系統(tǒng)來完成;運動控制系統(tǒng)為整個機器人系統(tǒng)的移動部分,它承擔著讓機器人能自由
5、的在物理環(huán)境中移動的功能。</p><p><b> 1.1 實現(xiàn)過程</b></p><p> 以S3C44B0開發(fā)板構(gòu)建整個機器人的中樞神經(jīng),主要是采用嵌入式操作系統(tǒng)來管理。</p><p> 這里具體工作主要包括將uClinux操作系統(tǒng)移植入ARM,以及在操作系統(tǒng)下編寫外部驅(qū)動程序來識別和控制外圍硬件(主要是避障系統(tǒng)和運動控制系統(tǒng))
6、。</p><p> 避障系統(tǒng)設(shè)計:采用紅外線來實現(xiàn)避障(電路設(shè)計,調(diào)試)。</p><p> 運動控制系統(tǒng)設(shè)計:采用直流電機來實現(xiàn)機器人的移動功能(電路設(shè)計,調(diào)試)。</p><p> 軟件設(shè)計部分:主要是應(yīng)用程序配合外部硬件驅(qū)動程序。下文將詳細介紹軟件實現(xiàn)的具體方法和實現(xiàn)代碼。</p><p> 2 自主行走機器人的行走控制方案
7、</p><p> 2.1 直流電機的控制方案</p><p> 一個電動小車整體的運行性能,首先取決于它的電池系統(tǒng)和電機驅(qū)動系統(tǒng)。電動小車的驅(qū)動系統(tǒng)一般由控制器、功率變換器及電動機三個主要部分組成。電動小車的驅(qū)動不但要求電機驅(qū)動系統(tǒng) 具有高轉(zhuǎn)矩重量比、寬調(diào)速范圍、高可靠性,而且電機的轉(zhuǎn)矩-轉(zhuǎn)速特性受電源功率的影響,這就要求驅(qū)動具有盡可能寬 的高效率區(qū)。我們所使用的電機一般為直流電機
8、,主要用到永磁直流電機、伺服電機及步進電機三種。直流電機的控制很簡單,性能出眾,直流電源也容易實現(xiàn)。這里主要介紹這種直流電機的驅(qū)動及控制。</p><p><b> 2.2 驅(qū)動電路</b></p><p> 2.2.1驅(qū)動芯片介紹</p><p> L298是ST公司生產(chǎn)的一種高電壓、大電流電機驅(qū)動芯片,直接采用,TTL邏輯電平控制,
9、可用來驅(qū)動繼電器、線圈、直流電動機、步進電動機等電感性負載。該芯片的主要特點是:工作電壓高,最高工作電壓可達46V;輸出電流大,瞬間峰值電流可達3A,持續(xù)工作電流為2A;內(nèi)含兩個H橋的高電壓大電流全橋式驅(qū)動器,可以用來驅(qū)動直流電動機和步進電動機、繼電器、線圈等感性負載;采用標準TTL邏輯電平信號控制;具有兩個使能控制端,在不受輸入信號影響的情況下允許或禁止器件工作有一個邏輯電源輸入端,使內(nèi)部邏輯電路部分在低電壓下工作;可以外接檢測電阻,
10、將變化量反饋給控制電路。其芯片原理結(jié)構(gòu)圖如下:</p><p><b> 原理圖</b></p><p> 2.2.2 驅(qū)動電路</p><p> 直流電機驅(qū)動電路使用最廣泛的就是H型全橋式電路,這種驅(qū)動電路可以很方便實現(xiàn)直流電機的四象限運行,分別對應(yīng)正轉(zhuǎn)、正轉(zhuǎn)制動、反轉(zhuǎn)、反轉(zhuǎn)制動。 它的基本原理圖</p><p>
11、; 如圖1所示: </p><p> 全橋式驅(qū)動電路的4只開關(guān)管都工作在斬波狀態(tài),S1、S2為一組,S3、S4 為另一組,兩組的狀態(tài)互補,一組導通則另一組必須關(guān)斷。當S1、S2導通時,S3、 S4關(guān)斷,電機兩端加正向電壓,可以實 現(xiàn)電機的正轉(zhuǎn)或反轉(zhuǎn)制動;當S3、S4導 通時,S1、S2關(guān)斷,電機兩端為反向電壓,電機反轉(zhuǎn)或正轉(zhuǎn)制動。</p><
12、;p> 此部分是單純的硬件設(shè)計,沒涉及到軟件方面,但是實現(xiàn)驅(qū)動電機的功能時,我們軟件輸出必須通過驅(qū)動電路來實現(xiàn)驅(qū)動。所以這個部分和軟件設(shè)計也是密不可分的一個環(huán)節(jié)。</p><p><b> 3 避障系統(tǒng)設(shè)計</b></p><p> 3.1 常用避障電路的實現(xiàn)方法</p><p> 機器人小車避障電路設(shè)計常用的方法有兩類:一種
13、是超聲波發(fā)射,接收傳感器;另一種是紅外線發(fā)射傳感器。超聲波指向性強,能量消耗緩慢,在介質(zhì)中傳播的距離較遠,因而超聲波經(jīng)常用于距離的測量,但超聲波技術(shù)受干擾影響比較大。采用紅外線技術(shù)設(shè)計避障電路,主要優(yōu)點是廉價,而且,紅外線常用于遙控電路,技術(shù)比較常熟,電路電路設(shè)計也比較簡單,但是,它的避碰距離不是很遠,一般最遠也不會超過1m。</p><p> 考慮到實驗室的條件以及技術(shù)實用性,本項目主要采用的是紅外線技術(shù)設(shè)計
14、避障電路。</p><p> 3.2 紅外線避障系統(tǒng)的實現(xiàn)</p><p> 3.2.1紅外線避障電路基本原理</p><p> 采用紅外線技術(shù)設(shè)計避障電路方法一般有兩種[11],一種是基于紅外線發(fā)射二級管和紅外線接收二級管來設(shè)計;另外一種是基于紅外線發(fā)射二極管以及紅外線接收頭來設(shè)計,兩種方法的最大區(qū)別就在于接收電路,前者主要是要自行設(shè)計出紅外接收二極管的接
15、收電路,而后者用到的紅外接收頭內(nèi)部就是一個接收電路,所以后者就比較簡潔,而且效果比前者要好的多。</p><p> 3.2.2紅外發(fā)射軟件中斷設(shè)計</p><p> 紅外線設(shè)置檢測到障礙后會向ARM的中斷寄存器發(fā)送一個高低電平的脈沖信號,我們軟件通過讀取這個電平脈沖來調(diào)用電機的轉(zhuǎn)彎程序,以實現(xiàn)小車的避障功能。</p><p> 軟件設(shè)計過程中,我把寄存器PCO
16、NG設(shè)置為控制寄存器,將PDATG設(shè)置成數(shù)字寄存器,通過改變PCONG的 高低電平來獲得PDATG的數(shù)值,如果是高電平,保持原來的轉(zhuǎn)速,即沒遇到障礙,如果是低電平就調(diào)用電機轉(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); //打開電機驅(qū)動程序</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)用電機左轉(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> 這個方案是
28、通過應(yīng)用程序直接讀取寄存器數(shù)據(jù)來實現(xiàn)中斷過程,實際上還可以通過系統(tǒng)的中斷控制來設(shè)置寄存器的值,然后再調(diào)用中斷程序?qū)崿F(xiàn)想要的結(jié)果,第二個方案比較復雜,而且還涉及到系統(tǒng)的驅(qū)動程序調(diào)用,實現(xiàn)過程中的中斷感應(yīng)可能存在問題,所以本次項目還是運用了應(yīng)用程序的實現(xiàn)。</p><p> 4 速度測量實時反饋</p><p><b> 4.1 方案總述</b></p>
29、;<p> S3C44B0X本身不具有外部脈沖計數(shù)功能,可利用可編程定時計數(shù)器82C54在S3C44B0X系統(tǒng)中實現(xiàn)測量電機轉(zhuǎn)速.</p><p> 在機器人控制中,我們需要知道它的狀態(tài),這就需要測量.對于機器人行走常需要分時或連續(xù)測量和顯示其轉(zhuǎn)速及瞬時轉(zhuǎn)速.為了能精確地測量轉(zhuǎn)速外,還要保證測量的實時性,要求能測得瞬時轉(zhuǎn)速.轉(zhuǎn)速測量方法分為模擬式和數(shù)字式兩種,模擬式采用測速發(fā)電機為檢測元件,得到
30、的信號是電壓量,而數(shù)字式通常采用光電編碼器、圓光柵、霍爾元件等為檢測元件,得到的信號是脈沖信號.隨著微型計算機的廣泛應(yīng)用,特別是高性能/價格比的單片機的涌現(xiàn),轉(zhuǎn)速測量普遍采用了以單片機為核心的數(shù)字法,智能化微電腦式代替了一般機械式或模擬量結(jié)構(gòu).</p><p> 4.2 方案選擇和實施</p><p> 4.2.1 選擇方案</p><p> 在我們的這個項
31、目中選用霍爾集成元件作為傳感器,主要因為它本身不怕灰塵,適合露天場地,且體積小,價格便宜,可單電源供電,使用極其方便,因此本測量系統(tǒng)轉(zhuǎn)速信號檢測點采用霍爾集成傳感器作為轉(zhuǎn)速檢測探頭.</p><p> 4.2.2 任務(wù)實施</p><p> 把探頭(霍爾元件)固定在距齒輪外圓lmm的支架上[3],在霍爾元件的正對面貼一小塊磁鋼(B>18000T,B為磁鋼強度要求),當測速齒輪的每
32、個齒經(jīng)過探頭正前方時,改變了磁通密度,探頭就輸出一個標準的脈沖信號.檢測元件選用型號為CS3020開關(guān)集成霍爾傳感器.此元件是OC門,因此在輸出端與電源之間要接一個電阻,</p><p> 4.2.3 計數(shù)模塊設(shè)計</p><p> 鑒于S3C44B0X本身不具有外部脈沖計數(shù)功能,需要在已有的硬件資源基礎(chǔ)上擴展外圍電路。利用可編程定時計數(shù)器82C54是個很好的選擇。</p>
33、<p> Intel 82C54是專用的可編程定時計數(shù)芯片[15],82C54通過對加在其cLK 輸入引腳的脈沖進行計數(shù), 脈沖最高頻率可以達到10MHz, 使用靈活,功能強大。采用82C54對系統(tǒng)外圍進行硬件設(shè)計。S3C44B0X的數(shù)據(jù)線D0~D7通過74LVCA245接82C54的數(shù)據(jù)線,74LVCA245的作用是實現(xiàn)了CPU 的3.3V 電壓和82C54的5V 電壓的穩(wěn)定轉(zhuǎn)換。片選可使用S3C44B0X的任意空余片
34、選nGCSx,如果整個系統(tǒng)還有其他外圍電路需要較多片選,也可利用S3C44B0X的地址線接74HC138譯碼器擴展出多路片選信號供系統(tǒng)其它資源使用。</p><p> 5 ARM開發(fā)平臺及uClinu操作系統(tǒng)的設(shè)計</p><p> 5.1 ARM開發(fā)平臺</p><p> 5.1.1 基本設(shè)置</p><p> 首先,要了解一下
35、如何通過串口終端與ARM板進行通信,將隨板配帶的串口線(DB9 為雙母,直連)一端接FS44B0X 開發(fā)板的COM1,串口線的另一端接電腦的COM1(或COM2),接好后,在PC機上打開一個超級終端。</p><p> 在linux下,打開gnome終端,在命令行里輸入minicom –s。然后對串口終端進行一下配置。選中Serial port setup,按照要求配置串口功能屬性。保存退出。鍵入minicom
36、,給ARM開發(fā)板上電,在命令行模式下鍵入ap,設(shè)置。這樣linux的串口終端便建立起來了(這樣,在linux操作系統(tǒng)下,uclinux內(nèi)核鏡像image.rom可以直接通過該串口燒寫入ARM目標板)。</p><p> 5.2 uClinux內(nèi)核編譯</p><p> ARM上的uclinux操作系統(tǒng)是出廠前就被開發(fā)人員燒入的[14],很多功能都不具備,編譯uclinux內(nèi)核的目的,不
37、僅僅在于學習怎樣編譯內(nèi)核,還在于通過配置來完善uclinux操作系統(tǒng)</p><p> 5.3設(shè)備驅(qū)動程序設(shè)計</p><p> 設(shè)備驅(qū)動程序:motor_driv.c</p><p><b> 驅(qū)動程序原理:</b></p><p> 通過輸入來設(shè)置寄存器的值,經(jīng)過PWM波形輸出來實現(xiàn)電機的輸入,電機的輸入是經(jīng)
38、過電機驅(qū)動板來驅(qū)動電機的轉(zhuǎn)速。</p><p> 以下是電機驅(qū)動程序的部分代碼:</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ū)動程序?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ū)動的實現(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ū)動程序編譯入內(nèi)核</p><p> 第一步, 將驅(qū)動程序到嵌入式uclinux 系統(tǒng)</p><p>
84、 將motor_driv.c 復制到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ū)動程序,運行make xconfig;make dep;make linux;make linux.text;make linux.data;cat linux.text linux.data > linux.bin。 第三步,建立設(shè)備節(jié)點</p><p> 在 /uclinux/romfs/romfs/dev/目錄下創(chuàng)
87、建設(shè)備:mknod motor c 220 0。并且在/uclinux/appsrc/下運行make,生成新的romfs.s19文件。 </p><p> 到這里,在uclinux操作系統(tǒng)中增加設(shè)備驅(qū)動程序便完成了,只要將新的linux.bin與romfs.s19燒入目標板中,即可通過運行應(yīng)用程序來調(diào)用設(shè)備驅(qū)動程序了。就這樣,我們的項目已經(jīng)基本完成。很多細節(jié)問題可能沒有考慮到,希望在以后的學習和生活中再去完善
88、和總結(jié)吧。</p><p><b> 6 設(shè)計總結(jié)</b></p><p><b> 總結(jié):</b></p><p> 本文主要對基于ARM開發(fā)的自主式移動機器人小車進行了研究,實現(xiàn)了小車的最基本功能。</p><p> 小車的基本系統(tǒng)主要包括避障傳感器部分,電機控制部分,速度反饋部分以及
89、ARM嵌入式系統(tǒng)核心控制部分。首先,是設(shè)計出了避障傳感器系統(tǒng),該系統(tǒng)采用紅外線技術(shù),主要完成對障礙物的感應(yīng);其次,是設(shè)計出了移動機器人小車的電機控制轉(zhuǎn)速部分,該系統(tǒng)采用步進電機作為電機首選,同時采用集成芯片L297加L298配合使用來作為電機的驅(qū)動控制部分;</p><p> 該系統(tǒng)目前完成的主要功能就是:小車前進,轉(zhuǎn)彎,后退行使,若系統(tǒng)發(fā)現(xiàn)前方有障礙物,那么運動控制系統(tǒng)內(nèi)的電機就轉(zhuǎn)彎;若系統(tǒng)發(fā)現(xiàn)前方?jīng)]有障礙物
90、,那么電機就繼續(xù)前進。</p><p> 還可以將電機轉(zhuǎn)動的真實數(shù)據(jù)給傳送回來。</p><p><b> 。</b></p><p><b> 參考文獻:</b></p><p> [1] 求是科技,單片機典型模塊設(shè)計實例導航[J] ,人民郵電出版社,2002年8月。</p>
91、<p> [2] 張俊謨,單片機中級教程[M], 北京航空航天大學出版社,2001年6月。</p><p> [3] 王昊等,通用電子元器件的選用與檢測[J] ,電子工業(yè)出版社,1998年6月。</p><p> [4] 王力等,protel 99se典型實例[L] ,人民郵電出版社,1996年5月。</p><p> [5] 朱金剛,系列單片機
92、C語言編程入門 ,電子制手2003年第一期。</p><p> [6] 張德偉等,偉福仿真器實際應(yīng)用中的常見問題探討[H], 實驗室研究與探索 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] ,機械工業(yè)出版社,2000年6月。</p><p> [10] 邁克、普瑞德科,機器人控制器與程序設(shè)計[M] , 科學出版社,2001
94、年3月。</p><p> [11] 陳永甫,紅外控測與控制電路[L] ,人民郵電出版社,1998年7月。</p><p> [12] 周金華、王松德,紅外線地射接收演示裝置設(shè)計[K] ,洛陽師范院校學報2004年第2期。</p><p> [13] 李巖、榮盤祥 基于S3C44B0X嵌入式uClinux系統(tǒng)原理及應(yīng)用[K],清華大學出版社,</p>
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 自由行走機器人課程設(shè)計
- 機器人課程設(shè)計
- 機器人課程設(shè)計
- 機器人行走設(shè)計電路課程設(shè)計
- 智能機器人小車畢業(yè)設(shè)計
- 機器人行走電路課程設(shè)計
- 機器人課程設(shè)計報告
- 迷宮機器人課程設(shè)計
- 足式行走機器人設(shè)計-機械控制課程設(shè)計
- 滅火機器人課程設(shè)計
- 兩足機器人課程設(shè)計報告
- 工業(yè)機器人課程設(shè)計學習報告
- 機械課程設(shè)計---爬桿機器人
- 機器人小車運動軌跡的控制方法設(shè)計研究.pdf
- 基于嵌入式技術(shù)的機器人小車設(shè)計.pdf
- 哈工大自動控制元件課程設(shè)計撿乒乓球機器人小車
- 智能掃地機器人課程設(shè)計
- 機械原理課程設(shè)計--爬桿機器人
- 輪式移動機器人課程設(shè)計
- 輪式移動機器人課程設(shè)計
評論
0/150
提交評論