<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 基于FPGA的搬運(yùn)機(jī)器人控制系統(tǒng)

          基于FPGA的搬運(yùn)機(jī)器人控制系統(tǒng)

          作者: 時(shí)間:2011-10-17 來源:網(wǎng)絡(luò) 收藏
          目前,控制器主要通過單片機(jī)來實(shí)現(xiàn)。但是,單片機(jī)是基于順序語言的,其描述過程繁瑣;處理速度受單片機(jī)時(shí)鐘頻率的限制,難于實(shí)現(xiàn)高速實(shí)時(shí)控制;并且外圍電路復(fù)雜,不易在線修改。利用現(xiàn)場可編程門陣列(FPGA)器件實(shí)現(xiàn)搬運(yùn)控制系統(tǒng)則集成度高、高速、高效率;易于現(xiàn)場重新編程,實(shí)現(xiàn)多重配置;可以把其它控制模塊集成在FPGA中,體積小、可靠性高;易于實(shí)現(xiàn)SOPC(可編程單芯片系統(tǒng)),整個(gè)控制系統(tǒng)由硬件實(shí)現(xiàn)。這是電子系統(tǒng)發(fā)展的方向和趨勢。本文介紹基于FPGA的搬運(yùn)控制系統(tǒng)。

          1 設(shè)計(jì)思想與總體方案

          本搬運(yùn)機(jī)器人能在任意區(qū)域內(nèi)沿尋跡線行走,自動(dòng)繞開障礙,并能停在指定地點(diǎn);它的操作手能對貨物進(jìn)行升降、抓緊或放下等工作;它還能顯示整個(gè)運(yùn)行過程的時(shí)間和距離;并且在出現(xiàn)故障時(shí)發(fā)出報(bào)警。

          機(jī)器人控制系統(tǒng)以FPGA器件(Altera公司的ACEX 1K器件)作為檢測和控制的核心,采用紅外光電傳感器檢測路面尋跡線,使用超聲波傳感器檢測障礙物,利光電碼盤測距,用光電傳感器或者微動(dòng)開關(guān)檢測、判斷機(jī)器手是否到位,應(yīng)用PWM技術(shù)動(dòng)態(tài)控制電動(dòng)機(jī)的轉(zhuǎn)動(dòng)方向和轉(zhuǎn)速。本機(jī)器人控制系統(tǒng)利用有限狀態(tài)機(jī)描述和硬件描述語言設(shè)計(jì)機(jī)器人控制器,實(shí)現(xiàn)機(jī)器人行走、轉(zhuǎn)彎、繞障、停止以及機(jī)器手升降、抓緊或放下的精確控制。機(jī)器人控制系統(tǒng)結(jié)構(gòu)圖如圖1所示。

          機(jī)器人根據(jù)輸入的各種檢測信息,按照為機(jī)器人設(shè)置的要求,自動(dòng)地進(jìn)行信息處理、分析和計(jì)算,作出相應(yīng)的控制決策或判斷,并通過輸出通道發(fā)出控制指令,控制各電機(jī)進(jìn)行工作。采用控制芯片ACEX1K的控制器主要包括兩部分:機(jī)器人行走控制器和機(jī)器手控制器。

            機(jī)器人行走控制器是控制系統(tǒng)中最為關(guān)鍵的一部分。機(jī)器人要準(zhǔn)確地走到設(shè)定的位置,才能執(zhí)行后面的抓舉和卸下物品的任務(wù)。機(jī)器人在地面上的移動(dòng)方式為三車輪移動(dòng)方式,即采用前輪輔助后輪驅(qū)動(dòng)的移動(dòng)配置方式。這種配置是前輪的萬向輪為隨動(dòng)輪,僅僅起到支撐車體的作用,無任何導(dǎo)向作用;而后輪則分別為兩個(gè)獨(dú)立的驅(qū)動(dòng)輪,利用它們的轉(zhuǎn)速差控制機(jī)器人的運(yùn)動(dòng)方向。這種組合的特點(diǎn)是結(jié)構(gòu)簡單,易于控制,而且當(dāng)兩個(gè)驅(qū)動(dòng)輪以相同速度、相反方向轉(zhuǎn)動(dòng)時(shí),車體只能繞兩個(gè)驅(qū)動(dòng)輪連線的中點(diǎn)自轉(zhuǎn),易于定位。

          機(jī)器手控制器的作用是當(dāng)機(jī)器人行走到了指定位置(物品放置位置)時(shí),能夠成功地抓起或放下物品,主要是手臂的抓、放、提升、下降等功能。

          本搬運(yùn)機(jī)器人使用四個(gè)直流電動(dòng)機(jī)進(jìn)行驅(qū)動(dòng), 直流電動(dòng)機(jī)的特點(diǎn)是在一個(gè)方向連續(xù)旋轉(zhuǎn)或者在相反的方向連續(xù)旋轉(zhuǎn), 運(yùn)動(dòng)連續(xù)且平滑。目前,直流電動(dòng)機(jī)可以達(dá)到很大的力矩/重量比,直流電機(jī)驅(qū)動(dòng)具有高精度、加速迅速以及可靠性高的特點(diǎn)。

          2 機(jī)器人行走控制器

          機(jī)器人行走控制器實(shí)現(xiàn)機(jī)器人沿尋跡線前進(jìn)、后退、左轉(zhuǎn)、右轉(zhuǎn)等行走功能。行走控制器原理圖如圖2所示。

          行走控制器由計(jì)數(shù)模塊(COUNTER)、行走驅(qū)動(dòng)模塊(QUDONG)、指令模塊(JSKZ)和狀態(tài)控制模塊(CONTROL)組成。

          2.1 計(jì)數(shù)模塊

          計(jì)數(shù)模塊是機(jī)器人的“記憶”系統(tǒng),實(shí)時(shí)地“告訴”機(jī)器人自己所處的位置。計(jì)數(shù)模塊準(zhǔn)確地計(jì)算出機(jī)器人行走的格數(shù)及光電碼盤檢測的驅(qū)動(dòng)輪脈沖數(shù)。當(dāng)機(jī)器人走過一格時(shí),產(chǎn)生一個(gè)脈沖信號(hào),計(jì)數(shù)模塊實(shí)現(xiàn)一次計(jì)數(shù)。但是當(dāng)機(jī)器人轉(zhuǎn)彎時(shí)會(huì)有一個(gè)計(jì)數(shù)誤差(根據(jù)計(jì)數(shù)探頭的安裝位置而定)。為了避免產(chǎn)生誤差,當(dāng)行走指令模塊發(fā)出轉(zhuǎn)彎命令時(shí),計(jì)數(shù)模塊將停止計(jì)數(shù),保持以前的計(jì)數(shù)值。這樣將保證計(jì)數(shù)的可靠性。

          圖中b為計(jì)數(shù)模塊的輸入信號(hào)。當(dāng)b有一個(gè)脈沖時(shí),計(jì)數(shù)模塊計(jì)一次數(shù);clr為計(jì)數(shù)復(fù)位信號(hào)(低電平效)。輸入端updown接收由指令模塊發(fā)出的指令(前進(jìn)、后退、左轉(zhuǎn)或右轉(zhuǎn)),當(dāng)updown=“11”(前進(jìn))或“00”(后退)時(shí),計(jì)數(shù)器正常計(jì)數(shù),最多可以計(jì)數(shù)到31(從0開始); updown=“01”( 右轉(zhuǎn))或“10”(左轉(zhuǎn))時(shí),計(jì)數(shù)器的計(jì)數(shù)值保持。counter為計(jì)數(shù)模塊輸出信號(hào),在此暫設(shè)為五位二進(jìn)制數(shù)。

          2.2 指令模塊

          行走指令模塊的功能是按照貨物搬運(yùn)行走路徑的要求,為機(jī)器人設(shè)置行走方式。計(jì)數(shù)模塊輸出的計(jì)數(shù)值作為指令模塊發(fā)出行走指令的依據(jù),通過設(shè)定指令模塊可確定機(jī)器人的行走方式。機(jī)器人行走的每一步,都可以通過這個(gè)模塊設(shè)定它的行走模式,這極大地方便了對機(jī)器人路徑的修改和重新設(shè)置。要設(shè)定新的機(jī)器人行走路線時(shí),直接更改這個(gè)模塊便可以實(shí)現(xiàn)。圖中輸入counter[]為計(jì)數(shù)模塊輸入的計(jì)數(shù)信號(hào),它被作為指令模塊發(fā)出行走指令的重要依據(jù)。輸出lrd[]為指令模塊發(fā)出的行走指令,發(fā)送給狀態(tài)控制模塊。lrd為“00”時(shí)機(jī)器人后退;lrd為“01” 時(shí)機(jī)器人右轉(zhuǎn);lrd為“10” 時(shí)機(jī)器人左轉(zhuǎn);lrd為“11” 時(shí)機(jī)器人前進(jìn)。

          2.3 狀態(tài)控制模塊

          狀態(tài)控制模塊的功能用來控制機(jī)器人順利進(jìn)行轉(zhuǎn)彎。該模塊采用有限狀態(tài)機(jī)的描述方式和硬件描述語言進(jìn)行設(shè)計(jì)。圖中輸入信號(hào)a1、a2為機(jī)器人前進(jìn)方向的紅外探頭檢測信號(hào),用于檢測機(jī)器人的尋線和轉(zhuǎn)彎是否到位;clr為控制器復(fù)位信號(hào);clkb為狀態(tài)機(jī)的時(shí)鐘信號(hào);tmp[]為指令模塊發(fā)出的指令信號(hào),tmp[]=“11”時(shí)為直走指令信號(hào);tmp[]=“01” 時(shí)為右轉(zhuǎn)指令信號(hào);tmp[]=“10”時(shí)為左轉(zhuǎn)指令信號(hào);tmp[]=“00”時(shí)為后退指令信號(hào);輸出信號(hào)updown[]為狀態(tài)控制模塊輸出的機(jī)器人行走指令信號(hào),最后輸入到行走驅(qū)動(dòng)模塊中。

          狀態(tài)控制模塊的狀態(tài)圖如圖3所示。s0狀態(tài)為初始狀態(tài)(直走),當(dāng)指令模塊發(fā)出右轉(zhuǎn)命令(tmp=“01”),并且前進(jìn)方向的紅外探頭檢測到尋跡線(a1=‘1’,a2=‘1’)時(shí),s0狀態(tài)跳轉(zhuǎn)到s1(右轉(zhuǎn)狀態(tài));當(dāng)指令模塊發(fā)出左轉(zhuǎn)命令(tmp=“10”),并且前進(jìn)方向的紅外探頭檢測到尋跡線(a1=‘1’,a2=‘1’)時(shí),s0狀態(tài)跳轉(zhuǎn)到s2(左轉(zhuǎn)狀態(tài));當(dāng)指令模塊發(fā)出后退指令(tmp=“00”)時(shí),s0狀態(tài)跳轉(zhuǎn)到s6;不符合以上條件的都保持在s0狀態(tài)。

          s3為右轉(zhuǎn)狀態(tài),此時(shí)前進(jìn)方向的兩個(gè)紅外探頭已經(jīng)離開尋跡線(a1=‘0’,a2=‘0’),當(dāng)有一個(gè)探頭檢測到尋跡線時(shí)(即a1或a2有一個(gè)為1時(shí)),s3跳轉(zhuǎn)到s5狀態(tài)(強(qiáng)行直走狀態(tài));s4為左轉(zhuǎn)狀態(tài),它的跳轉(zhuǎn)條件與s3一致,滿足條件也是跳轉(zhuǎn)到s5狀態(tài)。

          s5為強(qiáng)行直走狀態(tài),不受指令模塊的控制。當(dāng)沿尋跡線行走一格時(shí)(即b=‘1’),s5跳轉(zhuǎn)到s0初始狀態(tài)。s6為后退狀態(tài)。

          2.4 行走驅(qū)動(dòng)模塊

          行走驅(qū)動(dòng)模塊的功能是根據(jù)狀態(tài)控制模塊和指令模塊發(fā)出的行走指令產(chǎn)生驅(qū)動(dòng)信號(hào),控制機(jī)器人的尋線及轉(zhuǎn)彎工作。圖中,輸入信號(hào)a1、a2為前進(jìn)尋線紅外檢測信號(hào);輸入信號(hào)a3、a4為后退尋線紅外檢測信號(hào);clr為復(fù)位信號(hào);clk為時(shí)鐘信號(hào);updown為狀態(tài)控制模塊發(fā)出的指令信號(hào);輸出信號(hào)acount[]為電機(jī)的控制信號(hào)。

          該模塊采用有限狀態(tài)機(jī)的描述方式和硬件描述語言進(jìn)行設(shè)計(jì),保證機(jī)器人能沿著尋跡線實(shí)現(xiàn)前進(jìn)、后退和轉(zhuǎn)彎的操作。在機(jī)器人沿著尋跡線快速行走過程中, 由于尋跡線的寬度有限(幾個(gè)厘米),兩個(gè)驅(qū)動(dòng)輪存在轉(zhuǎn)速差,使機(jī)器人容易偏離尋跡線行走。為了解決這個(gè)問題, 采用有限狀態(tài)機(jī)設(shè)計(jì),使該模塊具有“記憶”功能,無論從哪個(gè)方向完全偏離尋跡線,都能夠返回到尋跡線上,這樣就增加了尋線行走的可靠性。實(shí)際應(yīng)用表明,將有限狀態(tài)機(jī)設(shè)計(jì)的行走驅(qū)動(dòng)模塊運(yùn)用在一個(gè)快速行走且慣性較大的機(jī)器人上,機(jī)器人能夠沿著尋跡線呈“S”形行走,始終保持以尋跡線為中心運(yùn)動(dòng)。

          3 機(jī)器手控制器

          機(jī)器手主要完成升、降、抓緊和放下物品等工作。機(jī)器手控制器結(jié)構(gòu)圖如圖4所示。主要由手臂指令模塊和手臂執(zhí)行模塊組成。機(jī)器手控制器實(shí)現(xiàn)的控制主要是一個(gè)順序控制的問題。當(dāng)手臂指令模塊發(fā)出取物品的命令時(shí),手臂執(zhí)行模塊將產(chǎn)生取物品的一系列順序信號(hào),驅(qū)動(dòng)手臂電機(jī),完成機(jī)器手取物品的工作。在取物品時(shí),首先將手臂升降到指定位置,夾緊物品并保持;然后將整個(gè)物品提升或下降到位,整個(gè)取物品的操作結(jié)束。機(jī)器手放物品與取物品的工作相似。機(jī)器手必須是在機(jī)器人行走到指定位置時(shí)才能進(jìn)行操作,行走計(jì)數(shù)值和超聲波與光電檢測信號(hào)為手臂指令模塊提供機(jī)器人行走到位信號(hào)。


          3.1 手臂指令模塊

          手臂指令模塊與行走部分的行走指令模塊相似。這個(gè)模塊比行走指令模塊只是多了超聲波與光電檢測信號(hào)。為了提高機(jī)器手的可靠性,采用了雙重檢測,由行走計(jì)數(shù)值檢測是否已進(jìn)入物品區(qū)域,并且通過超聲波與光電信號(hào)檢測機(jī)器手是否已達(dá)到取放物品的位置。若缺一個(gè)條件,機(jī)器人將不會(huì)發(fā)出取物品或放物品的指令。

          3.2 手臂執(zhí)行模塊

          手臂執(zhí)行模塊主要是根據(jù)手臂指令模塊發(fā)出的指令,產(chǎn)生一系列輸出信號(hào),驅(qū)動(dòng)手臂電機(jī)。此模塊的設(shè)計(jì)也運(yùn)用了有限狀態(tài)機(jī)的設(shè)計(jì)思想,采用的是順序控制的原理??墒鞘直鄞嬖谝粋€(gè)初始位置的問題,例如要取物品時(shí),它的手臂必須是松開的,并且處于某個(gè)初始位置。因此每次取物品時(shí),都要檢測是否處在這個(gè)初始位置,若不是,則要先調(diào)整到初始位置,然后按照取物品順序進(jìn)行操作。

          手臂執(zhí)行模塊狀態(tài)圖如圖5所示。s0、s1、s2 狀態(tài)為未到位狀態(tài)(初始位置),需要進(jìn)行狀態(tài)調(diào)整,跳轉(zhuǎn)到s3狀態(tài)。s3為初始到位狀態(tài),當(dāng)接收到取物品信號(hào)(ud=“01”)時(shí),跳轉(zhuǎn)到s4狀態(tài)(抓緊物品); s5狀態(tài)為提升到位,s8為保持狀態(tài),最后回到初始位置s3狀態(tài)。s6、s7狀態(tài)為放物品狀態(tài),與取物品過程相似。

          本搬運(yùn)機(jī)器人除了以上介紹的機(jī)器人行走控制器和機(jī)器手控制器外,還有其它單元電路,如紅外光電檢測電路、超聲波檢測電路、光電碼盤檢測電路和電機(jī)驅(qū)動(dòng)電路。為了隨時(shí)接收上位機(jī)發(fā)出的指令,還需要通訊模塊電路。為了實(shí)現(xiàn)機(jī)器人可靠地運(yùn)行,檢測電路的設(shè)計(jì)顯得非常重要。

          本設(shè)計(jì)是在QUARTUSII開發(fā)工具下對各功能模塊進(jìn)行仿真分析,保證了FPGA芯片設(shè)計(jì)的成功。FPGA器件采用ALTERA公司的ACEX1K50器件,占用ACEX1K50器件的邏輯單元為43%。由于篇幅有限,各功能模塊用硬件描述語言編寫的源文件省略。

          由于采用有限狀態(tài)機(jī)描述和硬件描述語言進(jìn)行設(shè)計(jì),該控制系統(tǒng)不僅在運(yùn)行方式上類似于單片機(jī)控制器,而且在運(yùn)行速度和工作可靠性方面優(yōu)于單片機(jī)控制器。實(shí)際運(yùn)用表明該控制系統(tǒng)完全滿足要求。



          關(guān)鍵詞: 機(jī)器人

          評(píng)論


          相關(guān)推薦

          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();