《六腳爬蟲(chóng)機(jī)器人機(jī)械結(jié)構(gòu)設(shè)計(jì)和程序設(shè)計(jì).doc》由會(huì)員分享,可在線閱讀,更多相關(guān)《六腳爬蟲(chóng)機(jī)器人機(jī)械結(jié)構(gòu)設(shè)計(jì)和程序設(shè)計(jì).doc(64頁(yè)珍藏版)》請(qǐng)?jiān)谘b配圖網(wǎng)上搜索。
摘要
本文詳細(xì)介紹了六腳爬蟲(chóng)機(jī)器人的機(jī)械結(jié)構(gòu)以及控制程序的編寫。
機(jī)械結(jié)構(gòu)采用了對(duì)稱式設(shè)計(jì),結(jié)構(gòu)簡(jiǎn)單;其行走功能由六只腳、18個(gè)舵機(jī)實(shí)現(xiàn),自由度較高,穩(wěn)定性、靈活性較好。
控制程序的主體是C語(yǔ)言。包括基本步態(tài)的編寫,以及傳感器的在機(jī)器人上的高級(jí)應(yīng)用,這樣,機(jī)器人在滿足基本行走運(yùn)動(dòng)的同時(shí),也能感知外界環(huán)境,并通過(guò)控制器對(duì)接收到的外界信號(hào)進(jìn)行處理,并控制機(jī)器人運(yùn)動(dòng)。
關(guān)鍵詞: 對(duì)稱式結(jié)構(gòu),舵機(jī)控制器,步態(tài),傳感器
Abstract
The thesis describes in detail that the mechanic design of Hexcrawler and the compiling of control program.
The structure of the robot is in symmetric expression, a simple mechanism; the function of walking is supported by six legs, and eighteen motors, with multiple degrees of freedom. Besides, it is of high stability and flexibility.
The program to control the robot is written in C language, including basic gait, the advanced application of sensors. Thereby, the robot can walk in several gaits. At the same time, it can sense the condition around it. Then, it will process the data it received, and control the motion of the robot.
Keywords: symmetric expression,PSCU, gait, sensor
目錄
摘要 I
Abstract II
目錄 III
1 緒論 - 1 -
1.1課題來(lái)源 - 1 -
1.2本課題的目的及其意義 - 1 -
1.3國(guó)內(nèi)外發(fā)展現(xiàn)狀 - 1 -
1.4本課題的研究?jī)?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ī)控制板 - 11 -
3.4 控制板程序編寫 - 14 -
4 STM32開(kāi)發(fā)板介紹與程序編寫 - 18 -
4.1 STM32F107芯片簡(jiǎn)介 - 18 -
4.2 軟件與編程初始準(zhǔn)備 - 18 -
4.3 GPIO與AFIO設(shè)置與應(yīng)用 - 18 -
4.31 GPIO設(shè)置與應(yīng)用…………………………………………………………………………………………..18
4.32 AFIO-----I/O口重映射…………………………………………………………………………………...22
4.4 USART設(shè)置與應(yīng)用 - 22 -
4.5外部中斷設(shè)置與應(yīng)用 - 26 -
4.6 系統(tǒng)時(shí)鐘設(shè)置與應(yīng)用 - 29 -
4.61 系統(tǒng)時(shí)鐘簡(jiǎn)介與應(yīng)用…………………………………………………………………………………..29
4.62 定時(shí)器配置……………………………………………………………………………………………………31
4.7 機(jī)器人行走步態(tài)程序編寫 - 32 -
4.71 機(jī)器人行走步態(tài)簡(jiǎn)介……………………………………………………………………………………33
4.72 三腳步態(tài)……………………………………………………………………………………………………….35
4.73 四腳步態(tài)………………………………………………………………………………………….……………37
4.74 單腳(波動(dòng))步態(tài)……………………………………………………………………………………....38
4.75 轉(zhuǎn)彎與橫爬步態(tài)…………………………………………………………………………………………….40
4.8 多傳感器應(yīng)用與程序編寫 - 43 -
4.81 指南針傳感器……………………………………………………………………………………………….43
4.82 紅外、光敏傳感器……………………………………………………………………………………….45
4.83 柔性力傳感器……………………………………………………………………………………………….46
4.84 溫濕度、發(fā)聲、射頻識(shí)別(RFID)傳感器………………………………………………..48
4.85 無(wú)線(Zigbee)傳感器………………………………………………………………………………..49
4.86 超聲傳感器……………………………………………………………………………………………………52
5總結(jié) - 55 -
致謝 - 56 -
參考文獻(xiàn) - 57 -
1 緒論
1.1課題來(lái)源
本項(xiàng)目來(lái)源于華中科技大學(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)而生,從簡(jiǎn)單地追求功能到神似,到個(gè)性化;從單單發(fā)展工業(yè)機(jī)器人到工業(yè)、家用機(jī)器人全面開(kāi)花,并取得了長(zhǎng)足進(jìn)步。
六腳機(jī)器人作為行走機(jī)器人的一種,具有結(jié)構(gòu)簡(jiǎn)單,穩(wěn)定性好等優(yōu)點(diǎn),而本課題也并未在很高深的機(jī)器人理論花大量功夫,而更多地著眼于為大專院校提供機(jī)器人教學(xué)平臺(tái),或者用于科技館展覽。
本課題所設(shè)計(jì)的機(jī)器人最大的特點(diǎn)是:理論通俗易懂、操作方便、便于二次開(kāi)發(fā)。對(duì)于一些入門者(初步掌握控制論、機(jī)械設(shè)計(jì)、機(jī)械電子只是)來(lái)說(shuō),很容易便能被引領(lǐng)入機(jī)器人研究的殿堂。
1.3 國(guó)內(nèi)外發(fā)展現(xiàn)狀
對(duì)于仿生機(jī)器人,尤其是多足機(jī)器人,國(guó)內(nèi)外均有大量研究。
1990年,美國(guó)卡內(nèi)基梅隆大學(xué)研制出用于外星探測(cè)的六腳步行機(jī)器人AMBLER。該機(jī)器人采用了新型的“腿機(jī)構(gòu)",并由一臺(tái)32位的處理機(jī)來(lái)規(guī)劃系統(tǒng)運(yùn)動(dòng)路線、制運(yùn)動(dòng)和監(jiān)視系統(tǒng)的狀態(tài)。但由于體積和質(zhì)量太大,最終沒(méi)被用于行星探測(cè)計(jì)劃。
1993年,卡內(nèi)基梅隆大學(xué)開(kāi)發(fā)出有纜的八足步行機(jī)器人DANTE,用于對(duì)南極的埃里伯斯火山進(jìn)行了考察,其改進(jìn)型也在實(shí)際中得到了應(yīng)用。1994年二代對(duì)距離安克雷奇145km的斯伯火山進(jìn)行了考察,并傳回了各種數(shù)據(jù)及圖像。
日本對(duì)多足步行機(jī)的研究從20世紀(jì)80年代開(kāi)始,并不斷進(jìn)行著技術(shù)創(chuàng)新,隨著計(jì)算機(jī)和控制技術(shù)的發(fā)展,其機(jī)械結(jié)構(gòu)由復(fù)雜到簡(jiǎn)單,其功能由單一功能到組合功能,并已研究出各種類型的步行機(jī)。主要有四足步行機(jī)、爬壁機(jī)器人、腿輪分離型步行機(jī)器人和手腳統(tǒng)一型步行機(jī)器人。
1994年,日本電氣通信大學(xué)的木村浩等研制成功四足步行機(jī)器人Patrush二代。該機(jī)器人用兩個(gè)微處理機(jī)控制,采用直流伺服電機(jī)驅(qū)動(dòng),每個(gè)關(guān)節(jié)安裝了一個(gè)光電碼盤,每只腳安裝了兩個(gè)微開(kāi)關(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)步行。
我國(guó)對(duì)于多足機(jī)器人的研究起步則較晚。
1989年,北京航空航天大學(xué)在張啟先教授的指導(dǎo)下,孫漢旭博士進(jìn)行了四足步行機(jī)的研究,試制成功一臺(tái)四足步行機(jī)。錢晉武博士研究地壁兩用六腳步行機(jī)器人,并進(jìn)行了步態(tài)和運(yùn)動(dòng)學(xué)方面的研究。
1990年中國(guó)科學(xué)院沈陽(yáng)自動(dòng)化研究所研制出全方位六腳步行機(jī),不僅能在平地步行,還能上樓梯。
1991年,上海交通大學(xué)馬培蓀等研制出JTUWM 系列四足步行機(jī)器人。
2000年,馬培蓀等對(duì)第一代形狀記憶合金SMA驅(qū)動(dòng)的微型六腳機(jī)器人進(jìn)行改進(jìn),開(kāi)發(fā)出具有全方位運(yùn)動(dòng)能力的微型雙三足步行機(jī)器人其每條腿的自由度變?yōu)?個(gè)自由度,總共6個(gè)自由度。
2003年哈爾濱工程大學(xué)的孟慶鑫、袁鵬等進(jìn)行了兩棲仿生機(jī)器蟹的研究,通過(guò)研究多足步行機(jī)的單足周期運(yùn)動(dòng)規(guī)律,提出適合于兩棲仿生機(jī)器蟹的單足運(yùn)動(dòng)路線規(guī)劃方法,建立了生成周期運(yùn)動(dòng)的神經(jīng)振蕩子模型。
目前市場(chǎng)上幾款六腳機(jī)器人對(duì)比如下:
(一)DEPUSH HexCrawler
HexCrawler
Company
DEPUSH
Material
5052 alloy aluminum, 1/16” thick with clear anodizing
Leg Movement
2 DOF
Dimensions
Body: 49.68 x 40 cm, Height: between 12.3 and 15.2 cm
Cost
$350+
(二)Lynxmotion RB-Lyn-248
RB-Lyn-248
Company
Lynxmotion
Material
5052 alloy aluminum, 1/16” thick with black anodizing
Leg Movement
3 DOF
Dimensions
Body: 19.1 x 14.9 cm, Height: between 5.1 and 13.3 cm, Ground Clearance: up to 8.9 cm
Cost
$261.35+
(三)HexCrawler HDATS
HexCrawler HDATS
Company
DEPUSH
Material
5052 alloy aluminum, 1/16” thick with clear anodizing
Leg Movement
3 DOF
Dimensions
Body: 52 x 49.7 cm, Height: between 12.3 and 15.2 cm, Ground clearance: 12.7 cm
Cost
10,000 (about $1,500)
其中HexCrawler一代機(jī)器人使用的編程軟件為Parallax公司提供的教育發(fā)展版芯片。圖1.1為Phoenix公司提供的六腳機(jī)器人,圖1.2則為Depush公司的六腳機(jī)器人一代外形,其每個(gè)腳僅有兩個(gè)自由度。
圖1.1 Phoenix Hexapod
圖1.2 DEPUSH HexCrawler 1.0
1.4本課題的研究?jī)?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)身軀等簡(jiǎn)單動(dòng)作;可以完成抬腳,簡(jiǎn)單舞蹈等動(dòng)作;
1、編寫機(jī)器人各種基本動(dòng)作的軟件代碼,使其能完成以上動(dòng)作;
2、機(jī)器人可以接受電腦無(wú)線控制,編寫相應(yīng)無(wú)線控制程序;
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)鍵在于能否像爬蟲(chóng)一樣完成各種行走動(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ì)方案為:在DEPUSH HexCrawler 1.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ī)器人全長(zhǎng):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è)通過(guò)輸出軸的轉(zhuǎn)動(dòng)來(lái)控制物體轉(zhuǎn)動(dòng)的裝置。它在特定編碼的驅(qū)使下可以轉(zhuǎn)動(dòng)到工作范圍內(nèi)的任意給定位置。因?yàn)樗妮p便,位置控制簡(jiǎn)易且精確,在機(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í)際脈沖長(zhǎng)度就可用來(lái)控制舵機(jī)轉(zhuǎn)動(dòng)的角度。如圖3.1,例如1.5ms的脈沖可使舵機(jī)轉(zhuǎn)動(dòng)90。
圖3.1 舵機(jī)轉(zhuǎn)角與脈沖周期關(guān)系圖
當(dāng)舵機(jī)安裝好后,需要獲取其初始位置值,為編程做準(zhǔn)備,具體可見(jiàn)3.3節(jié)關(guān)于PSCI軟件的介紹。
3.2 舵機(jī)控制板原理介紹
由上述機(jī)械結(jié)構(gòu)介紹可知,本六腳機(jī)器人是通過(guò)控制18個(gè)舵機(jī)來(lái)實(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)的方式來(lái)控制舵機(jī)。選用型號(hào)為PARALLAX公司提供的Propeller Servo Controller USB(#28830,簡(jiǎn)稱PSCU)。如圖3.2所示:
圖3.2 舵機(jī)控制板
PSCU具有下述多項(xiàng)特點(diǎn):
①可串聯(lián)兩塊控制板實(shí)現(xiàn)32路舵機(jī)控制;
② 獨(dú)立的螺旋式接線柱為控制板供電,舵機(jī)則可通過(guò)開(kāi)關(guān)控制關(guān)停;
③ 其所用固件開(kāi)放源代碼;
④ 可通過(guò)USB接口或者串行通信接口編程;
⑤ 舵機(jī)速度可控。
PSCU規(guī)格及性能:
① 電源要求:邏輯電平5VDC@~60mA,4.8~7.5VDC控制舵機(jī);
② 通信:異步串行通信@2400bps或者38.4kbps(TTL或USB);
③ 工作溫度:32~158F(0~70C);
④ 尺寸:2.26x1.80x0.65in(57.3x45.7x16.5mm);
3.3如何使用舵機(jī)控制板
在使用控制板前,需通過(guò)螺旋式接線柱給控制板提供4.8~7.5V的直流電,同時(shí)為使舵機(jī)運(yùn)動(dòng),還需給舵機(jī)提供5V的直流電。此項(xiàng)可通過(guò)USB接口(如圖3.3)或者通過(guò)舵機(jī)控制板左上方的Serial In 處的杜邦針供電(TTL電平,如圖3.4)。
圖3.3 PSCU-USB供電電路連接圖
圖3.4 PSCU-主控制板供電電路連接圖
USB調(diào)試:
①安裝FTDI VCP驅(qū)動(dòng)(下載地址:www.parallax.com/usbdrivers);
②安裝PSCI軟件(訪問(wèn)網(wǎng)址www.parallax.com,并搜索28823)。雙擊軟件圖標(biāo),即可獲得圖3.5所示,連接好USB線,在界面上選擇COM口,獲取PSC版本,即可使用。
圖3.5 PSCI控制界面
圖中每個(gè)channel的進(jìn)度條,可發(fā)現(xiàn)對(duì)應(yīng)舵機(jī)會(huì)向相應(yīng)方向發(fā)生一定度數(shù)的旋轉(zhuǎn)。這可用來(lái)進(jìn)行舵機(jī)控制調(diào)試,從而獲取舵機(jī)位置值,來(lái)書(shū)寫步態(tài)。注意:圖中數(shù)據(jù)在編入ARM程序中時(shí),應(yīng)先除以2倍,才是實(shí)際數(shù)據(jù),即圖中的中心出1500對(duì)應(yīng)實(shí)際的750。
更多功能可參照PARALLAX公司提供的Propeller Servo Controller USB說(shuō)明文檔。
當(dāng)使用雙塊板時(shí),其連接方式為:首先將主板的Serial In(兩排,選上排)引出按高低電平信號(hào)線要求插在主控制板(STM32板)上,其中紅色線接5V電源,黑色線接地,白色線接信號(hào)線,即PA9。然后將副板的Serial In(上排)引出插在主板的Serial In處(下排)。最后通上電源即可。
了解了PSCI的基本功能,并按要求連接好電路后,首要做的就是將舵機(jī)位置的初始值找出。通過(guò)拖動(dòng)進(jìn)度條,并觀察機(jī)器人各腿的位置,從而確定舵機(jī)初值。筆者提供的舵機(jī)初始值均為六腳與身體垂直時(shí)的值,且2、3關(guān)節(jié)夾角近似為90。
本項(xiàng)目采用的事Hi-Tec公司生產(chǎn)的HS-322HD舵機(jī),如圖3.6。
圖3.6 HS-322HD舵機(jī)
其主要技術(shù)參數(shù)如下:
■重量:43g
■尺寸:402036.5mm
■拉力:[4.8V] 3Kg.cm
■拉力:[6.0V] 3.7Kg.cm
■轉(zhuǎn)速:[4.8V] 0.19sec/60
■轉(zhuǎn)速:[6.0V] 0.15sec/60
■計(jì)算電流:0.35A
3.4 控制板程序編寫
㈠基本工作準(zhǔn)備與注意事項(xiàng):
前述工作準(zhǔn)備停當(dāng),即可開(kāi)始程序的編寫。PARALLAX公司提供的說(shuō)明文檔中提供了BS2程序,需要通過(guò)C語(yǔ)言轉(zhuǎn)譯,才可供ARM板識(shí)別。
首先注意的是PSCU板的默認(rèn)波特率為2400bps,所以在編寫串行通信程序時(shí),應(yīng)將串行通信的波特率設(shè)置為2400bps(具體見(jiàn)4.4節(jié)關(guān)于USART設(shè)置的介紹)。當(dāng)然本控制板亦可通過(guò)程序設(shè)置,將波特率改為38.4kbps,具體內(nèi)容下面會(huì)介紹到。此外,控制板接收的異步通信數(shù)據(jù)格式要求還有,正相,8個(gè)數(shù)據(jù)位,無(wú)奇偶校驗(yàn)位,1個(gè)或2個(gè)停止位。
其次控制板分為主副板,則對(duì)應(yīng)的舵機(jī)控制通道號(hào)即為0~31;即副板的通道號(hào)再原號(hào)基礎(chǔ)上加16即可。如果按序連接舵機(jī),可使編程變得較為簡(jiǎn)單,通過(guò)簡(jiǎn)單的數(shù)學(xué)關(guān)系進(jìn)行數(shù)據(jù)處理,但線路凌亂,看起來(lái)不是很美觀;本課題采用的是對(duì)稱連線,即選用通道號(hào)0~8,23~31;當(dāng)然,這樣編程相對(duì)就復(fù)雜一些。
最后關(guān)于主副板的界定還需提醒一句,由于硬件可能出現(xiàn)bug,實(shí)際上控制板可能通道號(hào)等沒(méi)有按照說(shuō)明書(shū)的來(lái),在調(diào)試過(guò)程中,可多試幾次,按照實(shí)際結(jié)果編程。本課題在調(diào)試過(guò)程中即出現(xiàn)了問(wèn)題,實(shí)際的主副板是顛倒的,且必須將副板與主控制板(STM32)連接才可使用。
㈡通信協(xié)議規(guī)則:
PSCU為用戶提供了多種控制功能,但每種控制字符串均是以!SC開(kāi)始,以0x0D結(jié)束,中間有間隔4個(gè)主控制字符,下面將一一介紹:
①位置命令——設(shè)置舵機(jī)的位置
控制字符串為:“!SC”
其中channel為通道號(hào),即前述的0~31;ramp speed為一字節(jié)值,用于舵機(jī)轉(zhuǎn)速控制,其變化范圍為0~63,且數(shù)值越大,轉(zhuǎn)速越??;lowbyte為舵機(jī)位置的低字節(jié),highbyte為舵機(jī)位置的高字節(jié)。通過(guò)改變lowbyte與highbyte值即可改變舵機(jī)位置,其值變化范圍為250~1250。
位置命令控制板最基本的命令,往往也是唯一用到的功能。通過(guò)此命令,可以實(shí)現(xiàn)舵機(jī)按要求的轉(zhuǎn)動(dòng),從而滿足行走等多功能要求。
②SBR——設(shè)置波特率
控制字符串為:“!SCSBR”
其中mode是用來(lái)設(shè)置波特率的,0代表2400bps,1代表38.4kbps。
控制板的默認(rèn)波特率為2400bps,無(wú)需設(shè)置,但如果需要使用38.4bps的波特率進(jìn)行通信時(shí),可使用該程序?qū)Σㄌ芈蔬M(jìn)行更改。
③RSP——返回位置值
控制字符串為:“!SCRSP”
其中channel為通道號(hào)。
與VER?一樣,需要進(jìn)行輸入輸出的設(shè)置,方能返回位置值,這對(duì)編程很有用處,可以通過(guò)讀取位置值,判斷其是否到位來(lái)實(shí)現(xiàn)延遲,精確性較高。本課題未使用。讀者可拓展功能。
④PSS——設(shè)置軟件口
控制字符串為: “!SCPSS”
其中mode為0代表0~15;1代表16~31。
可能由于板子的問(wèn)題,實(shí)際過(guò)程中并未起作用,當(dāng)控制板沒(méi)問(wèn)題時(shí),可以根據(jù)個(gè)人喜好設(shè)置控制板的端口號(hào),為編程提供便利。
⑤PSD——使端口無(wú)效
控制字符串為: “!SCPSD”
其中channel為通道號(hào)。
此功能與PSE功能配合使用,在適當(dāng)時(shí)候可能才生意想不到的效果。
⑥PSE——使端口恢復(fù)有效
控制字符串為: “!SCPSE”
其中channel為通道號(hào)。
此功能用于PSD后,用來(lái)恢復(fù)端口的正常使用。
其余的功能控制命令此處便不再贅述,因?yàn)橐话闱闆r下無(wú)法用到。
㈢C語(yǔ)言程序編寫簡(jiǎn)介:
由于說(shuō)明書(shū)中只提供了BS2程序,較難普及,需使用應(yīng)用較廣的C語(yǔ)言編寫。
從控制命令的格式可以看出,無(wú)論哪種方式,都是8字節(jié)的字符串,于是,可定義一個(gè)聯(lián)合體(結(jié)構(gòu)體亦可),來(lái)儲(chǔ)存這一串字節(jié):
typedef union _SERVO_PACKET {
char stream[8];
struct {
char CR : 8;
char B3 : 8;
char B2 : 8;
char B1 : 8;
char B0 : 8;
unsigned SC : 24;
} packet;
} SERVO_PACKET;
SERVO_PACKET pac;
并將三字節(jié)的SC初始化為0x215343或”!SC”,將CR初始化為0x0D。這樣在編寫各種控制命令函數(shù)時(shí),只要改變B0~B3的值即可。例,位置命令函數(shù):
void SendPacket(char RS, char Channel, int Position)
{ int i = 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ù)的定義為:
#define LOWBYTE(v) ((unsigned char) (v)) #define HIGHBYTE(v) ((unsigned char) (((unsigned int) (v)) >> 8))
其功能為獲取數(shù)值(位置值)的低八位與高八位。
這即可為編程提供很大方便。以此類推,其它命令的函數(shù)可以根據(jù)需要只要參考上述的位置命令函數(shù)編寫即可。在此基礎(chǔ)上以及之前用PSCI軟件調(diào)試出的舵機(jī)初始值,即可編寫舵機(jī)初始化程序了。
void Initservo(void)
{ int i=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ī)的初始位置值。
4 STM32開(kāi)發(fā)板介紹與程序編寫
本章主要介紹STM32開(kāi)發(fā)板的使用,以及各種應(yīng)用程序的編寫說(shuō)明。
4.1 STM32F107芯片簡(jiǎn)介
STM32系列是基于專為要求高性能、低成本、低功耗的嵌入式應(yīng)用專門設(shè)計(jì)的ARMCortex-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)用。
基于STM32F107的強(qiáng)大功能,以及數(shù)量眾多的I/O口,本課題選用STM32F107VC芯片作為總控制芯片。
4.2 軟件與編程初始準(zhǔn)備
在使用開(kāi)始學(xué)習(xí)使用STM32開(kāi)發(fā)板前,需要安裝兩個(gè)軟件:
RealViwe MDK(Keil μVision4)用于編程,在注冊(cè)是注意Target應(yīng)選擇ARM;
JLINK仿真器驅(qū)動(dòng)器,下載地址為:
http://www.segger.com/pub/jlink/Setup_JLinkARM_V402c.zip,用于燒寫程序。
安裝好軟件后,先新建一個(gè)程序文件夾,將Libraries與obj文件夾拷貝進(jìn)去,如果用到觸屏,還需包含Source文件夾(具體使用時(shí),可拷貝現(xiàn)成程序文件夾,修改主程序即可),打開(kāi)Keil4,新建一個(gè)工程,即可開(kāi)始編程,注意每寫一個(gè)H文件,都需要將#include“stm32f10x.h”置入文件的首部。
4.3 GPIO與AFIO設(shè)置與應(yīng)用
4.31 GPIO設(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í)為低電平。
傳輸模式包括:浮空輸入、輸入上拉、輸入下拉、模擬輸入、開(kāi)漏輸入、推挽式輸出、推挽式復(fù)用功能、開(kāi)漏式復(fù)用功能等模式。不同的輸入輸出模式可能會(huì)產(chǎn)生不同的結(jié)果。開(kāi)漏輸出,輸出端相當(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)電路)。通過(guò)選擇速度來(lái)選擇不同的輸出驅(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口配置為例:
void GPIO_Configuration(void)
{ GPIO_InitTypeDef GPIO_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)換成輸出口,遇到這種情況,如果像上述一樣編程,勢(shì)必會(huì)使程序顯得繁雜,此時(shí)可采用寫寄存器的方式來(lái)更換I/O口的傳輸模式。具體寫法如下:
#define DAT_OUT GPIOD->CRL=(GPIOD->CRL&(~(0x0000000F<<04)))|0x00000003<<04①
#define DAT_IN GPIOD->CRL=(GPIOD->CRL&(~(0x0000000F<<04)))|0x00000004<<04②
其中第一行將PD1設(shè)置為推挽輸出模式,第二行將PD1設(shè)置為浮空輸入模式。在使用時(shí),只需在程序前,加入一行DAT_OUT;或者DAT_IN來(lái)切換PD1輸入輸出。當(dāng)書(shū)寫其它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)行初始化,即開(kāi)啟系統(tǒng)時(shí)鐘,例如,使能PA口:
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE)//使能APB2總線外設(shè)時(shí)鐘。
這樣就可以配置完整I/O口了。
當(dāng)學(xué)會(huì)配置好I/O口后,根據(jù)開(kāi)發(fā)板中LED燈得I/O口(如圖4.1),即可書(shū)寫一個(gè)簡(jiǎn)單的控制LED等閃爍的程序。
圖4.1 LED燈電路圖
程序?yàn)?
void ledflash(void)
{ GPIO_SetBits(GPIOD,GPIO_Pin_2); //LED1
delay_ms(1000);
GPIO_ResetBits(GPIOD,GPIO_Pin_2);
delay_ms(1000);
GPIO_SetBits(GPIOD,GPIO_Pin_3); //LED2
delay_ms(1000);
GPIO_ResetBits(GPIOD,GPIO_Pin_3);
delay_ms(1000);
GPIO_SetBits(GPIOD,GPIO_Pin_4); //LED3
delay_ms(1000);
GPIO_ResetBits(GPIOD,GPIO_Pin_4);
delay_ms(1000);
GPIO_SetBits(GPIOD,GPIO_Pin_7); //LED4
delay_ms(1000);
GPIO_ResetBits(GPIOD,GPIO_Pin_7);
delay_ms(1000); }
此程序的功能是,使LED燈依次閃爍。
4.32 AFIO--------I/O口重映射
為了使不同器件封裝的外設(shè)I/O口功能數(shù)量達(dá)到最優(yōu),可以把一些復(fù)用功能重新映射到其他一些腳上(可參照4.4節(jié)表4.1)??赏ㄟ^(guò)軟件編程來(lái)實(shí)現(xiàn)。當(dāng)使用了重映射功能后,原始引腳便不再具備原先設(shè)定的功能。以USART1為例,原先輸出口為PA9,經(jīng)重映射后,輸出口則改為PB6,而PA9則可作為其它外設(shè)的輸入輸出口使用。
具體使用方法為:
首先,開(kāi)啟AFIO時(shí)鐘,如下:
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
然后,在I/O口配置之前,使能復(fù)用:
GPIO_PinRemapConfig(GPIO_Remap_USART1,ENABLE);
最后,按規(guī)定配置I/O口。
由于本項(xiàng)目使用的STM32功能較簡(jiǎn)單,所以并未用到重映射功能,但卻要開(kāi)啟AFIO時(shí)鐘,具體原因在4.5節(jié)講中斷時(shí)會(huì)提到。
4.4USART設(shè)置與應(yīng)用
USART 即STM32F10x處理器的通用同步異步收發(fā)器單元。每個(gè)STM32板提供2~5個(gè)獨(dú)立的異步串行通信接口,可工作于中斷和DMA模式兩種模式。USART單元支持同步單工、雙工通信和半雙工單線通信,也支持LIN(Local Interconnection Network)、智能卡協(xié)議和IrDA(紅外)SIR ENDEC規(guī)范,以及調(diào)制解調(diào)器(CTS/RTS)操作,并允許多處理器通信。
USART的配置很簡(jiǎn)單,用起來(lái)也較方便。以配置查詢方式的USART1為例,如下:
void USART1_Configuration(void)
{ USART_InitTypeDef USART_InitStructure; //串口設(shè)置恢復(fù)默認(rèn)參數(shù)
USART_ClockInitTypeDef USART_ClockInitStructure;
//初始化參數(shù)設(shè)置
USART_InitStructure.USART_BaudRate = 2400; //波特率2400
USART_InitStructure.USART_WordLength = USART_WordLength_8b; //字長(zhǎng)8位
USART_InitStructure.USART_StopBits = USART_StopBits_1; //1位停止字節(jié)
USART_InitStructure.USART_Parity = USART_Parity_No; //無(wú)奇偶校驗(yàn)
USART_InitStructure.USART_HardwareFlowControl= USART_HardwareFlowControl_None; //無(wú)流控制
//打開(kāi)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)串口}
前面提到過(guò)在配置異步通信時(shí),需要注意波特率的配置,對(duì)于PSCU板,其所需波特率為2400bps,但是4.8節(jié)提到的無(wú)線通信傳感器(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口。具體見(jiàn)下表:
USART
PIN
GPIO
AFIO
USART1
TX
PA9
PB6
RX
PA10
PB7
USART2
TX
PA2
PD5
RX
PA3
PD6
USART3
TX
PB10
PC10(PD8)
RX
PB11
PC11(PD9)
表4.1 串行通信GPIO口及復(fù)用GPIO口
注:表中的AFIO列為復(fù)用I/O口
配置完USART后,便是如何使用了,這包括數(shù)據(jù)發(fā)送和接收。
㈠發(fā)送單個(gè)字節(jié)
函數(shù)一:char ser_putbyte (char data)
{USART_SendData(USART1, (unsigned char) data);
while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);
USART1->DR = (data & 0xFF);
return (data);}
函數(shù)二:int SendChar (int ch)
{ USART_SendData(USART1, (unsigned char) ch);
while (!(USART1->SR & USART_FLAG_TXE));
return (ch); }
上述兩個(gè)函數(shù)的功能等同,在寫程序時(shí)可以隨意調(diào)用,例如3.4節(jié)提到的SendPacket()函數(shù)便調(diào)用了上述的函數(shù)一。
㈡接收一個(gè)字節(jié)
u8 RByte(void)
{ u8 out=0;
while(USART_GetFlagStatus(USART1, USART_FLAG_RXNE) == RESET){} //等待接收完畢
out = (USART_ReceiveData(USART1)); //接收一個(gè)字節(jié)
return out; }
該函數(shù)用于接收單個(gè)字節(jié),在無(wú)線通信時(shí)可用到。
㈢發(fā)送一個(gè)字符串
void Print_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è)字符串
void SerialIn(u8 *buf,u8 len)
{ unsigned char i;
for (i = 0; i < len; i++)
buf[i] = RByte(); }
同樣,當(dāng)需要連續(xù)發(fā)送多個(gè)字節(jié)數(shù)據(jù)時(shí),則可選用該函數(shù)。
上面提到的都是USART1的設(shè)置以及拓展功能函數(shù)的書(shū)寫。而其它串口通信的設(shè)置與U1一致,功能函數(shù)則只需將U1換成U2或U3即可。
由于主板的問(wèn)題,本項(xiàng)目中并未使用U2、U3來(lái)實(shí)現(xiàn)其它串口通信,而是將所有的串口通信均由U1來(lái)實(shí)現(xiàn),這也是權(quán)宜之計(jì),即采用分時(shí)復(fù)用的原理。
具體說(shuō)來(lái),就是發(fā)聲傳感器和無(wú)線傳感器都需要通過(guò)異步傳輸來(lái)與處理器通信。對(duì)于每個(gè)傳感器以及PSCU,它們能夠識(shí)別的信號(hào)是由特定字符串組成的。這樣,只要將PA9、PA10口多引出幾個(gè)引腳,分別接到傳感器以及PSCU的相應(yīng)口即可,在傳輸指令時(shí),分時(shí)傳送,對(duì)于無(wú)法識(shí)別的字符串,則不處理,這樣便解決了串口不夠的問(wèn)題。
如果要實(shí)現(xiàn)搶占,則將它們配置成中斷模式即可,并配置好優(yōu)先級(jí)。
4.5 外部中斷設(shè)置與應(yīng)用
當(dāng)主控制板遇到異常時(shí),便會(huì)觸發(fā)中斷,并進(jìn)行處理。NVIC,中文叫做嵌套矢量中斷控制器,是用來(lái)處理中斷的對(duì)于STM32F107的普通用戶來(lái)說(shuō),只要掌握EXTI線中斷,USART中斷以及TIM中斷即可。下面僅對(duì)EXTI中斷作簡(jiǎn)略介紹。
外部中斷/事件控制器(EXTI)由19個(gè)產(chǎn)生事件/中斷請(qǐng)求的邊沿檢測(cè)器組成。每個(gè)輸入線可獨(dú)立地配置輸入類型和對(duì)應(yīng)的觸發(fā)事件(上升沿、下降沿或雙邊沿觸發(fā))每個(gè)輸入線都可以被獨(dú)立地屏蔽,由掛起寄存器保持著狀態(tài)線的中斷要求。
如果要產(chǎn)生外部中斷,首先必須配置好并激活中斷線。配置內(nèi)容包括:根據(jù)需要的邊沿檢測(cè)設(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ù)如下:
void NVIC_Configuration(void)
{ NVIC_InitTypeDef NVIC_InitStructure; ①
#ifdef VECT_TAB_RAM
NVIC_SetVectorTable(NVIC_VectTab_RAM,0x0); ②
#else
NVIC_SetVectorTable(NVIC_VectTab_FLASH,0x0); ③
#endif
NVIC_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í)際操作中,可能無(wú)法編譯,應(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為例,由開(kāi)發(fā)板原理圖可知,PA0可直接配置為EXTI0中斷,無(wú)需電路設(shè)計(jì)。如有需要,也可按照?qǐng)D4.3所示,配置其它中斷。
圖4.3 PA0中斷線電路
配置程序?yàn)椋?
void EXTI_Configuration(void)
{ EXTI_InitTypeDef EXTI_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)鍵在于使用,下面為通過(guò)EXTI0中斷來(lái)控制LED燈的程序:
void EXTI0_IRQHandler(void)
{ if(EXTI_GetITStatus(EXTI_Line0)!= RESET)
{ ledflash();
鏈接地址:http://www.3dchina-expo.com/p-6691478.html