六腳爬蟲機(jī)器人機(jī)械結(jié)構(gòu)設(shè)計(jì)和控制系統(tǒng)搭建_第1頁
六腳爬蟲機(jī)器人機(jī)械結(jié)構(gòu)設(shè)計(jì)和控制系統(tǒng)搭建_第2頁
六腳爬蟲機(jī)器人機(jī)械結(jié)構(gòu)設(shè)計(jì)和控制系統(tǒng)搭建_第3頁
六腳爬蟲機(jī)器人機(jī)械結(jié)構(gòu)設(shè)計(jì)和控制系統(tǒng)搭建_第4頁
六腳爬蟲機(jī)器人機(jī)械結(jié)構(gòu)設(shè)計(jì)和控制系統(tǒng)搭建_第5頁
已閱讀5頁,還剩49頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

摘要本文詳細(xì)介紹了六腳爬蟲機(jī)器人的機(jī)械結(jié)構(gòu)以及控制程序的編寫。機(jī)械結(jié)構(gòu)采用了對(duì)稱式設(shè)計(jì),結(jié)構(gòu)簡單;其行走功能由六只腳、18個(gè)舵機(jī)實(shí)現(xiàn),自由度較高,穩(wěn)定性、靈活性較好??刂瞥绦虻闹黧w是C語言。包括基本步態(tài)的編寫,以及傳感器的在機(jī)器人上的高級(jí)應(yīng)用,這樣,機(jī)器人在滿足基本行走運(yùn)動(dòng)的同時(shí),也能感知外界環(huán)境,并通過控制器對(duì)接收到的外界信號(hào)進(jìn)行處理,并控制機(jī)器人運(yùn)動(dòng)。關(guān)鍵詞:對(duì)稱式結(jié)構(gòu),舵機(jī)控制器,步態(tài),傳感器AbstractThethesisdescribesindetailthatthemechanicdesignofHexcrawlerandthecompilingofcontrolprogram.Thestructureoftherobotisinsymmetricexpression,asimplemechanism;thefunctionofwalkingissupportedbysixlegs,andeighteenmotors,withmultipledegreesoffreedom.Besides,itisofhighstabilityandflexibility.TheprogramtocontroltherobotiswritteninClanguage,includingbasicgait,theadvancedapplicationofsensors.Thereby,therobotcanwalkinseveralgaits.Atthesametime,itcansensetheconditionaroundit.Then,itwillprocessthedataitreceived,andcontrolthemotionoftherobot.Keywords:symmetricexpression,PSCU,gait,sensor目錄摘要IAbstractII目錄III1緒論-1-1.1課題來源-1-1.2本課題的目的及其意義-1-1.3國內(nèi)外發(fā)展現(xiàn)狀-1-1.4本課題的研究內(nèi)容-5-2機(jī)械結(jié)構(gòu)設(shè)計(jì)介紹-6-2.1功能需求與分析-6-2.2材料選擇與結(jié)構(gòu)設(shè)計(jì)介紹-6-3舵機(jī)控制板原理與應(yīng)用-9-3.1舵機(jī)原理介紹-9-3.2舵機(jī)控制板原理介紹-10-3.3如何使用舵機(jī)控制板-12-3.4控制板程序編寫-14-4STM32開發(fā)板介紹與程序編寫-18-4.1STM32F107芯片簡介-18-4.2軟件與編程初始準(zhǔn)備-18-4.3GPIO與AFIO設(shè)置與應(yīng)用-18-4.31GPIO設(shè)置與應(yīng)用…………………………..184.32AFIOI/O口重映射…………………...224.4USART設(shè)置與應(yīng)用-22-4.5外部中斷設(shè)置與應(yīng)用-26-4.6系統(tǒng)時(shí)鐘設(shè)置與應(yīng)用-29-4.61系統(tǒng)時(shí)鐘簡介與應(yīng)用…………………..294.62定時(shí)器配置……………………314.7機(jī)器人行走步態(tài)程序編寫-32-4.71機(jī)器人行走步態(tài)簡介……………………334.72三腳步態(tài)……………………….354.73四腳步態(tài)………………………….……………374.74單腳(波動(dòng))步態(tài)……………………384.75轉(zhuǎn)彎與橫爬步態(tài)…………….404.8多傳感器應(yīng)用與程序編寫-43-4.81指南針傳感器……………….434.82紅外、光敏傳感器……………………….454.83柔性力傳感器……………….464.84溫濕度、發(fā)聲、射頻識(shí)別(RFID)傳感器………………..484.85無線(Zigbee)傳感器………………..494.86超聲傳感器……………………525總結(jié)-55-致謝-56-參考文獻(xiàn)-57-1緒論1.1課題來源本項(xiàng)目來源于華中科技大學(xué)與伍斯特理工學(xué)院合作的WPI項(xiàng)目。1.2本課題的目的及其意義機(jī)器人是高級(jí)整合控制論、機(jī)械電子、計(jì)算機(jī)、材料和仿生學(xué)的產(chǎn)物。現(xiàn)在,機(jī)器人已經(jīng)發(fā)展到一個(gè)全新階段,各種機(jī)器人應(yīng)運(yùn)而生,從簡單地追求功能到神似,到個(gè)性化;從單單發(fā)展工業(yè)機(jī)器人到工業(yè)、家用機(jī)器人全面開花,并取得了長足進(jìn)步。六腳機(jī)器人作為行走機(jī)器人的一種,具有結(jié)構(gòu)簡單,穩(wěn)定性好等優(yōu)點(diǎn),而本課題也并未在很高深的機(jī)器人理論花大量功夫,而更多地著眼于為大專院校提供機(jī)器人教學(xué)平臺(tái),或者用于科技館展覽。本課題所設(shè)計(jì)的機(jī)器人最大的特點(diǎn)是:理論通俗易懂、操作方便、便于二次開發(fā)。對(duì)于一些入門者(初步掌握控制論、機(jī)械設(shè)計(jì)、機(jī)械電子只是)來說,很容易便能被引領(lǐng)入機(jī)器人研究的殿堂。1.3國內(nèi)外發(fā)展現(xiàn)狀對(duì)于仿生機(jī)器人,尤其是多足機(jī)器人,國內(nèi)外均有大量研究。1990年,美國卡內(nèi)基梅隆大學(xué)研制出用于外星探測的六腳步行機(jī)器人AMBLER。該機(jī)器人采用了新型的“腿機(jī)構(gòu)",并由一臺(tái)32位的處理機(jī)來規(guī)劃系統(tǒng)運(yùn)動(dòng)路線、制運(yùn)動(dòng)和監(jiān)視系統(tǒng)的狀態(tài)。但由于體積和質(zhì)量太大,最終沒被用于行星探測計(jì)劃。1993年,卡內(nèi)基梅隆大學(xué)開發(fā)出有纜的八足步行機(jī)器人DANTE,用于對(duì)南極的埃里伯斯火山進(jìn)行了考察,其改進(jìn)型也在實(shí)際中得到了應(yīng)用。1994年二代對(duì)距離安克雷奇145km的斯伯火山進(jìn)行了考察,并傳回了各種數(shù)據(jù)及圖像。日本對(duì)多足步行機(jī)的研究從20世紀(jì)80年代開始,并不斷進(jìn)行著技術(shù)創(chuàng)新,隨著計(jì)算機(jī)和控制技術(shù)的發(fā)展,其機(jī)械結(jié)構(gòu)由復(fù)雜到簡單,其功能由單一功能到組合功能,并已研究出各種類型的步行機(jī)。主要有四足步行機(jī)、爬壁機(jī)器人、腿輪分離型步行機(jī)器人和手腳統(tǒng)一型步行機(jī)器人。1994年,日本電氣通信大學(xué)的木村浩等研制成功四足步行機(jī)器人Patrush二代。該機(jī)器人用兩個(gè)微處理機(jī)控制,采用直流伺服電機(jī)驅(qū)動(dòng),每個(gè)關(guān)節(jié)安裝了一個(gè)光電碼盤,每只腳安裝了兩個(gè)微開關(guān),采用基于神經(jīng)振蕩子模型CPG的控制策略,能夠?qū)崿F(xiàn)不規(guī)則地面的自適應(yīng)動(dòng)態(tài)步行,顯示了生物激勵(lì)控制對(duì)未知的不規(guī)則地面有自適應(yīng)能力的特點(diǎn)。2000~2003年,木村浩等又研制成功四足步行機(jī)器人Tekken。該機(jī)器人用一臺(tái)PC機(jī)系統(tǒng)控制,用瑞士Maxon直流伺服電機(jī)驅(qū)動(dòng),能適應(yīng)中等不規(guī)則表面的自適應(yīng)步行。我國對(duì)于多足機(jī)器人的研究起步則較晚。1989年,北京航空航天大學(xué)在張啟先教授的指導(dǎo)下,孫漢旭博士進(jìn)行了四足步行機(jī)的研究,試制成功一臺(tái)四足步行機(jī)。錢晉武博士研究地壁兩用六腳步行機(jī)器人,并進(jìn)行了步態(tài)和運(yùn)動(dòng)學(xué)方面的研究。1990年中國科學(xué)院沈陽自動(dòng)化研究所研制出全方位六腳步行機(jī),不僅能在平地步行,還能上樓梯。1991年,上海交通大學(xué)馬培蓀等研制出JTUWM系列四足步行機(jī)器人。2000年,馬培蓀等對(duì)第一代形狀記憶合金SMA驅(qū)動(dòng)的微型六腳機(jī)器人進(jìn)行改進(jìn),開發(fā)出具有全方位運(yùn)動(dòng)能力的微型雙三足步行機(jī)器人其每條腿的自由度變?yōu)?個(gè)自由度。2003年哈爾濱工程大學(xué)的孟慶鑫、袁鵬等進(jìn)行了兩棲仿生機(jī)器蟹的研究,通過研究多足步行機(jī)的單足周期運(yùn)動(dòng)規(guī)律,提出適合于兩棲仿生機(jī)器蟹的單足運(yùn)動(dòng)路線規(guī)劃方法,建立了生成周期運(yùn)動(dòng)的神經(jīng)振蕩子模型。目前市場上幾款六腳機(jī)器人對(duì)比如下:(一)DEPUSHHexCrawlerHexCrawlerCompanyDEPUSHMaterial5052alloyaluminum,1/16”thickwithclearanodizingLegMovement2DOFDimensionsBody:49.68x40cm,Height:between12.3and15.2cmCost$350+(二)LynxmotionRB-Lyn-248RB-Lyn-248CompanyLynxmotionMaterial5052alloyaluminum,1/16”thickwithblackanodizingLegMovement3DOFDimensionsBody:19.1x14.9cm,Height:between5.1and13.3cm,GroundClearance:upto8.9cmCost$261.35+(三)HexCrawlerHDATSHexCrawlerHDATSCompanyDEPUSHMaterial5052alloyaluminum,1/16”thickwithclearanodizingLegMovement3DOFDimensionsBody:52x49.7cm,Height:between12.3and15.2cm,Groundclearance:12.7cmCost¥10,000(about$1,500)其中HexCrawler一代機(jī)器人使用的編程軟件為Parallax公司提供的教育發(fā)展版芯片。圖1.1為Phoenix公司提供的六腳機(jī)器人,圖1.2則為Depush公司的六腳機(jī)器人一代外形,其每個(gè)腳僅有兩個(gè)自由度。圖1.1PhoenixHexapod圖1.2DEPUSHHexCrawler1.01.4本課題的研究內(nèi)容六腳機(jī)器人基本結(jié)構(gòu)的設(shè)計(jì),首先使之能夠?qū)崿F(xiàn)三腳步態(tài)、四腳步態(tài)、波動(dòng)步態(tài)等,以滿足行走要求;然后,能夠感知外界環(huán)境的變化,實(shí)現(xiàn)避障報(bào)警等功能;最后,實(shí)現(xiàn)對(duì)機(jī)器人的遠(yuǎn)距離控制。具體要求為:設(shè)計(jì)機(jī)器人機(jī)械結(jié)構(gòu),使其可以完成前進(jìn),后退,左轉(zhuǎn),右轉(zhuǎn),側(cè)移,扭動(dòng)身軀等簡單動(dòng)作;可以完成抬腳,簡單舞蹈等動(dòng)作;1、編寫機(jī)器人各種基本動(dòng)作的軟件代碼,使其能完成以上動(dòng)作;2、機(jī)器人可以接受電腦無線控制,編寫相應(yīng)無線控制程序;3、機(jī)器人可感知外界環(huán)境,編寫相應(yīng)傳感器處理程序;4、對(duì)所有程序進(jìn)行綜合處理,協(xié)調(diào)各程序之間的關(guān)系。2六腳機(jī)器人機(jī)械結(jié)構(gòu)設(shè)計(jì)介紹2.1功能需求與分析作為六腳仿生機(jī)器人,在追求神似的同時(shí),關(guān)鍵在于能否像爬蟲一樣完成各種行走動(dòng)作。本課題對(duì)機(jī)械結(jié)構(gòu)的要求不高,但需要滿足下面幾點(diǎn):靈活度高、穩(wěn)定性好、能夠?qū)崿F(xiàn)多足機(jī)器人的基本步態(tài)。針對(duì)這幾點(diǎn),同時(shí)按照德普士公司的要求,再參照目前市面上存在的六腳仿生機(jī)器人,最終擬定的機(jī)械結(jié)構(gòu)設(shè)計(jì)方案為:在DEPUSHHexCrawler1.0(圖1.2)的基礎(chǔ)上每只腳增加一個(gè)舵機(jī),即將自由度由兩個(gè)提升為三個(gè)。2.2材料選擇與結(jié)構(gòu)設(shè)計(jì)介紹根據(jù)目前市面上的六腳仿真機(jī)器人,本課題選用5052鋁合金作為機(jī)器人的主要材料,這樣機(jī)器人既能滿足強(qiáng)度要求,也能滿足輕便性要求。同時(shí),對(duì)外表進(jìn)行烤漆處理,顯得厚實(shí)而穩(wěn)重,富有質(zhì)感。如圖2.1為機(jī)械結(jié)構(gòu)的總?cè)S圖。圖2.1六腳機(jī)器人三維總圖機(jī)器人整體上采用對(duì)稱式結(jié)構(gòu),由六只腳和底架(身體)組成。每只腳有三個(gè)關(guān)節(jié),每個(gè)關(guān)節(jié)處為采用舵機(jī)連接,可在固定平面內(nèi)旋轉(zhuǎn)180°,如圖2.2所示。其中舵機(jī)1控制機(jī)器人腳前后擺動(dòng);舵機(jī)2控制機(jī)器人上下擺動(dòng);舵機(jī)3控制機(jī)器人內(nèi)外伸縮。三個(gè)舵機(jī)配合即可實(shí)現(xiàn)機(jī)器人的走動(dòng)。圖2.2六腳機(jī)器人單腳結(jié)構(gòu)圖機(jī)器人身體(圖2.3)、腳(圖2.2)上均布滿各種鏤空?qǐng)D案,主要有兩點(diǎn)作用:一、減輕機(jī)器人重量;二、增加機(jī)器人的美觀度。由于機(jī)器人的完全對(duì)稱性結(jié)構(gòu),其前后由認(rèn)為設(shè)定,即圖2.1中Leg1、Leg4在前,Leg3、Leg6在后。圖2.3六腳機(jī)器人底架結(jié)構(gòu)圖機(jī)器人的主要尺寸為:機(jī)器人全長:500.0mm;底架(身體寬):228.0mm;舵機(jī)1(Leg1)距底架最前方距離:60.0mm;Leg1與Leg2距離:195.0mm;Leg1與Leg3距離:390.0mm;每只腳上舵機(jī)2與舵機(jī)3距離:120.0mm;舵機(jī)3與腳底距離:150.0mm。3舵機(jī)及舵機(jī)控制板原理與應(yīng)用本章主要介紹舵機(jī)以及舵機(jī)控制板(PSCU)的原理、使用方法與程序編寫。3.1舵機(jī)原理介紹舵機(jī)是一個(gè)通過輸出軸的轉(zhuǎn)動(dòng)來控制物體轉(zhuǎn)動(dòng)的裝置。它在特定編碼的驅(qū)使下可以轉(zhuǎn)動(dòng)到工作范圍內(nèi)的任意給定位置。因?yàn)樗妮p便,位置控制簡易且精確,在機(jī)器人中使用尤多。多舵機(jī)的協(xié)調(diào)工作可滿足機(jī)器人的多自由度要求。舵機(jī)可以實(shí)現(xiàn)0~180°的旋轉(zhuǎn),當(dāng)軸處于正確位置時(shí),舵機(jī)將停止運(yùn)動(dòng);當(dāng)所在位置不對(duì)時(shí),電路則驅(qū)動(dòng)電機(jī)運(yùn)轉(zhuǎn)到需求位置。舵機(jī)是采用比例調(diào)節(jié)方式控制速度。當(dāng)舵機(jī)轉(zhuǎn)動(dòng)的距離大時(shí),則加載在舵機(jī)上的能量就大,反之亦然。而舵機(jī)的轉(zhuǎn)動(dòng)角度控制是由加載在控制線上的脈沖周期完成的,即所謂的脈沖編碼調(diào)制。舵機(jī)設(shè)定為每隔20ms接受一個(gè)脈沖,這樣的話,實(shí)際脈沖長度就可用來控制舵機(jī)轉(zhuǎn)動(dòng)的角度。如圖3.1,例如1.5ms的脈沖可使舵機(jī)轉(zhuǎn)動(dòng)90°。圖3.1舵機(jī)轉(zhuǎn)角與脈沖周期關(guān)系圖本項(xiàng)目采用的事Hi-Tec公司生產(chǎn)的HS-322HD舵機(jī),如圖3.6。圖3.6HS-322HD舵機(jī)其主要技術(shù)參數(shù)如下:■重量:43g■尺寸:40×20×36.5mm■拉力:[4.8V]3Kg.cm■拉力:■轉(zhuǎn)速:[4.8V]0.19sec/60°■轉(zhuǎn)速:[6.0V]0.15sec/60°■計(jì)算電流:0.35A當(dāng)舵機(jī)安裝好后,需要獲取其初始位置值,為編程做準(zhǔn)備,具體可見3.3節(jié)關(guān)于PSCI軟件的介紹。3.2舵機(jī)控制板原理介紹由上述機(jī)械結(jié)構(gòu)介紹可知,本六腳機(jī)器人是通過控制18個(gè)舵機(jī)來實(shí)現(xiàn)機(jī)器人的運(yùn)動(dòng)的。但如何協(xié)調(diào)好各舵機(jī)的動(dòng)作,讓其滿足功能需求?這就需要用到舵機(jī)控制板。舵機(jī)控制板按控制舵機(jī)數(shù)目(接口數(shù))的多少,可分為8路舵機(jī)控制器,16路舵機(jī)控制器,32路舵機(jī)控制器等等??紤]到成本以及控制舵機(jī)的數(shù)量,本課題采用兩塊16路舵機(jī)控制器串聯(lián)的方式來控制舵機(jī)。選用型號(hào)為PARALLAX公司提供的PropellerServoControllerUSB(#28830,簡稱PSCU)。如圖3.2所示:圖3.2舵機(jī)控制板PSCU具有下述多項(xiàng)特點(diǎn):①可串聯(lián)兩塊控制板實(shí)現(xiàn)32路舵機(jī)控制;②獨(dú)立的螺旋式接線柱為控制板供電,舵機(jī)則可通過開關(guān)控制關(guān)停;③其所用固件開放源代碼;④可通過USB接口或者串行通信接口編程;⑤舵機(jī)速度可控。PSCU規(guī)格及性能:①電源要求:邏輯電平5VDC@~60mA,4.8~7.5VDC控制舵機(jī);②通信:異步串行通信@2400bps或者38.4kbps(TTL或USB);③工作溫度:32~158°F(0~70°C);④尺寸:2.26x1.80x0.65in(57.3x45.7x16.5mm);3.3如何使用舵機(jī)控制板在使用控制板前,需通過螺旋式接線柱給控制板提供4.8~7.5V的直流電,同時(shí)為使舵機(jī)運(yùn)動(dòng),還需給舵機(jī)提供5V的直流電。此項(xiàng)可通過USB接口(如圖3.3)或者通過舵機(jī)控制板左上方的SerialIn處的杜邦針供電(TTL電平,如圖3.4)。圖3.3PSCU-USB供電電路連接圖圖3.4PSCU-主控制板供電電路連接圖USB調(diào)試:①安裝FTDIVCP驅(qū)動(dòng)(下載地址:);②安裝PSCI軟件(訪問網(wǎng)址,并搜索28823)。雙擊軟件圖標(biāo),即可獲得圖3.5所示,連接好USB線,在界面上選擇COM口,獲取PSC版本,即可使用。圖3.5PSCI控制界面圖中每個(gè)channel的進(jìn)度條,可發(fā)現(xiàn)對(duì)應(yīng)舵機(jī)會(huì)向相應(yīng)方向發(fā)生一定度數(shù)的旋轉(zhuǎn)。這可用來進(jìn)行舵機(jī)控制調(diào)試,從而獲取舵機(jī)位置值,來書寫步態(tài)。注意:圖中數(shù)據(jù)在編入ARM程序中時(shí),應(yīng)先除以2倍,才是實(shí)際數(shù)據(jù),即圖中的中心出1500對(duì)應(yīng)實(shí)際的750。更多功能可參照PARALLAX公司提供的PropellerServoControllerUSB說明文檔。當(dāng)使用雙塊板時(shí),其連接方式為:首先將主板的SerialIn(兩排,選上排)引出按高低電平信號(hào)線要求插在主控制板(STM32板)上,其中紅色線接5V電源,黑色線接地,白色線接信號(hào)線,即PA9。然后將副板的SerialIn(上排)引出插在主板的SerialIn處(下排)。最后通上電源即可。了解了PSCI的基本功能,并按要求連接好電路后,首要做的就是將舵機(jī)位置的初始值找出。通過拖動(dòng)進(jìn)度條,并觀察機(jī)器人各腿的位置,從而確定舵機(jī)初值。筆者提供的舵機(jī)初始值均為六腳與身體垂直時(shí)的值,且2、3關(guān)節(jié)夾角近似為90°。3.4控制板程序編寫㈠基本工作準(zhǔn)備與注意事項(xiàng):前述工作準(zhǔn)備停當(dāng),即可開始程序的編寫。PARALLAX公司提供的說明文檔中提供了BS2程序,需要通過C語言轉(zhuǎn)譯,才可供ARM板識(shí)別。首先注意的是PSCU板的默認(rèn)波特率為2400bps,所以在編寫串行通信程序時(shí),應(yīng)將串行通信的波特率設(shè)置為2400bps(具體見4.4節(jié)關(guān)于USART設(shè)置的介紹)。當(dāng)然本控制板亦可通過程序設(shè)置,將波特率改為38.4kbps,具體內(nèi)容下面會(huì)介紹到。此外,控制板接收的異步通信數(shù)據(jù)格式要求還有,正相,8個(gè)數(shù)據(jù)位,無奇偶校驗(yàn)位,1個(gè)或2個(gè)停止位。其次控制板分為主副板,則對(duì)應(yīng)的舵機(jī)控制通道號(hào)即為0~31;即副板的通道號(hào)再原號(hào)基礎(chǔ)上加16即可。如果按序連接舵機(jī),可使編程變得較為簡單,通過簡單的數(shù)學(xué)關(guān)系進(jìn)行數(shù)據(jù)處理,但線路凌亂,看起來不是很美觀;本課題采用的是對(duì)稱連線,即選用通道號(hào)0~8,23~31;當(dāng)然,這樣編程相對(duì)就復(fù)雜一些。最后關(guān)于主副板的界定還需提醒一句,由于硬件可能出現(xiàn)bug,實(shí)際上控制板可能通道號(hào)等沒有按照說明書的來,在調(diào)試過程中,可多試幾次,按照實(shí)際結(jié)果編程。本課題在調(diào)試過程中即出現(xiàn)了問題,實(shí)際的主副板是顛倒的,且必須將副板與主控制板(STM32)連接才可使用。㈡通信協(xié)議規(guī)則:PSCU為用戶提供了多種控制功能,但每種控制字符串均是以!SC開始,以0x0D結(jié)束,中間有間隔4個(gè)主控制字符,下面將一一介紹:①位置命令——設(shè)置舵機(jī)的位置控制字符串為:“!SC”<channel><rampspeed><lowbyte><highbyte><CR>其中channel為通道號(hào),即前述的0~31;rampspeed為一字節(jié)值,用于舵機(jī)轉(zhuǎn)速控制,其變化范圍為0~63,且數(shù)值越大,轉(zhuǎn)速越??;lowbyte為舵機(jī)位置的低字節(jié),highbyte為舵機(jī)位置的高字節(jié)。通過改變lowbyte與highbyte值即可改變舵機(jī)位置,其值變化范圍為250~1250。位置命令控制板最基本的命令,往往也是唯一用到的功能。通過此命令,可以實(shí)現(xiàn)舵機(jī)按要求的轉(zhuǎn)動(dòng),從而滿足行走等多功能要求。②SBR——設(shè)置波特率控制字符串為:“!SCSBR”<mode><CR>其中mode是用來設(shè)置波特率的,0代表2400bps,1代表38.4kbps??刂瓢宓哪J(rèn)波特率為2400bps,無需設(shè)置,但如果需要使用38.4bps的波特率進(jìn)行通信時(shí),可使用該程序?qū)Σㄌ芈蔬M(jìn)行更改。③RSP——返回位置值控制字符串為:“!SCRSP”<channel><CR>其中channel為通道號(hào)。與VER?一樣,需要進(jìn)行輸入輸出的設(shè)置,方能返回位置值,這對(duì)編程很有用處,可以通過讀取位置值,判斷其是否到位來實(shí)現(xiàn)延遲,精確性較高。本課題未使用。讀者可拓展功能。④PSS——設(shè)置軟件口控制字符串為:“!SCPSS”<mode><CR>其中mode為0代表0~15;1代表16~31??赡苡捎诎遄拥膯栴},實(shí)際過程中并未起作用,當(dāng)控制板沒問題時(shí),可以根據(jù)個(gè)人喜好設(shè)置控制板的端口號(hào),為編程提供便利。⑤PSD——使端口無效控制字符串為:“!SCPSD”<channel><CR>其中channel為通道號(hào)。此功能與PSE功能配合使用,在適當(dāng)時(shí)候可能才生意想不到的效果。⑥PSE——使端口恢復(fù)有效控制字符串為:“!SCPSE”<channel><CR>其中channel為通道號(hào)。此功能用于PSD后,用來恢復(fù)端口的正常使用。其余的功能控制命令此處便不再贅述,因?yàn)橐话闱闆r下無法用到。㈢C語言程序編寫簡介:由于說明書中只提供了BS2程序,較難普及,需使用應(yīng)用較廣的C語言編寫。從控制命令的格式可以看出,無論哪種方式,都是8字節(jié)的字符串,于是,可定義一個(gè)聯(lián)合體(結(jié)構(gòu)體亦可),來儲(chǔ)存這一串字節(jié):typedefunion_SERVO_PACKET{ charstream[8];struct{charCR:8; charB3:8;charB2:8;charB1:8;charB0:8;unsignedSC:24;}packet;}SERVO_PACKET; SERVO_PACKETpac;并將三字節(jié)的SC初始化為0x215343或”!SC”,將CR初始化為0x0D。這樣在編寫各種控制命令函數(shù)時(shí),只要改變B0~B3的值即可。例,位置命令函數(shù):voidSendPacket(charRS,charChannel,intPosition) { inti=0;pac.packet.B0=Channel;pac.packet.B1=RS; pac.packet.B2=LOWBYTE(Position); pac.packet.B3=HIGHBYTE(Position); for(i=7;i>=0;i--) {ser_putbyte(pac.stream[i]); }//該函數(shù)4.4節(jié)介紹,作用為發(fā)送單個(gè)字節(jié)}其中LOWBYTE()、HIGHBYTE()函數(shù)的定義為:#defineLOWBYTE(v)((unsignedchar)(v)) #defineHIGHBYTE(v)((unsignedchar)(((unsignedint)(v))>>8))其功能為獲取數(shù)值(位置值)的低八位與高八位。這即可為編程提供很大方便。以此類推,其它命令的函數(shù)可以根據(jù)需要只要參考上述的位置命令函數(shù)編寫即可。在此基礎(chǔ)上以及之前用PSCI軟件調(diào)試出的舵機(jī)初始值,即可編寫舵機(jī)初始化程序了。voidInitservo(void) { inti=0;for(i=0;i<18;i++){ SendPacket(15,channelno[i],initposi[i]); }delay_ms(100);} 其中,15為舵機(jī)轉(zhuǎn)速,channelno[18]數(shù)組儲(chǔ)存舵機(jī)號(hào),initposi[18]數(shù)組儲(chǔ)存相應(yīng)舵機(jī)的初始位置值。4STM32開發(fā)板介紹與程序編寫本章主要介紹STM32開發(fā)板的使用,以及各種應(yīng)用程序的編寫說明。4.1STM32F107芯片簡介STM32系列是基于專為要求高性能、低成本、低功耗的嵌入式應(yīng)用專門設(shè)計(jì)的ARM

Cortex-M3內(nèi)核。在STM32F103、STM32F105的基礎(chǔ)上,意法半導(dǎo)體公司又推出了一款性能較強(qiáng)的全新STM32互連型(Connectivity)系列微控制器中產(chǎn)品——STM32F107。該芯片集成了各種高性能工業(yè)標(biāo)準(zhǔn)接口,且STM32不同型號(hào)產(chǎn)品在引腳和軟件上具有完美的兼容性,可以輕松適應(yīng)更多的應(yīng)用?;赟TM32F107的強(qiáng)大功能,以及數(shù)量眾多的I/O口,本課題選用STM32F107VC芯片作為總控制芯片。4.2軟件與編程初始準(zhǔn)備在使用開始學(xué)習(xí)使用STM32開發(fā)板前,需要安裝兩個(gè)軟件:RealViweMDK(KeilμVision4)用于編程,在注冊(cè)是注意Target應(yīng)選擇ARM;JLINK仿真器驅(qū)動(dòng)器,下載地址為:,用于燒寫程序。安裝好軟件后,先新建一個(gè)程序文件夾,將Libraries與obj文件夾拷貝進(jìn)去,如果用到觸屏,還需包含Source文件夾(具體使用時(shí),可拷貝現(xiàn)成程序文件夾,修改主程序即可),打開Keil4,新建一個(gè)工程,即可開始編程,注意每寫一個(gè)H文件,都需要將#include“stm32f10x.h”置入文件的首部。4.3GPIO與AFIO設(shè)置與應(yīng)用4.31GPIO設(shè)置與應(yīng)用STM32F10x處理器上共有7個(gè)I/O端口:A、B、C、D、E、F、G,每個(gè)端口有16個(gè)引腳。每個(gè)GPIO端口都對(duì)應(yīng)2個(gè)32位配置寄存器(GPIOx_CRL,GPIOx_CRH),2個(gè)32位數(shù)據(jù)寄存器(GPIOx_IDR,GPIOx_ODR)、1個(gè)32位置位/復(fù)位寄存器(GPIOx_BSRR)、1個(gè)16位復(fù)位寄存器(GPIOx_BRR)和1個(gè)32位鎖定寄存器(GPIOx_LCKR)。I/O口設(shè)置包括端口號(hào)設(shè)置,傳輸方式設(shè)置,輸出速度設(shè)置。這三種設(shè)置是相互關(guān)聯(lián)的,有些 I/O口只能用作輸入口,有些只能用作輸出口,這是由于在實(shí)際的電路中,有些I/O口采取了固化措施,設(shè)定了特定功能,例如PE的所有I/O口都被用于觸摸屏,不能額外分配;PA0口作為輸入口時(shí),正常時(shí)為高電平,發(fā)生中斷時(shí)為低電平。傳輸模式包括:浮空輸入、輸入上拉、輸入下拉、模擬輸入、開漏輸入、推挽式輸出、推挽式復(fù)用功能、開漏式復(fù)用功能等模式。不同的輸入輸出模式可能會(huì)產(chǎn)生不同的結(jié)果。開漏輸出,輸出端相當(dāng)于三極管的集電極,要得到高電平需上拉電阻,適合于做電流型的驅(qū)動(dòng);推挽輸出可以輸出高低電平,連接數(shù)字器件。但在本應(yīng)用中,均連接數(shù)字器件,故只需將輸入模式設(shè)置為浮空輸入,輸出模式設(shè)置為推挽輸出即可。當(dāng)為輸出模式時(shí),有3種輸出速度可選(2MHz、10MHz和50MHz),這個(gè)速度是指I/O口驅(qū)動(dòng)電路的響應(yīng)速度而非輸出信號(hào)的速度,后者與程序有關(guān)(芯片內(nèi)部在I/O口的輸出部分安排了多個(gè)不同響應(yīng)速度的輸出驅(qū)動(dòng)電路,用戶可以根據(jù)需要選擇合適的驅(qū)動(dòng)電路)。通過選擇速度來選擇不同的輸出驅(qū)動(dòng)模塊,達(dá)到最佳的噪聲控制和降低功耗的目的。高頻的驅(qū)動(dòng)電路,噪聲也高,當(dāng)不需要高的輸出頻率時(shí),請(qǐng)選用低頻驅(qū)動(dòng)電路,這樣非常有利于提高系統(tǒng)的EMI性能。當(dāng)然如果要輸出較高頻率的信號(hào),但卻選用了較低頻率的驅(qū)動(dòng)模塊,很可能會(huì)得到失真的輸出信號(hào)。以USART1的I/O口配置為例:voidGPIO_Configuration(void){GPIO_InitTypeDefGPIO_InitStructure; GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Pin=GPIO_Pin_9; //usart1發(fā)送 GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;//推挽輸出 GPIO_Init(GPIOA,&GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin=GPIO_Pin_10; //usart1接收 GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING;//浮空輸入GPIO_Init(GPIOA,&GPIO_InitStructure);}其中PA9配置為推挽輸出模式,PA10則配置為浮空輸入模式。其它的I/O口配置方式與上述一樣。具體采用什么I/O口,下面會(huì)一一介紹。因?yàn)槌绦蛐枨?,往往一個(gè)I/O口即要被配置成輸入口,同時(shí)也要轉(zhuǎn)換成輸出口,遇到這種情況,如果像上述一樣編程,勢必會(huì)使程序顯得繁雜,此時(shí)可采用寫寄存器的方式來更換I/O口的傳輸模式。具體寫法如下:#defineDAT_OUTGPIOD->CRL=(GPIOD->CRL&(~(0x0000000F<<04)))|0x00000003<<04①#defineDAT_INGPIOD->CRL=(GPIOD->CRL&(~(0x0000000F<<04)))|0x00000004<<04②其中第一行將PD1設(shè)置為推挽輸出模式,第二行將PD1設(shè)置為浮空輸入模式。在使用時(shí),只需在程序前,加入一行DAT_OUT;或者DAT_IN來切換PD1輸入輸出。當(dāng)書寫其它I/O口的程序時(shí),只需將GPIOD換成相應(yīng)I/O口,如果端口號(hào)為0~7,則只需將<<右邊的04改成端口號(hào)*4的積,例如PA0則為00,如果端口號(hào)為8~15,則需將CRL換成CRH,同時(shí)<<右邊的04改成(端口號(hào)-8)*4,例如PB13則為20。在程序中配置I/O口之前,還需對(duì)I/O口進(jìn)行初始化,即開啟系統(tǒng)時(shí)鐘,例如,使能PA口:RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA

,

ENABLE)//使能APB2總線外設(shè)時(shí)鐘。這樣就可以配置完整I/O口了。當(dāng)學(xué)會(huì)配置好I/O口后,根據(jù)開發(fā)板中LED燈得I/O口(如圖4.1),即可書寫一個(gè)簡單的控制LED等閃爍的程序。圖4.1LED燈電路圖程序?yàn)?voidledflash(void){GPIO_SetBits(GPIOD,GPIO_Pin_2); //LED1delay_ms(1000);GPIO_ResetBits(GPIOD,GPIO_Pin_2);delay_ms(1000);GPIO_SetBits(GPIOD,GPIO_Pin_3); //LED2delay_ms(1000);GPIO_ResetBits(GPIOD,GPIO_Pin_3);delay_ms(1000);GPIO_SetBits(GPIOD,GPIO_Pin_4); //LED3delay_ms(1000);GPIO_ResetBits(GPIOD,GPIO_Pin_4);delay_ms(1000); GPIO_SetBits(GPIOD,GPIO_Pin_7); //LED4delay_ms(1000);GPIO_ResetBits(GPIOD,GPIO_Pin_7);delay_ms(1000);}此程序的功能是,使LED燈依次閃爍。4.32AFIOI/O口重映射為了使不同器件封裝的外設(shè)I/O口功能數(shù)量達(dá)到最優(yōu),可以把一些復(fù)用功能重新映射到其他一些腳上(可參照4.4節(jié)表4.1)。可通過軟件編程來實(shí)現(xiàn)。當(dāng)使用了重映射功能后,原始引腳便不再具備原先設(shè)定的功能。以USART1為例,原先輸出口為PA9,經(jīng)重映射后,輸出口則改為PB6,而PA9則可作為其它外設(shè)的輸入輸出口使用。具體使用方法為:首先,開啟AFIO時(shí)鐘,如下:RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);然后,在I/O口配置之前,使能復(fù)用:GPIO_PinRemapConfig(GPIO_Remap_USART1,ENABLE);最后,按規(guī)定配置I/O口。由于本項(xiàng)目使用的STM32功能較簡單,所以并未用到重映射功能,但卻要開啟AFIO時(shí)鐘,具體原因在4.5節(jié)講中斷時(shí)會(huì)提到。4.4USART設(shè)置與應(yīng)用USART即STM32F10x處理器的通用同步異步收發(fā)器單元。每個(gè)STM32板提供2~5個(gè)獨(dú)立的異步串行通信接口,可工作于中斷和DMA模式兩種模式。USART單元支持同步單工、雙工通信和半雙工單線通信,也支持LIN(LocalInterconnectionNetwork)、智能卡協(xié)議和IrDA(紅外)SIRENDEC規(guī)范,以及調(diào)制解調(diào)器(CTS/RTS)操作,并允許多處理器通信。USART的配置很簡單,用起來也較方便。以配置查詢方式的USART1為例,如下:voidUSART1_Configuration(void){USART_InitTypeDefUSART_InitStructure;//串口設(shè)置恢復(fù)默認(rèn)參數(shù) USART_ClockInitTypeDefUSART_ClockInitStructure;//初始化參數(shù)設(shè)置USART_InitStructure.USART_BaudRate=2400;//波特率2400USART_InitStructure.USART_WordLength=USART_WordLength_8b;//字長8位USART_InitStructure.USART_StopBits=USART_StopBits_1;//1位停止字節(jié)USART_InitStructure.USART_Parity=USART_Parity_No;//無奇偶校驗(yàn)USART_InitStructure.USART_HardwareFlowControl=USART_HardwareFlowControl_None;//無流控制//打開Rx接收和Tx發(fā)送功能USART_InitStructure.USART_Mode=USART_Mode_Rx|USART_Mode_Tx;USART_Init(USART1,&USART_InitStructure);//初始化//USART時(shí)鐘配置USART_ClockInitStructure.USART_Clock=USART_Clock_Disable;USART_ClockInitStructure.USART_CPOL=USART_CPOL_High;USART_ClockInitStructure.USART_CPHA=USART_CPHA_2Edge;USART_ClockInitStructure.USART_LastBit=USART_LastBit_Disable;USART_ClockInit(USART1,&USART_ClockInitStructure);USART_Cmd(USART1,ENABLE);//啟動(dòng)串口}前面提到過在配置異步通信時(shí),需要注意波特率的配置,對(duì)于PSCU板,其所需波特率為2400bps,但是4.8節(jié)提到的無線通信傳感器(ZIGBEE)則需要9600bps,需對(duì)USART重新配置。而是否需要USART時(shí)鐘配置,則根據(jù)實(shí)際需要,如果單純是控制舵機(jī),時(shí)鐘配置這一段可省略。當(dāng)然在配置USART之前需要進(jìn)行兩項(xiàng)工作,首先和GPIO一樣需配置時(shí)鐘:RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);因?yàn)镾TM32板有多個(gè)USART串口,常用的有1~3,而USART2、USART3的時(shí)鐘配置不同于USART1,因?yàn)樗鼈冊(cè)贏PB1上,而后者在APB2上。應(yīng)如下配置:RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2,ENABLE);配置完時(shí)鐘,便需配置GPIO口,U1在上節(jié)已配置,U2、U3的配置與U1一致,但是需要更換I/O口。具體見下表:USARTPINGPIOAFIOUSART1TXPA9PB6RXPA10PB7USART2TXPA2PD5RXPA3PD6USART3TXPB10PC10(PD8)RXPB11PC11(PD9)表4.1串行通信GPIO口及復(fù)用GPIO口注:表中的AFIO列為復(fù)用I/O口配置完USART后,便是如何使用了,這包括數(shù)據(jù)發(fā)送和接收。㈠發(fā)送單個(gè)字節(jié)函數(shù)一:charser_putbyte(chardata){USART_SendData(USART1,(unsignedchar)data);while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)==RESET);USART1->DR=(data&0xFF);return(data);}函數(shù)二:intSendChar(intch){USART_SendData(USART1,(unsignedchar)ch);while(!(USART1->SR&USART_FLAG_TXE));return(ch);}上述兩個(gè)函數(shù)的功能等同,在寫程序時(shí)可以隨意調(diào)用,例如3.4節(jié)提到的SendPacket()函數(shù)便調(diào)用了上述的函數(shù)一。㈡接收一個(gè)字節(jié)u8RByte(void){u8out=0; while(USART_GetFlagStatus(USART1,USART_FLAG_RXNE)==RESET){}//等待接收完畢out=(USART_ReceiveData(USART1));//接收一個(gè)字節(jié) returnout;}該函數(shù)用于接收單個(gè)字節(jié),在無線通信時(shí)可用到。㈢發(fā)送一個(gè)字符串voidPrint_String(u8*p)//發(fā)送一串?dāng)?shù)據(jù){while(*p){USART_SendData(USART1,*p++);while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)==RESET){}}}當(dāng)連續(xù)發(fā)送的字符很多時(shí),可以選用該函數(shù)以字符串形式發(fā)送。㈣接收一個(gè)字符串voidSerialIn(u8*buf,u8len){unsignedchari; for(i=0;i<len;i++) buf[i]=RByte();}同樣,當(dāng)需要連續(xù)發(fā)送多個(gè)字節(jié)數(shù)據(jù)時(shí),則可選用該函數(shù)。上面提到的都是USART1的設(shè)置以及拓展功能函數(shù)的書寫。而其它串口通信的設(shè)置與U1一致,功能函數(shù)則只需將U1換成U2或U3即可。由于主板的問題,本項(xiàng)目中并未使用U2、U3來實(shí)現(xiàn)其它串口通信,而是將所有的串口通信均由U1來實(shí)現(xiàn),這也是權(quán)宜之計(jì),即采用分時(shí)復(fù)用的原理。具體說來,就是發(fā)聲傳感器和無線傳感器都需要通過異步傳輸來與處理器通信。對(duì)于每個(gè)傳感器以及PSCU,它們能夠識(shí)別的信號(hào)是由特定字符串組成的。這樣,只要將PA9、PA10口多引出幾個(gè)引腳,分別接到傳感器以及PSCU的相應(yīng)口即可,在傳輸指令時(shí),分時(shí)傳送,對(duì)于無法識(shí)別的字符串,則不處理,這樣便解決了串口不夠的問題。如果要實(shí)現(xiàn)搶占,則將它們配置成中斷模式即可,并配置好優(yōu)先級(jí)。4.5外部中斷設(shè)置與應(yīng)用當(dāng)主控制板遇到異常時(shí),便會(huì)觸發(fā)中斷,并進(jìn)行處理。NVIC,中文叫做嵌套矢量中斷控制器,是用來處理中斷的對(duì)于STM32F107的普通用戶來說,只要掌握EXTI線中斷,USART中斷以及TIM中斷即可。下面僅對(duì)EXTI中斷作簡略介紹。外部中斷/事件控制器(EXTI)由19個(gè)產(chǎn)生事件/中斷請(qǐng)求的邊沿檢測器組成。每個(gè)輸入線可獨(dú)立地配置輸入類型和對(duì)應(yīng)的觸發(fā)事件(上升沿、下降沿或雙邊沿觸發(fā))每個(gè)輸入線都可以被獨(dú)立地屏蔽,由掛起寄存器保持著狀態(tài)線的中斷要求。如果要產(chǎn)生外部中斷,首先必須配置好并激活中斷線。配置內(nèi)容包括:根據(jù)需要的邊沿檢測設(shè)置2個(gè)觸發(fā)寄存器、在中斷屏蔽寄存器的相應(yīng)位寫1以允許中斷請(qǐng)求。當(dāng)外部中斷線上出現(xiàn)設(shè)定的邊沿信號(hào)時(shí),將產(chǎn)生一個(gè)中斷請(qǐng)求等待處理。完成中斷服務(wù)后,可以清除該中斷請(qǐng)求。下面具體介紹如何配置硬件中斷/事件請(qǐng)求。(1)首先要了解中斷線與I/O口的關(guān)系,如圖4.2可知,PA~PE的0~15口分別對(duì)應(yīng)EXTI的0~15口;EXTI16與PVD輸出連接、EXTI17與RTC鬧鐘事件連接、EXTI18與USB喚醒事件連接。圖4.2中斷線與GPIO口對(duì)應(yīng)關(guān)系(2)對(duì)EXTI線配置,以EXTI0為例,配置函數(shù)如下:voidNVIC_Configuration(void){NVIC_InitTypeDefNVIC_InitStructure;①#ifdefVECT_TAB_RAMNVIC_SetVectorTable(NVIC_VectTab_RAM,0x0);②#elseNVIC_SetVectorTable(NVIC_VectTab_FLASH,0x0);③#endifNVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);④NVIC_InitStructure.NVIC_IRQChannel=EXTI0_IRQn; ⑤NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1;⑥NVIC_InitStructure.NVIC_IRQChannelSubPriority=0; ⑦NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;⑧NVIC_Init(&NVIC_InitStructure);}⑨①~③為中斷地址配置;④表示選擇優(yōu)先級(jí)1組,即占先式優(yōu)先級(jí)以1位數(shù)字表示,副優(yōu)先級(jí)以三位數(shù)字表示,如表4.2所示表4.2中斷優(yōu)先級(jí)分組⑤表示選用EXTI0中斷線,注意在有些教材中等號(hào)右邊為EXTI0_IRQChannel,但在實(shí)際操作中,可能無法編譯,應(yīng)寫成上面形式。如果是選用中斷線EXTI11,應(yīng)寫作EXTI15_10_IRQn;EXTI8則為EXTI9_5_IRQn。⑥為配置占先式優(yōu)先級(jí)(主優(yōu)先級(jí)):高占先式優(yōu)先級(jí)的中斷會(huì)打斷當(dāng)前的主程序/中斷程序運(yùn)行,即所謂的中斷嵌套。優(yōu)先級(jí)數(shù)值越大,優(yōu)先級(jí)越低。⑦為配置副優(yōu)先級(jí)(子優(yōu)先級(jí)):在占先式優(yōu)先級(jí)相同的情況下。在低副優(yōu)先級(jí)中斷運(yùn)行中,高副優(yōu)先級(jí)的中斷要等待已被響應(yīng)的低副優(yōu)先級(jí)中斷執(zhí)行結(jié)束后才能得到響應(yīng)—非搶斷式響應(yīng)(不能嵌套)。但如果同時(shí)這兩個(gè)中斷同時(shí)到達(dá),則先執(zhí)行中斷優(yōu)先級(jí)高的,執(zhí)行完后,再執(zhí)行低優(yōu)先級(jí)中斷;如果兩個(gè)中斷的所有優(yōu)先級(jí)均一樣,則哪個(gè)中斷先到達(dá),就先執(zhí)行哪個(gè)中斷。對(duì)于副優(yōu)先級(jí),數(shù)值越大,優(yōu)先級(jí)越低。(3)對(duì)中斷線進(jìn)行I/O口配置從圖4.2中可知,每個(gè)中斷線對(duì)應(yīng)5個(gè)I/O口,所以在使用前,一定要先進(jìn)行I/O口配置。仍以EXTI0為例,由開發(fā)板原理圖可知,PA0可直接配置為EXTI0中斷,無需電路設(shè)計(jì)。如有需要,也可按照?qǐng)D4.3所示,配置其它中斷。圖4.3PA0中斷線電路配置程序?yàn)椋簐oidEXTI_Configuration(void){EXTI_InitTypeDefEXTI_InitStructure;GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource0);①EXTI_InitStructure.EXTI_Line=EXTI_Line0;②EXTI_InitStructure.EXTI_Mode=EXTI_Mode_Interrupt;EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Falling;③EXTI_InitStructure.EXTI_LineCmd=ENABLE;EXTI_Init(&EXTI_InitStructure);}①即表示選用PA0配置中斷;②表示中斷線為EXTI0;③表示下降沿觸發(fā)中斷。(4)配置中斷處理程序外部中斷關(guān)鍵在于使用,下面為通過EXTI0中斷來控制LED燈的程序:voidEXTI0_IRQHandler(void){if(EXTI_GetITStatus(EXTI_Line0)!=RESET){ledflash();//LED閃爍函數(shù),見4.31節(jié)EXTI_ClearITPendingBit(EXTI_Line0); //清除中斷屏蔽位}}只要改變ledflash()行,即可在中斷產(chǎn)生時(shí),進(jìn)入不同的中斷處理程序。由此多配置幾個(gè)中斷線,并配合行走程序,便可設(shè)計(jì)一個(gè)手柄(或控制面板)來控制使機(jī)器人完成前進(jìn)后退等動(dòng)作。在開發(fā)板上還配備一個(gè)PC13的中斷引腳,其電路圖與PA0一致,但是在調(diào)試過程中卻出現(xiàn)了bug,無法調(diào)通,這就是為什么在4.32節(jié)介紹AFIO時(shí)提到的需要使能AFIO。雖然沒有進(jìn)行任何重映射,但程序中必須加入AFIO使能這一行,PC13的中斷程序才能執(zhí)行。在調(diào)試過程中需要注意這一點(diǎn)。4.6系統(tǒng)時(shí)鐘與定時(shí)器設(shè)置與應(yīng)用4.61系統(tǒng)時(shí)鐘簡介與應(yīng)用Cortex-M3的內(nèi)核中包含一個(gè)4位的遞減計(jì)數(shù)器——SysTick時(shí)鐘。當(dāng)設(shè)定了SysTick的初值并使能后,每經(jīng)過1個(gè)系統(tǒng)時(shí)鐘周期,計(jì)數(shù)值就減1。當(dāng)計(jì)數(shù)到0時(shí),SysTick計(jì)數(shù)器便自動(dòng)重裝初值并繼續(xù)計(jì)數(shù),同時(shí)內(nèi)部的COUNTFLAG標(biāo)志會(huì)置位,觸發(fā)中斷(如果中斷使能情況下)。由此,可以利用Systick的上述特點(diǎn),來編寫Delay()函數(shù),來實(shí)現(xiàn)精確延遲。系統(tǒng)時(shí)鐘為72MHz,SysTick的最高頻率為9MHz(最大為HCLK/8),那么每次計(jì)數(shù)器減1所用的時(shí)間是1/9M,計(jì)數(shù)器的初值如果是9,那么每次計(jì)數(shù)器減到0,時(shí)間經(jīng)過(1/9M)*9=0.001μ,即1μs。首先書寫延遲的初始化程序:voiddelay_init(charSYSCLK){ SysTick->CTRL&=0xfffffffb;① fac_us=SYSCLK/8;② fac_ms=(int)fac_us*1000;③ fac_s=(int)fac_ms*1000;}④①根據(jù)STK控制寄存器知,將0~2位設(shè)置成3,16位設(shè)置為1,則意味著:開啟Systick功能、開啟Systick中斷、使用HCLK/8作為Systick時(shí)鐘、上次讀取本寄存器后,Systick已經(jīng)數(shù)到了0;②根據(jù)①選用的時(shí)鐘書寫,調(diào)用時(shí)應(yīng)寫作delay_init(72);③、④可根據(jù)需要書寫。然后書寫延遲程序,以毫秒延遲為例:voiddelay_ms(intnms){ //毫秒級(jí)延遲 u32temp; SysTick->LOAD=(u32)nms*fac_ms;//loadthetime SysTick->VAL=0x00;//clearthecounter SysTick->CTRL=0x01;//startthecounter do{temp=SysTick->CTRL; }while(temp&0x01&&!(temp&(1<<16)));//waitforthetime SysTick->CTRL=0x00;//closethecounter SysTick->VAL=0X00;//clearthecounter}該程序即是指當(dāng)計(jì)數(shù)到設(shè)定值后,Systick的第16位控制位會(huì)自動(dòng)清零,從而使函數(shù)結(jié)束,停止計(jì)數(shù),達(dá)到精確延時(shí)的目的。在實(shí)際應(yīng)用中,當(dāng)配置了延遲秒級(jí)的函數(shù)時(shí),同樣會(huì)出現(xiàn)問題,可能是計(jì)數(shù)器溢出,無法延遲到設(shè)定值,此時(shí)不妨將原先的函數(shù)分多段書寫,例如如果需要延遲10s,可以寫兩行delay_s(5);4.62定時(shí)器配置STM32F10x處理器內(nèi)部有4個(gè)定時(shí)器,其中TIM1為高級(jí)控制定時(shí)器,TIM2、TIM3和TIM4為3個(gè)獨(dú)立的通用定時(shí)器。通用定時(shí)器是一個(gè)可編程預(yù)分頻器驅(qū)動(dòng)的16位自動(dòng)裝載計(jì)數(shù)器,適用于多種場合。通用定時(shí)器是完全獨(dú)立地,它們可以一起同步工作。以配置TIM2為例,其程序如下:voidTIM2_Configuration(void){TIM_TimeBaseInitTypeDefTIM_TimeBaseStructure;TIM_TimeBaseStructure.TIM_Period=0xffff;①TIM_TimeBaseStructure.TIM_Prescaler=71;②TIM_TimeBaseStructure.TIM_ClockDivision=0x0;③TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;④TIM_TimeBaseInit(TIM2,&TIM_TimeBaseStructure);}①為自動(dòng)重裝載寄存器周期的值(定時(shí)時(shí)間),累計(jì)0xFFFF個(gè)頻率后產(chǎn)生一個(gè)更新或中斷。②為時(shí)鐘預(yù)分頻數(shù),其與時(shí)鐘頻率的關(guān)系為:時(shí)鐘頻率=72/(時(shí)鐘預(yù)分頻數(shù)+1)=1M;則71代表計(jì)數(shù)周期為1μs;③為時(shí)間分割值;④設(shè)定定時(shí)器模式,程序中設(shè)定的為向上計(jì)數(shù)模式。在柔性力以及超聲波傳感器中將用到定時(shí)器,其調(diào)用函數(shù)為:time=TIM_GetCounter(TIM2)。4.7機(jī)器人行走步態(tài)程序編寫4.71行走步態(tài)簡介機(jī)器人步態(tài)有很多種,但最基本的步態(tài)包括:三腳步態(tài),四腳步態(tài)和波動(dòng)步態(tài)。顧名思義,這種步態(tài)的劃分是與同時(shí)落地的腳的個(gè)數(shù)有關(guān)的,分別為三個(gè)、四個(gè)以及一個(gè)。在編寫行走步態(tài)程序前,首先要建立幾個(gè)數(shù)組,儲(chǔ)存初始數(shù)據(jù)。如下:①channelno[18]={0,1,2,3,4,5,6,7,8,31,30,29,28,27,26,25,24,23}; ②initposi[18]={900,755,785,655,810,820,680,714,920,645,750,715,785,750,755,890,825,815}; //身體水平③initposi1[18]={900,655,685,655,710,720,680,614,820,645,850,815,785,850,855,890,925,915};//抬高身體④initposi2[18]={900,855,885,655,910,920,680,814,1020,645,650,615,785,650,655,890,725,715};//身體下沉數(shù)組一是機(jī)器人六個(gè)腳從左至右,從前至后從上至下所對(duì)于的舵機(jī)號(hào)。下面三個(gè)數(shù)組則是機(jī)器人處于不同狀態(tài)時(shí)的舵機(jī)位置初始值,此時(shí)每個(gè)腳第一關(guān)節(jié)均與身體垂直。后續(xù)的所有舵機(jī)運(yùn)動(dòng)程序都要在上述各數(shù)組基礎(chǔ)上完成。由于安裝的對(duì)稱性,左右舵機(jī)實(shí)現(xiàn)向前后、向內(nèi)外所需輸入的值是正好相反的。利用PSCI軟件,進(jìn)行步態(tài)規(guī)劃,得到表4.3值。關(guān)節(jié)號(hào)(數(shù)組號(hào))初始抬腿前擺下落后擺0(0)900+0-150+0+1501(1)755+150+0-150+02(2)785+150向內(nèi)+0-150+03(6)655+0-150+0+1504(4)810+150+0-150+05(5)820+150+0-150+06(6)680+0-150+0+1507(7)715+150+0-150+08(8)920+150+0-150+031(9)645+0+150+0-15030(10)750-150+0+150+029(11)715-150向內(nèi)+0+150+028(12)785+0+150+0-15027(13)750-150+0+150+026(14)755-150+0+150+025(15)890+0+150+0-15024(16)825-150+0+150+023(17)815-150+0+150+0表4.3機(jī)器人行走舵機(jī)值表4.3中,第一列每三個(gè)一組,分別對(duì)應(yīng)腳1、2、3、4、5、6,括號(hào)中為使編程方便,提示的channelno數(shù)組號(hào)數(shù)。從表中就可清晰地看出,左右腳的舵機(jī)恰好是反向的。為使編程方便,可以新建四個(gè)數(shù)組:raiseposi[18]、lowerposi[18]、forwardposi[18]、backwardposi[18],用以存儲(chǔ)表后四列的值,可直接賦值,但為了程序可以拓展,可按下面的程序進(jìn)行賦值:voidCalculateposi(void){inti,j=0;for(i=0;i<18;i++){j=channelno[i]; switch(j) {case0: case3: case6: raiseposi[i]=initposi1[i]; lowerposi[i]=initposi1[i]; forwardposi[i]=initposi1[i]-Stride; backwardposi[i]=initposi1[i]+Stride; break; case25: case28: case31: raiseposi[i]=initposi1[i]; lowerposi[i]=initposi1[i]; forwardposi[i]=initposi1[i]+Stride; backwardposi[i]=initposi1[i]-Stride;; break; case1: case2: case4: case5: case7: case8: raiseposi[i]=initposi1[i]+Stride*2; lowerposi[i]=initposi1[i]-Stride*2;;forwardposi[i]=initposi1[i]; backwardposi[i]=initposi1[i]; break; default: raiseposi[i]=initposi1[i]-Stride*2; lowerposi[i]=initposi1[i]+Stride*2;forwardposi[i]=initposi1[i]; backwardposi[i]=initposi1[i]; break; }}}此程序較為簡單,在此不再贅述。要提到的是,也可用if語句書寫,同時(shí)給函數(shù)提供數(shù)組變量,可使程序功能更為強(qiáng)大。在此基礎(chǔ)上,便可開始步態(tài)編程了。4.72三腳步態(tài)三腳步態(tài)即三只腳落地,三只腳懸空運(yùn)動(dòng)。按圖2.1中所示,以前進(jìn)程序?yàn)槔唧w行走路徑為:首先,1、3、5腳抬起,2、4、6腳著地;然后,1、3、5腳前邁;再接著,1、3、5腳落地;最后,1、3、5腳向后緩慢運(yùn)動(dòng),同時(shí)2、4、6腳抬起。其中前三步所花時(shí)間與最后一步所花時(shí)間相等。如此往復(fù),機(jī)器人便能向前運(yùn)動(dòng)了。而機(jī)器人運(yùn)動(dòng)的原理與人行走是一致的,靠的是地面摩擦力,這就是為什么當(dāng)腳著地并向后運(yùn)動(dòng)時(shí),機(jī)器人卻向前運(yùn)動(dòng)。對(duì)于后退,只要將步驟中的前邁改為后退,向后緩慢運(yùn)動(dòng)改為向前運(yùn)動(dòng)即可。在編寫三腳步態(tài)前,同樣先聲明幾個(gè)輔助數(shù)組,用以存儲(chǔ)舵機(jī)端口號(hào),簡化編程,如下:tri135no[9]={1,2,7,8,13,14,0,6,12};tri246no[9]={4,5,10,11,16,17,3,9,15};數(shù)組不是直接存儲(chǔ)的舵機(jī)端口號(hào),而是對(duì)應(yīng)與channelno[]數(shù)組的數(shù)組號(hào)。下面是前進(jìn)程序的編寫:voidtriforward(inttime){inti,j,k,l=0;for(i=0;i<time;i++){for(j=0;j<6;j++)//1、3、5腳上抬{k=tri135no[j];//獲取數(shù)組序號(hào)l=channelno[k];//獲取端口號(hào)SendPacket(s,l,raiseposi[k]); } delay_ms(Delayms);for(j=6;j<9;j++)//1、3、5腳前進(jìn){k=tri135no[j]; l=channelno[k]; SendPacket(s,l,forwardposi[k]); } delay_ms(Delayms);for(j=0;j<6;j++)//1、3、5腳下降至初位{k=tri135no[j]; l=channelno[k]; SendPacket(s,l,initposi1[k]); } delay_ms(Delayms);for(j=6;j<9;j++)//1、3、5腳后退至初位{k=tri135no[j]; l=channelno[k]; SendPacket(s*3,l,backwardposi[k]); }注:2、4、6腳與1、3、5類似,略去。}因?yàn)镾endPacket函數(shù)涉及到三個(gè)變量:速度、舵機(jī)號(hào)、舵機(jī)位置,所以利用變量l、k分別提取舵機(jī)號(hào)及其對(duì)應(yīng)的數(shù)組號(hào)。為使機(jī)器人行走時(shí)滿足運(yùn)動(dòng)周期要求,則需要設(shè)定不同速度,經(jīng)調(diào)試,當(dāng)s=7,著地移動(dòng)速度為21時(shí)滿足行走要求。為使機(jī)器人動(dòng)作到位,每次發(fā)送指令后必須要延遲,其延遲關(guān)系近似為舵機(jī)位置變化值的五分之一,即Delayms=stride/5=150/5。4.73四腳步態(tài)四腳步態(tài)與三腳步態(tài)類似,由于有四只腳同時(shí)著地,則顯得更穩(wěn)定。以前進(jìn)為例,其行走路徑為:一、1、5腳上抬;二、1、5腳前進(jìn);三、1、5腳落地;四、1、5腳后退;五、26、34腳同上。當(dāng)34腳落地時(shí),15腳正好抬起,同樣需要通過改變步態(tài)速度來實(shí)現(xiàn)。在編程之前,需聲明如下三個(gè)數(shù)組:quar15no[6]={1,2,13,14,0,12}; quar26no[6]={4,5,16,17,3,15}; quar34no[6]={7,8,10,11,6,9}; 程序則為:voidquarforward(inttime){inti,j,k,l=0;for(i=0;i<time;i++){for(j=0;j<4;j++)//1、5腳上抬{k=quar15no[j];//獲取數(shù)組序號(hào) l=channelno[k];//獲取端口號(hào) SendPacket(s,l,raiseposi[k]); } delay_ms(Delayms);for(j=4;j<6;j++)//1、5腳前進(jìn){k=quar15no[j]; l=channelno[k]; SendPacket(s,l,forwardposi[k]); } delay_ms(Delayms);for(j=0;j<4;j++)//1、5腳下降至初位{k=quar15no[j]; l=channelno[k]; SendPacket(s,l,initposi1[k]); } delay_ms(Delayms);for(j=4;j<6;j++)//1、5腳后退至初位{k=quar15no[j]; l=channelno[k]; SendPacket(s*3,l,backwardposi[k]); 注:2、6;3、4與1、5的一致,只要將數(shù)組換掉即可 }由于四腳步態(tài)的穩(wěn)定性,后續(xù)的其它涉及到行走的程序,均調(diào)用的是四腳步態(tài)的前進(jìn)后退。4.74單腳(波動(dòng))步態(tài)單腳步態(tài)由于每次只移動(dòng)一只腳,看起來動(dòng)作較快,實(shí)際上走一步花的時(shí)間較長,總體上看行走較慢,只適合表演一下。其行走步驟為:一、1腳上抬;二、1腳前進(jìn);三、1腳落地;四、1腳后退;五、按4、2、5、3、6腳的順序依次完成與1腳相同的動(dòng)作。為實(shí)現(xiàn)6腳落地時(shí),1腳抬起,則動(dòng)作速度設(shè)置為7、28。。首先定義六個(gè)數(shù)組,與前述功能一致:intsingle1no[3]={0,1,2};intsingle2no[3]={3,4,5};intsingle3no[3]={6,7,8};intsingle4no[3]={9,

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(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ǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論