《六腳爬蟲機器人機械結構設計和程序設計.doc》由會員分享,可在線閱讀,更多相關《六腳爬蟲機器人機械結構設計和程序設計.doc(64頁珍藏版)》請在裝配圖網(wǎng)上搜索。
摘要
本文詳細介紹了六腳爬蟲機器人的機械結構以及控制程序的編寫。
機械結構采用了對稱式設計,結構簡單;其行走功能由六只腳、18個舵機實現(xiàn),自由度較高,穩(wěn)定性、靈活性較好。
控制程序的主體是C語言。包括基本步態(tài)的編寫,以及傳感器的在機器人上的高級應用,這樣,機器人在滿足基本行走運動的同時,也能感知外界環(huán)境,并通過控制器對接收到的外界信號進行處理,并控制機器人運動。
關鍵詞: 對稱式結構,舵機控制器,步態(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課題來源 - 1 -
1.2本課題的目的及其意義 - 1 -
1.3國內(nèi)外發(fā)展現(xiàn)狀 - 1 -
1.4本課題的研究內(nèi)容 - 5 -
2 機械結構設計介紹 - 6 -
2.1 功能需求與分析 - 6 -
2.2 材料選擇與結構設計介紹 - 6 -
3 舵機控制板原理與應用 - 9 -
3.1 舵機原理介紹 - 9 -
3.2 舵機控制板原理介紹 - 10 -
3.3 如何使用舵機控制板 - 11 -
3.4 控制板程序編寫 - 14 -
4 STM32開發(fā)板介紹與程序編寫 - 18 -
4.1 STM32F107芯片簡介 - 18 -
4.2 軟件與編程初始準備 - 18 -
4.3 GPIO與AFIO設置與應用 - 18 -
4.31 GPIO設置與應用…………………………………………………………………………………………..18
4.32 AFIO-----I/O口重映射…………………………………………………………………………………...22
4.4 USART設置與應用 - 22 -
4.5外部中斷設置與應用 - 26 -
4.6 系統(tǒng)時鐘設置與應用 - 29 -
4.61 系統(tǒng)時鐘簡介與應用…………………………………………………………………………………..29
4.62 定時器配置……………………………………………………………………………………………………31
4.7 機器人行走步態(tài)程序編寫 - 32 -
4.71 機器人行走步態(tài)簡介……………………………………………………………………………………33
4.72 三腳步態(tài)……………………………………………………………………………………………………….35
4.73 四腳步態(tài)………………………………………………………………………………………….……………37
4.74 單腳(波動)步態(tài)……………………………………………………………………………………....38
4.75 轉(zhuǎn)彎與橫爬步態(tài)…………………………………………………………………………………………….40
4.8 多傳感器應用與程序編寫 - 43 -
4.81 指南針傳感器……………………………………………………………………………………………….43
4.82 紅外、光敏傳感器……………………………………………………………………………………….45
4.83 柔性力傳感器……………………………………………………………………………………………….46
4.84 溫濕度、發(fā)聲、射頻識別(RFID)傳感器………………………………………………..48
4.85 無線(Zigbee)傳感器………………………………………………………………………………..49
4.86 超聲傳感器……………………………………………………………………………………………………52
5總結 - 55 -
致謝 - 56 -
參考文獻 - 57 -
1 緒論
1.1課題來源
本項目來源于華中科技大學與伍斯特理工學院合作的WPI項目。
1.2本課題的目的及其意義
機器人是高級整合控制論、機械電子、計算機、材料和仿生學的產(chǎn)物。現(xiàn)在,機器人已經(jīng)發(fā)展到一個全新階段,各種機器人應運而生,從簡單地追求功能到神似,到個性化;從單單發(fā)展工業(yè)機器人到工業(yè)、家用機器人全面開花,并取得了長足進步。
六腳機器人作為行走機器人的一種,具有結構簡單,穩(wěn)定性好等優(yōu)點,而本課題也并未在很高深的機器人理論花大量功夫,而更多地著眼于為大專院校提供機器人教學平臺,或者用于科技館展覽。
本課題所設計的機器人最大的特點是:理論通俗易懂、操作方便、便于二次開發(fā)。對于一些入門者(初步掌握控制論、機械設計、機械電子只是)來說,很容易便能被引領入機器人研究的殿堂。
1.3 國內(nèi)外發(fā)展現(xiàn)狀
對于仿生機器人,尤其是多足機器人,國內(nèi)外均有大量研究。
1990年,美國卡內(nèi)基梅隆大學研制出用于外星探測的六腳步行機器人AMBLER。該機器人采用了新型的“腿機構",并由一臺32位的處理機來規(guī)劃系統(tǒng)運動路線、制運動和監(jiān)視系統(tǒng)的狀態(tài)。但由于體積和質(zhì)量太大,最終沒被用于行星探測計劃。
1993年,卡內(nèi)基梅隆大學開發(fā)出有纜的八足步行機器人DANTE,用于對南極的埃里伯斯火山進行了考察,其改進型也在實際中得到了應用。1994年二代對距離安克雷奇145km的斯伯火山進行了考察,并傳回了各種數(shù)據(jù)及圖像。
日本對多足步行機的研究從20世紀80年代開始,并不斷進行著技術創(chuàng)新,隨著計算機和控制技術的發(fā)展,其機械結構由復雜到簡單,其功能由單一功能到組合功能,并已研究出各種類型的步行機。主要有四足步行機、爬壁機器人、腿輪分離型步行機器人和手腳統(tǒng)一型步行機器人。
1994年,日本電氣通信大學的木村浩等研制成功四足步行機器人Patrush二代。該機器人用兩個微處理機控制,采用直流伺服電機驅(qū)動,每個關節(jié)安裝了一個光電碼盤,每只腳安裝了兩個微開關,采用基于神經(jīng)振蕩子模型CPG的控制策略,能夠?qū)崿F(xiàn)不規(guī)則地面的自適應動態(tài)步行,顯示了生物激勵控制對未知的不規(guī)則地面有自適應能力的特點。
2000~2003年,木村浩等又研制成功四足步行機器人Tekken。該機器人用一臺PC機系統(tǒng)控制,用瑞士Maxon直流伺服電機驅(qū)動,能適應中等不規(guī)則表面的自適應步行。
我國對于多足機器人的研究起步則較晚。
1989年,北京航空航天大學在張啟先教授的指導下,孫漢旭博士進行了四足步行機的研究,試制成功一臺四足步行機。錢晉武博士研究地壁兩用六腳步行機器人,并進行了步態(tài)和運動學方面的研究。
1990年中國科學院沈陽自動化研究所研制出全方位六腳步行機,不僅能在平地步行,還能上樓梯。
1991年,上海交通大學馬培蓀等研制出JTUWM 系列四足步行機器人。
2000年,馬培蓀等對第一代形狀記憶合金SMA驅(qū)動的微型六腳機器人進行改進,開發(fā)出具有全方位運動能力的微型雙三足步行機器人其每條腿的自由度變?yōu)?個自由度,總共6個自由度。
2003年哈爾濱工程大學的孟慶鑫、袁鵬等進行了兩棲仿生機器蟹的研究,通過研究多足步行機的單足周期運動規(guī)律,提出適合于兩棲仿生機器蟹的單足運動路線規(guī)劃方法,建立了生成周期運動的神經(jīng)振蕩子模型。
目前市場上幾款六腳機器人對比如下:
(一)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一代機器人使用的編程軟件為Parallax公司提供的教育發(fā)展版芯片。圖1.1為Phoenix公司提供的六腳機器人,圖1.2則為Depush公司的六腳機器人一代外形,其每個腳僅有兩個自由度。
圖1.1 Phoenix Hexapod
圖1.2 DEPUSH HexCrawler 1.0
1.4本課題的研究內(nèi)容
六腳機器人基本結構的設計,首先使之能夠?qū)崿F(xiàn)三腳步態(tài)、四腳步態(tài)、波動步態(tài)等,以滿足行走要求;然后,能夠感知外界環(huán)境的變化,實現(xiàn)避障報警等功能;最后,實現(xiàn)對機器人的遠距離控制。具體要求為:
設計機器人機械結構,使其可以完成前進,后退,左轉(zhuǎn),右轉(zhuǎn),側移,扭動身軀等簡單動作;可以完成抬腳,簡單舞蹈等動作;
1、編寫機器人各種基本動作的軟件代碼,使其能完成以上動作;
2、機器人可以接受電腦無線控制,編寫相應無線控制程序;
3、機器人可感知外界環(huán)境,編寫相應傳感器處理程序;
4、對所有程序進行綜合處理,協(xié)調(diào)各程序之間的關系。
2 六腳機器人機械結構設計介紹
2.1 功能需求與分析
作為六腳仿生機器人,在追求神似的同時,關鍵在于能否像爬蟲一樣完成各種行走動作。
本課題對機械結構的要求不高,但需要滿足下面幾點:靈活度高、穩(wěn)定性好、能夠?qū)崿F(xiàn)多足機器人的基本步態(tài)。針對這幾點,同時按照德普士公司的要求,再參照目前市面上存在的六腳仿生機器人,最終擬定的機械結構設計方案為:在DEPUSH HexCrawler 1.0(圖1.2)的基礎上每只腳增加一個舵機,即將自由度由兩個提升為三個。
2.2材料選擇與結構設計介紹
根據(jù)目前市面上的六腳仿真機器人,本課題選用5052鋁合金作為機器人的主要材料,這樣機器人既能滿足強度要求,也能滿足輕便性要求。同時,對外表進行烤漆處理,顯得厚實而穩(wěn)重,富有質(zhì)感。如圖2.1為機械結構的總三維圖。
圖2.1 六腳機器人三維總圖
機器人整體上采用對稱式結構,由六只腳和底架(身體)組成。每只腳有三個關節(jié),每個關節(jié)處為采用舵機連接,可在固定平面內(nèi)旋轉(zhuǎn)180,如圖2.2所示。
其中舵機1控制機器人腳前后擺動;舵機2控制機器人上下擺動;舵機3控制機器人內(nèi)外伸縮。三個舵機配合即可實現(xiàn)機器人的走動。
圖2.2 六腳機器人單腳結構圖
機器人身體(圖2.3)、腳(圖2.2)上均布滿各種鏤空圖案,主要有兩點作用:一、減輕機器人重量;二、增加機器人的美觀度。
由于機器人的完全對稱性結構,其前后由認為設定,即圖2.1中Leg1、Leg4在前,Leg3、Leg6在后。
圖2.3 六腳機器人底架結構圖
機器人的主要尺寸為:
機器人全長:500.0mm;
底架(身體寬):228.0mm;
舵機1(Leg1)距底架最前方距離:60.0mm;
Leg1與Leg2距離:195.0mm;
Leg1與Leg3距離:390.0mm;
每只腳上舵機2與舵機3距離:120.0mm;
舵機3與腳底距離:150.0mm。
3 舵機及舵機控制板原理與應用
本章主要介紹舵機以及舵機控制板(PSCU)的原理、使用方法與程序編寫。
3.1 舵機原理介紹
舵機是一個通過輸出軸的轉(zhuǎn)動來控制物體轉(zhuǎn)動的裝置。它在特定編碼的驅(qū)使下可以轉(zhuǎn)動到工作范圍內(nèi)的任意給定位置。因為它的輕便,位置控制簡易且精確,在機器人中使用尤多。多舵機的協(xié)調(diào)工作可滿足機器人的多自由度要求。
舵機可以實現(xiàn)0~180的旋轉(zhuǎn),當軸處于正確位置時,舵機將停止運動;當所在位置不對時,電路則驅(qū)動電機運轉(zhuǎn)到需求位置。
舵機是采用比例調(diào)節(jié)方式控制速度。當舵機轉(zhuǎn)動的距離大時,則加載在舵機上的能量就大,反之亦然。
而舵機的轉(zhuǎn)動角度控制是由加載在控制線上的脈沖周期完成的,即所謂的脈沖編碼調(diào)制。舵機設定為每隔20ms接受一個脈沖,這樣的話,實際脈沖長度就可用來控制舵機轉(zhuǎn)動的角度。如圖3.1,例如1.5ms的脈沖可使舵機轉(zhuǎn)動90。
圖3.1 舵機轉(zhuǎn)角與脈沖周期關系圖
當舵機安裝好后,需要獲取其初始位置值,為編程做準備,具體可見3.3節(jié)關于PSCI軟件的介紹。
3.2 舵機控制板原理介紹
由上述機械結構介紹可知,本六腳機器人是通過控制18個舵機來實現(xiàn)機器人的運動的。但如何協(xié)調(diào)好各舵機的動作,讓其滿足功能需求?這就需要用到舵機控制板。
舵機控制板按控制舵機數(shù)目(接口數(shù))的多少,可分為8路舵機控制器,16路舵機控制器,32路舵機控制器等等??紤]到成本以及控制舵機的數(shù)量,本課題采用兩塊16路舵機控制器串聯(lián)的方式來控制舵機。選用型號為PARALLAX公司提供的Propeller Servo Controller USB(#28830,簡稱PSCU)。如圖3.2所示:
圖3.2 舵機控制板
PSCU具有下述多項特點:
①可串聯(lián)兩塊控制板實現(xiàn)32路舵機控制;
② 獨立的螺旋式接線柱為控制板供電,舵機則可通過開關控制關停;
③ 其所用固件開放源代碼;
④ 可通過USB接口或者串行通信接口編程;
⑤ 舵機速度可控。
PSCU規(guī)格及性能:
① 電源要求:邏輯電平5VDC@~60mA,4.8~7.5VDC控制舵機;
② 通信:異步串行通信@2400bps或者38.4kbps(TTL或USB);
③ 工作溫度:32~158F(0~70C);
④ 尺寸:2.26x1.80x0.65in(57.3x45.7x16.5mm);
3.3如何使用舵機控制板
在使用控制板前,需通過螺旋式接線柱給控制板提供4.8~7.5V的直流電,同時為使舵機運動,還需給舵機提供5V的直流電。此項可通過USB接口(如圖3.3)或者通過舵機控制板左上方的Serial In 處的杜邦針供電(TTL電平,如圖3.4)。
圖3.3 PSCU-USB供電電路連接圖
圖3.4 PSCU-主控制板供電電路連接圖
USB調(diào)試:
①安裝FTDI VCP驅(qū)動(下載地址:www.parallax.com/usbdrivers);
②安裝PSCI軟件(訪問網(wǎng)址www.parallax.com,并搜索28823)。雙擊軟件圖標,即可獲得圖3.5所示,連接好USB線,在界面上選擇COM口,獲取PSC版本,即可使用。
圖3.5 PSCI控制界面
圖中每個channel的進度條,可發(fā)現(xiàn)對應舵機會向相應方向發(fā)生一定度數(shù)的旋轉(zhuǎn)。這可用來進行舵機控制調(diào)試,從而獲取舵機位置值,來書寫步態(tài)。注意:圖中數(shù)據(jù)在編入ARM程序中時,應先除以2倍,才是實際數(shù)據(jù),即圖中的中心出1500對應實際的750。
更多功能可參照PARALLAX公司提供的Propeller Servo Controller USB說明文檔。
當使用雙塊板時,其連接方式為:首先將主板的Serial In(兩排,選上排)引出按高低電平信號線要求插在主控制板(STM32板)上,其中紅色線接5V電源,黑色線接地,白色線接信號線,即PA9。然后將副板的Serial In(上排)引出插在主板的Serial In處(下排)。最后通上電源即可。
了解了PSCI的基本功能,并按要求連接好電路后,首要做的就是將舵機位置的初始值找出。通過拖動進度條,并觀察機器人各腿的位置,從而確定舵機初值。筆者提供的舵機初始值均為六腳與身體垂直時的值,且2、3關節(jié)夾角近似為90。
本項目采用的事Hi-Tec公司生產(chǎn)的HS-322HD舵機,如圖3.6。
圖3.6 HS-322HD舵機
其主要技術參數(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
■計算電流:0.35A
3.4 控制板程序編寫
㈠基本工作準備與注意事項:
前述工作準備停當,即可開始程序的編寫。PARALLAX公司提供的說明文檔中提供了BS2程序,需要通過C語言轉(zhuǎn)譯,才可供ARM板識別。
首先注意的是PSCU板的默認波特率為2400bps,所以在編寫串行通信程序時,應將串行通信的波特率設置為2400bps(具體見4.4節(jié)關于USART設置的介紹)。當然本控制板亦可通過程序設置,將波特率改為38.4kbps,具體內(nèi)容下面會介紹到。此外,控制板接收的異步通信數(shù)據(jù)格式要求還有,正相,8個數(shù)據(jù)位,無奇偶校驗位,1個或2個停止位。
其次控制板分為主副板,則對應的舵機控制通道號即為0~31;即副板的通道號再原號基礎上加16即可。如果按序連接舵機,可使編程變得較為簡單,通過簡單的數(shù)學關系進行數(shù)據(jù)處理,但線路凌亂,看起來不是很美觀;本課題采用的是對稱連線,即選用通道號0~8,23~31;當然,這樣編程相對就復雜一些。
最后關于主副板的界定還需提醒一句,由于硬件可能出現(xiàn)bug,實際上控制板可能通道號等沒有按照說明書的來,在調(diào)試過程中,可多試幾次,按照實際結果編程。本課題在調(diào)試過程中即出現(xiàn)了問題,實際的主副板是顛倒的,且必須將副板與主控制板(STM32)連接才可使用。
㈡通信協(xié)議規(guī)則:
PSCU為用戶提供了多種控制功能,但每種控制字符串均是以!SC開始,以0x0D結束,中間有間隔4個主控制字符,下面將一一介紹:
①位置命令——設置舵機的位置
控制字符串為:“!SC”
其中channel為通道號,即前述的0~31;ramp speed為一字節(jié)值,用于舵機轉(zhuǎn)速控制,其變化范圍為0~63,且數(shù)值越大,轉(zhuǎn)速越??;lowbyte為舵機位置的低字節(jié),highbyte為舵機位置的高字節(jié)。通過改變lowbyte與highbyte值即可改變舵機位置,其值變化范圍為250~1250。
位置命令控制板最基本的命令,往往也是唯一用到的功能。通過此命令,可以實現(xiàn)舵機按要求的轉(zhuǎn)動,從而滿足行走等多功能要求。
②SBR——設置波特率
控制字符串為:“!SCSBR”
其中mode是用來設置波特率的,0代表2400bps,1代表38.4kbps。
控制板的默認波特率為2400bps,無需設置,但如果需要使用38.4bps的波特率進行通信時,可使用該程序?qū)Σㄌ芈蔬M行更改。
③RSP——返回位置值
控制字符串為:“!SCRSP”
其中channel為通道號。
與VER?一樣,需要進行輸入輸出的設置,方能返回位置值,這對編程很有用處,可以通過讀取位置值,判斷其是否到位來實現(xiàn)延遲,精確性較高。本課題未使用。讀者可拓展功能。
④PSS——設置軟件口
控制字符串為: “!SCPSS”
其中mode為0代表0~15;1代表16~31。
可能由于板子的問題,實際過程中并未起作用,當控制板沒問題時,可以根據(jù)個人喜好設置控制板的端口號,為編程提供便利。
⑤PSD——使端口無效
控制字符串為: “!SCPSD”
其中channel為通道號。
此功能與PSE功能配合使用,在適當時候可能才生意想不到的效果。
⑥PSE——使端口恢復有效
控制字符串為: “!SCPSE”
其中channel為通道號。
此功能用于PSD后,用來恢復端口的正常使用。
其余的功能控制命令此處便不再贅述,因為一般情況下無法用到。
㈢C語言程序編寫簡介:
由于說明書中只提供了BS2程序,較難普及,需使用應用較廣的C語言編寫。
從控制命令的格式可以看出,無論哪種方式,都是8字節(jié)的字符串,于是,可定義一個聯(lián)合體(結構體亦可),來儲存這一串字節(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ù)時,只要改變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ā)送單個字節(jié)}
其中LOWBYTE()、HIGHBYTE()函數(shù)的定義為:
#define LOWBYTE(v) ((unsigned char) (v)) #define HIGHBYTE(v) ((unsigned char) (((unsigned int) (v)) >> 8))
其功能為獲取數(shù)值(位置值)的低八位與高八位。
這即可為編程提供很大方便。以此類推,其它命令的函數(shù)可以根據(jù)需要只要參考上述的位置命令函數(shù)編寫即可。在此基礎上以及之前用PSCI軟件調(diào)試出的舵機初始值,即可編寫舵機初始化程序了。
void Initservo(void)
{ int i=0;
for(i=0;i<18;i++)
{ SendPacket(15,channelno[i],initposi[i]); }
delay_ms(100);
}
其中,15為舵機轉(zhuǎn)速,channelno[18]數(shù)組儲存舵機號,initposi[18]數(shù)組儲存相應舵機的初始位置值。
4 STM32開發(fā)板介紹與程序編寫
本章主要介紹STM32開發(fā)板的使用,以及各種應用程序的編寫說明。
4.1 STM32F107芯片簡介
STM32系列是基于專為要求高性能、低成本、低功耗的嵌入式應用專門設計的ARMCortex-M3內(nèi)核。在STM32F103、STM32F105的基礎上,意法半導體公司又推出了一款性能較強的全新STM32互連型(Connectivity)系列微控制器中產(chǎn)品——STM32F107。該芯片集成了各種高性能工業(yè)標準接口,且STM32不同型號產(chǎn)品在引腳和軟件上具有完美的兼容性,可以輕松適應更多的應用。
基于STM32F107的強大功能,以及數(shù)量眾多的I/O口,本課題選用STM32F107VC芯片作為總控制芯片。
4.2 軟件與編程初始準備
在使用開始學習使用STM32開發(fā)板前,需要安裝兩個軟件:
RealViwe MDK(Keil μVision4)用于編程,在注冊是注意Target應選擇ARM;
JLINK仿真器驅(qū)動器,下載地址為:
http://www.segger.com/pub/jlink/Setup_JLinkARM_V402c.zip,用于燒寫程序。
安裝好軟件后,先新建一個程序文件夾,將Libraries與obj文件夾拷貝進去,如果用到觸屏,還需包含Source文件夾(具體使用時,可拷貝現(xiàn)成程序文件夾,修改主程序即可),打開Keil4,新建一個工程,即可開始編程,注意每寫一個H文件,都需要將#include“stm32f10x.h”置入文件的首部。
4.3 GPIO與AFIO設置與應用
4.31 GPIO設置與應用
STM32F10x處理器上共有7個I/O端口:A、B、C、D、E、F、G,每個端口有16個引腳。每個GPIO端口都對應2個32位配置寄存器(GPIOx_CRL,GPIOx_CRH),2個32位數(shù)據(jù)寄存器(GPIOx_IDR,GPIOx_ODR)、1個32位置位/復位寄存器(GPIOx_BSRR)、1個16位復位寄存器(GPIOx_BRR)和1個32位鎖定寄存器(GPIOx_LCKR)。
I/O口設置包括端口號設置,傳輸方式設置,輸出速度設置。
這三種設置是相互關聯(lián)的,有些 I/O口只能用作輸入口,有些只能用作輸出口,這是由于在實際的電路中,有些I/O口采取了固化措施,設定了特定功能,例如PE的所有I/O口都被用于觸摸屏,不能額外分配;PA0口作為輸入口時,正常時為高電平,發(fā)生中斷時為低電平。
傳輸模式包括:浮空輸入、輸入上拉、輸入下拉、模擬輸入、開漏輸入、推挽式輸出、推挽式復用功能、開漏式復用功能等模式。不同的輸入輸出模式可能會產(chǎn)生不同的結果。開漏輸出,輸出端相當于三極管的集電極,要得到高電平需上拉電阻,適合于做電流型的驅(qū)動;推挽輸出可以輸出高低電平,連接數(shù)字器件。但在本應用中,均連接數(shù)字器件,故只需將輸入模式設置為浮空輸入,輸出模式設置為推挽輸出即可。
當為輸出模式時,有3種輸出速度可選(2MHz、10MHz和50MHz),這個速度是指I/O口驅(qū)動電路的響應速度而非輸出信號的速度,后者與程序有關(芯片內(nèi)部在I/O口的輸出部分安排了多個不同響應速度的輸出驅(qū)動電路,用戶可以根據(jù)需要選擇合適的驅(qū)動電路)。通過選擇速度來選擇不同的輸出驅(qū)動模塊,達到最佳的噪聲控制和降低功耗的目的。高頻的驅(qū)動電路,噪聲也高,當不需要高的輸出頻率時,請選用低頻驅(qū)動電路,這樣非常有利于提高系統(tǒng)的EMI性能。當然如果要輸出較高頻率的信號,但卻選用了較低頻率的驅(qū)動模塊,很可能會得到失真的輸出信號。
以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口,下面會一一介紹。
因為程序需求,往往一個I/O口即要被配置成輸入口,同時也要轉(zhuǎn)換成輸出口,遇到這種情況,如果像上述一樣編程,勢必會使程序顯得繁雜,此時可采用寫寄存器的方式來更換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設置為推挽輸出模式,第二行將PD1設置為浮空輸入模式。在使用時,只需在程序前,加入一行DAT_OUT;或者DAT_IN來切換PD1輸入輸出。當書寫其它I/O口的程序時,只需將GPIOD換成相應I/O口,如果端口號為0~7,則只需將<<右邊的04改成端口號*4的積,例如PA0則為00,如果端口號為8~15,則需將CRL換成CRH,同時<<右邊的04改成(端口號-8)*4,例如PB13則為20。
在程序中配置I/O口之前,還需對I/O口進行初始化,即開啟系統(tǒng)時鐘,例如,使能PA口:
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE)//使能APB2總線外設時鐘。
這樣就可以配置完整I/O口了。
當學會配置好I/O口后,根據(jù)開發(fā)板中LED燈得I/O口(如圖4.1),即可書寫一個簡單的控制LED等閃爍的程序。
圖4.1 LED燈電路圖
程序為:
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口重映射
為了使不同器件封裝的外設I/O口功能數(shù)量達到最優(yōu),可以把一些復用功能重新映射到其他一些腳上(可參照4.4節(jié)表4.1)??赏ㄟ^軟件編程來實現(xiàn)。當使用了重映射功能后,原始引腳便不再具備原先設定的功能。以USART1為例,原先輸出口為PA9,經(jīng)重映射后,輸出口則改為PB6,而PA9則可作為其它外設的輸入輸出口使用。
具體使用方法為:
首先,開啟AFIO時鐘,如下:
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
然后,在I/O口配置之前,使能復用:
GPIO_PinRemapConfig(GPIO_Remap_USART1,ENABLE);
最后,按規(guī)定配置I/O口。
由于本項目使用的STM32功能較簡單,所以并未用到重映射功能,但卻要開啟AFIO時鐘,具體原因在4.5節(jié)講中斷時會提到。
4.4USART設置與應用
USART 即STM32F10x處理器的通用同步異步收發(fā)器單元。每個STM32板提供2~5個獨立的異步串行通信接口,可工作于中斷和DMA模式兩種模式。USART單元支持同步單工、雙工通信和半雙工單線通信,也支持LIN(Local Interconnection Network)、智能卡協(xié)議和IrDA(紅外)SIR ENDEC規(guī)范,以及調(diào)制解調(diào)器(CTS/RTS)操作,并允許多處理器通信。
USART的配置很簡單,用起來也較方便。以配置查詢方式的USART1為例,如下:
void USART1_Configuration(void)
{ USART_InitTypeDef USART_InitStructure; //串口設置恢復默認參數(shù)
USART_ClockInitTypeDef USART_ClockInitStructure;
//初始化參數(shù)設置
USART_InitStructure.USART_BaudRate = 2400; //波特率2400
USART_InitStructure.USART_WordLength = USART_WordLength_8b; //字長8位
USART_InitStructure.USART_StopBits = USART_StopBits_1; //1位停止字節(jié)
USART_InitStructure.USART_Parity = USART_Parity_No; //無奇偶校驗
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時鐘配置
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); //啟動串口}
前面提到過在配置異步通信時,需要注意波特率的配置,對于PSCU板,其所需波特率為2400bps,但是4.8節(jié)提到的無線通信傳感器(ZIGBEE)則需要9600bps,需對USART重新配置。而是否需要USART時鐘配置,則根據(jù)實際需要,如果單純是控制舵機,時鐘配置這一段可省略。
當然在配置USART之前需要進行兩項工作,首先和GPIO一樣需配置時鐘:
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);
因為STM32板有多個USART串口,常用的有1~3,而USART2、USART3的時鐘配置不同于USART1,因為它們在APB1上,而后者在APB2上。應如下配置:
RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2,ENABLE);
配置完時鐘,便需配置GPIO口,U1在上節(jié)已配置,U2、U3的配置與U1一致,但是需要更換I/O口。具體見下表:
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口及復用GPIO口
注:表中的AFIO列為復用I/O口
配置完USART后,便是如何使用了,這包括數(shù)據(jù)發(fā)送和接收。
㈠發(fā)送單個字節(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); }
上述兩個函數(shù)的功能等同,在寫程序時可以隨意調(diào)用,例如3.4節(jié)提到的SendPacket()函數(shù)便調(diào)用了上述的函數(shù)一。
㈡接收一個字節(jié)
u8 RByte(void)
{ u8 out=0;
while(USART_GetFlagStatus(USART1, USART_FLAG_RXNE) == RESET){} //等待接收完畢
out = (USART_ReceiveData(USART1)); //接收一個字節(jié)
return out; }
該函數(shù)用于接收單個字節(jié),在無線通信時可用到。
㈢發(fā)送一個字符串
void Print_String(u8 *p)//發(fā)送一串數(shù)據(jù)
{ while(*p)
{ USART_SendData(USART1, *p++);
while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET)
{} } }
當連續(xù)發(fā)送的字符很多時,可以選用該函數(shù)以字符串形式發(fā)送。
㈣接收一個字符串
void SerialIn(u8 *buf,u8 len)
{ unsigned char i;
for (i = 0; i < len; i++)
buf[i] = RByte(); }
同樣,當需要連續(xù)發(fā)送多個字節(jié)數(shù)據(jù)時,則可選用該函數(shù)。
上面提到的都是USART1的設置以及拓展功能函數(shù)的書寫。而其它串口通信的設置與U1一致,功能函數(shù)則只需將U1換成U2或U3即可。
由于主板的問題,本項目中并未使用U2、U3來實現(xiàn)其它串口通信,而是將所有的串口通信均由U1來實現(xiàn),這也是權宜之計,即采用分時復用的原理。
具體說來,就是發(fā)聲傳感器和無線傳感器都需要通過異步傳輸來與處理器通信。對于每個傳感器以及PSCU,它們能夠識別的信號是由特定字符串組成的。這樣,只要將PA9、PA10口多引出幾個引腳,分別接到傳感器以及PSCU的相應口即可,在傳輸指令時,分時傳送,對于無法識別的字符串,則不處理,這樣便解決了串口不夠的問題。
如果要實現(xiàn)搶占,則將它們配置成中斷模式即可,并配置好優(yōu)先級。
4.5 外部中斷設置與應用
當主控制板遇到異常時,便會觸發(fā)中斷,并進行處理。NVIC,中文叫做嵌套矢量中斷控制器,是用來處理中斷的對于STM32F107的普通用戶來說,只要掌握EXTI線中斷,USART中斷以及TIM中斷即可。下面僅對EXTI中斷作簡略介紹。
外部中斷/事件控制器(EXTI)由19個產(chǎn)生事件/中斷請求的邊沿檢測器組成。每個輸入線可獨立地配置輸入類型和對應的觸發(fā)事件(上升沿、下降沿或雙邊沿觸發(fā))每個輸入線都可以被獨立地屏蔽,由掛起寄存器保持著狀態(tài)線的中斷要求。
如果要產(chǎn)生外部中斷,首先必須配置好并激活中斷線。配置內(nèi)容包括:根據(jù)需要的邊沿檢測設置2個觸發(fā)寄存器、在中斷屏蔽寄存器的相應位寫1以允許中斷請求。當外部中斷線上出現(xiàn)設定的邊沿信號時,將產(chǎn)生一個中斷請求等待處理。完成中斷服務后,可以清除該中斷請求。
下面具體介紹如何配置硬件中斷/事件請求。
(1)首先要了解中斷線與I/O口的關系,如圖4.2可知,PA~PE的0~15口分別對應EXTI的0~15口;EXTI16與PVD輸出連接、EXTI17與RTC鬧鐘事件連接、EXTI18與USB喚醒事件連接。
圖4.2 中斷線與GPIO口對應關系
(2)對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)先級1組,即占先式優(yōu)先級以1位數(shù)字表示,副優(yōu)先級以三位數(shù)字表示,如表4.2所示
表4.2 中斷優(yōu)先級分組
⑤表示選用EXTI0中斷線,注意在有些教材中等號右邊為EXTI0_IRQChannel,但在實際操作中,可能無法編譯,應寫成上面形式。如果是選用中斷線EXTI11,應寫作EXTI15_10_IRQn;EXTI8則為EXTI9_5_IRQn。
⑥為配置占先式優(yōu)先級(主優(yōu)先級):高占先式優(yōu)先級的中斷會打斷當前的主程序/中斷程序運行,即所謂的中斷嵌套。優(yōu)先級數(shù)值越大,優(yōu)先級越低。
⑦為配置副優(yōu)先級(子優(yōu)先級):在占先式優(yōu)先級相同的情況下。在低副優(yōu)先級中斷運行中,高副優(yōu)先級的中斷要等待已被響應的低副優(yōu)先級中斷執(zhí)行結束后才能得到響應—非搶斷式響應(不能嵌套)。但如果同時這兩個中斷同時到達,則先執(zhí)行中斷優(yōu)先級高的,執(zhí)行完后,再執(zhí)行低優(yōu)先級中斷;如果兩個中斷的所有優(yōu)先級均一樣,則哪個中斷先到達,就先執(zhí)行哪個中斷。對于副優(yōu)先級,數(shù)值越大,優(yōu)先級越低。
(3)對中斷線進行I/O口配置
從圖4.2中可知,每個中斷線對應5個I/O口,所以在使用前,一定要先進行I/O口配置。仍以EXTI0為例,由開發(fā)板原理圖可知,PA0可直接配置為EXTI0中斷,無需電路設計。如有需要,也可按照圖4.3所示,配置其它中斷。
圖4.3 PA0中斷線電路
配置程序為:
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)配置中斷處理程序
外部中斷關鍵在于使用,下面為通過EXTI0中斷來控制LED燈的程序:
void EXTI0_IRQHandler(void)
{ if(EXTI_GetITStatus(EXTI_Line0)!= RESET)
{ ledflash();
鏈接地址:http://www.szxfmmzy.com/p-6691478.html