手勢(shì)機(jī)器人設(shè)計(jì)與制作-控制程序設(shè)計(jì)_第1頁(yè)
手勢(shì)機(jī)器人設(shè)計(jì)與制作-控制程序設(shè)計(jì)_第2頁(yè)
手勢(shì)機(jī)器人設(shè)計(jì)與制作-控制程序設(shè)計(jì)_第3頁(yè)
手勢(shì)機(jī)器人設(shè)計(jì)與制作-控制程序設(shè)計(jì)_第4頁(yè)
手勢(shì)機(jī)器人設(shè)計(jì)與制作-控制程序設(shè)計(jì)_第5頁(yè)
已閱讀5頁(yè),還剩45頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

北京理工大學(xué)珠海學(xué)院2020屆本科生畢業(yè)畢業(yè)設(shè)計(jì)手勢(shì)機(jī)器人設(shè)計(jì)與制作—控制程序設(shè)計(jì)摘要隨著社會(huì)的進(jìn)步和科技的發(fā)展,工業(yè)生產(chǎn)方式也得到了很大的提升。手勢(shì)識(shí)別技術(shù)使得人們的雙手免去了投入危險(xiǎn)的作業(yè)環(huán)境之中的風(fēng)險(xiǎn)。提升了工業(yè)生產(chǎn)作業(yè)環(huán)境的安全性以及工業(yè)生產(chǎn)效率。本文主要研究設(shè)計(jì)了手勢(shì)機(jī)器人的控制系統(tǒng)。它分別是由手勢(shì)識(shí)別控制系統(tǒng)和機(jī)器人運(yùn)動(dòng)控制系統(tǒng)組成的。手勢(shì)識(shí)別的控制主要通過人體佩戴數(shù)據(jù)手套來進(jìn)行手勢(shì)信息的識(shí)別采集,再由STTM32讀取和解算,并利用定時(shí)器TIM生成PWM控制信號(hào)控制舵機(jī)驅(qū)動(dòng)實(shí)現(xiàn);機(jī)器人運(yùn)動(dòng)控制則由舵機(jī)驅(qū)動(dòng)來實(shí)現(xiàn)。關(guān)鍵詞:手勢(shì)識(shí)別、STM32、機(jī)器人Gesturerobotdesignandmanufacture-controlprogramdesignAbstractWiththeprogressofsocietyandthedevelopmentofscienceandtechnology,themodeofindustrialproductionhasalsobeengreatlyimproved.Gesturerecognitiontechnologyallowspeopletokeeptheirhandsoutofdangeroussituations.Itimprovesthesafetyandefficiencyofindustrialproductionenvironment.Thispapermainlystudiesanddesignsthecontrolsystemofgesturerobot.Itiscomposedofgesturerecognitioncontrolsystemandrobotmotioncontrolsystemrespectively.Gesturerecognitionismainlycontrolledbythehumanbodywearingdataglovestoidentifyandcollectgestureinformation,whichisthenreadandcalculatedbySTTM32,andachievedbyusingtimerTIMtogeneratePWMcontrolsignaltocontrolthesteeringgeardrive.Robotmotioncontrolisdrivenbythesteeringgeartoachieve.Keywords:STM32、Sensor、timer、gesturecontrol目錄1緒論 緒論數(shù)據(jù)手套歷史和現(xiàn)狀數(shù)據(jù)手套是實(shí)現(xiàn)虛擬與現(xiàn)實(shí)成功交互的硬件設(shè)施。其最先是由手套式的壓力傳感系統(tǒng)發(fā)展而成的。它最早是由R.Sayre等人開發(fā)的被稱為SayreGlove的產(chǎn)品,旨在應(yīng)用于系統(tǒng)的三維控制場(chǎng)合。在八十年代初期,得益于T.Zimmerman等人關(guān)于光彎曲傳感手套的發(fā)展專利,數(shù)據(jù)手套領(lǐng)域取得了重大的發(fā)展。而數(shù)據(jù)手套的發(fā)展真正得到人們重視是在1987年之后。因?yàn)樵谶@一年,“虛擬現(xiàn)實(shí)”這一專業(yè)術(shù)語才被LannierJ提出,并且將數(shù)據(jù)手套定義為實(shí)現(xiàn)人機(jī)交互功能的主要工具?,F(xiàn)如今,數(shù)據(jù)手套的應(yīng)用非常廣泛。其涉及到醫(yī)療修復(fù)、機(jī)械生產(chǎn)、手語翻譯系統(tǒng)等。且在虛擬現(xiàn)實(shí)技術(shù)領(lǐng)域發(fā)揮了巨大的作用。涉及到的領(lǐng)域包括了模擬技術(shù)、技術(shù)訓(xùn)練、娛樂等、目前,市面上已經(jīng)存在許多獨(dú)立的數(shù)據(jù)手套產(chǎn)品。例如5DT、CyberGlove等等。REF_Ref40456344\h圖1-1為南非5DT公司研發(fā)的數(shù)據(jù)手套。圖1SEQ圖\*ARABIC\s115DT數(shù)據(jù)手套機(jī)械手的歷史與現(xiàn)狀20世紀(jì)中期,有關(guān)于機(jī)械手的研究在基于早期出現(xiàn)的古代機(jī)器人上悄然升起。并且在日后工業(yè)生產(chǎn)環(huán)境中,得以不斷地發(fā)展。1958年,第一臺(tái)機(jī)械手由美國(guó)聯(lián)合控制公司研制出。1970年,被后人熟知的斯坦福機(jī)械手第一次在斯坦福大學(xué)用計(jì)算機(jī)控制其運(yùn)作。而將這一演示實(shí)現(xiàn)的是機(jī)器人學(xué)界中早期的革命家之一VivtorSchenman。70年代之后,機(jī)械手在工業(yè)生產(chǎn)上得到了廣泛的應(yīng)用。人們通過機(jī)械手于其它生產(chǎn)設(shè)備的結(jié)合,大大地提高了生產(chǎn)率、產(chǎn)品質(zhì)量、安全作業(yè)等。隨著計(jì)算機(jī)技術(shù)、微電子技術(shù)的飛速發(fā)展,機(jī)械手在工業(yè)生產(chǎn)上的發(fā)展也在不斷地優(yōu)化,追求更高精度、更加可靠和安全性。同時(shí),機(jī)械手的應(yīng)用也擴(kuò)展到了生活中的方方面面。比如社火服務(wù)、海洋研究、石油開采、航天技術(shù)等等。REF_Ref39984710\h圖1-2為投入到生產(chǎn)線上的機(jī)械手。圖1SEQ圖\*ARABIC\s12scara機(jī)械手手勢(shì)識(shí)別技術(shù)的歷史與現(xiàn)狀手勢(shì)是人類除了語言表達(dá)之外,另一種表達(dá)方式。它能夠在沒有語言環(huán)境下進(jìn)行交流。因此手勢(shì)識(shí)別技術(shù)就有了其研究發(fā)展的意義。手勢(shì)識(shí)別技術(shù)大致可以分為早期的接觸式傳感器技術(shù)和隨著計(jì)算機(jī)技術(shù)發(fā)展的非接觸式傳感器?;诮佑|式傳感器的手勢(shì)識(shí)別主要是通過使用多個(gè)傳感器組合設(shè)計(jì)的數(shù)據(jù)手套。這類手勢(shì)識(shí)別技術(shù)對(duì)人體的手部進(jìn)行直接的檢測(cè),準(zhǔn)確率高且虛擬技術(shù)體驗(yàn)感更加強(qiáng)烈。而基于非接觸式傳感器的手勢(shì)識(shí)別則通常利用光學(xué)傳感、雷達(dá)探測(cè)等技術(shù)。這些技術(shù)的工作流程可以分文以下三個(gè)步驟,如REF_Ref40462196\h圖13所示。圖1SEQ圖\*ARABIC\s13工作步驟其中,手勢(shì)的檢測(cè)和相應(yīng)圖像的分割則是該系統(tǒng)地首要任務(wù)。而其檢測(cè)的方法也有很多種。2010年,清華大學(xué)沙亮等人在研究基于無標(biāo)記全手勢(shì)視覺的人機(jī)交互技術(shù)中提出了使用攝像頭的車載手勢(shì)視覺交互系統(tǒng)地解決方法。隨后,微軟公司公布了該攝像頭可以借助紅外線來識(shí)別手勢(shì)運(yùn)動(dòng)。手勢(shì)機(jī)械手的研究意義與目的在日常生活中,人們總是徒手或者手持工具去抓取、移動(dòng)以及其他復(fù)雜的任務(wù)。然而,在這其任務(wù)中,人們也將自己的雙手置于危險(xiǎn)之中,稍有不慎,就造成嚴(yán)重后果。而仿生機(jī)械手的概念就是極力地模擬或者代替人體手部動(dòng)作的機(jī)械手,來幫助人類安全有效地從事各種科研、生產(chǎn)活動(dòng)等,滿足人類的發(fā)展需求、保證人類活動(dòng)安全。手勢(shì)機(jī)器人總體方案設(shè)計(jì)手勢(shì)機(jī)器人的設(shè)計(jì)目標(biāo)根據(jù)人手利用數(shù)據(jù)手套控制機(jī)器人運(yùn)動(dòng)的需求,針對(duì)其特點(diǎn)和工作環(huán)境,設(shè)計(jì)出一個(gè)5自由度的手勢(shì)機(jī)器人的控制系統(tǒng)。完善數(shù)據(jù)手套檢測(cè)手勢(shì)功能,機(jī)器人驅(qū)動(dòng)軟件和手勢(shì)控制軟件。從而實(shí)現(xiàn)人手利用數(shù)據(jù)手套控制手勢(shì)機(jī)器人運(yùn)動(dòng)及實(shí)現(xiàn)物體的抓取動(dòng)作。本設(shè)計(jì)應(yīng)解決的問題(1)數(shù)據(jù)手套的設(shè)計(jì)(2)編寫基于NET的上位機(jī)程序編寫基于單片機(jī)STM32控制舵機(jī)驅(qū)動(dòng)的程序手勢(shì)控制系統(tǒng)方案設(shè)計(jì)手勢(shì)控制系統(tǒng)設(shè)計(jì)的重要內(nèi)容是數(shù)據(jù)手套的實(shí)現(xiàn)和機(jī)器人運(yùn)動(dòng)的實(shí)現(xiàn)。數(shù)據(jù)手套實(shí)現(xiàn)的方式有很多種,按照其搭載的傳感器數(shù)目可以分為5觸點(diǎn)數(shù)據(jù)手套、14觸點(diǎn)數(shù)據(jù)手套等??紤]到其設(shè)計(jì)成本、實(shí)現(xiàn)途徑等因素,本次研究所用的數(shù)據(jù)手套是在5觸點(diǎn)數(shù)據(jù)手套的基礎(chǔ)上另外搭載一個(gè)姿態(tài)傳感器組成的。當(dāng)人手佩戴數(shù)據(jù)手套時(shí),由電腦發(fā)送指令至單片機(jī)控制中心,軟件開啟手勢(shì)信息采集工作。手套上的5個(gè)彎曲傳感器檢測(cè)人體手指的彎曲信息,單片機(jī)利用ADC功能對(duì)這些信息進(jìn)行采集,利用HC05藍(lán)牙模塊將信息返回電腦;姿態(tài)傳感器檢測(cè)人體的手部運(yùn)動(dòng)信息,單片機(jī)利用IIC功能采集手部運(yùn)動(dòng)信息并利用HC05藍(lán)牙模塊將信息返回給電腦。HC05藍(lán)牙模塊對(duì)比其它通信方式,其使用方法非常簡(jiǎn)單易懂。雖然其內(nèi)部含有藍(lán)牙通信協(xié)議,但是它在使用時(shí)并不需要去考慮這部分的內(nèi)容,其方法與普通串口的使用方法并差別。REF_Ref40392369\h圖2-1為HC05藍(lán)牙模塊的實(shí)物。圖2SEQ圖\*ARABIC\s11HC05藍(lán)牙模塊在選用彎曲傳感器時(shí),對(duì)比了各公司的傳感器類型如REF_Ref40368478\h表2-1所示,最終選定了由深圳麥格米特公司研發(fā)的柔性彎曲光纖傳感器,實(shí)物如REF_Ref40368517\h圖2-2所示。表STYLEREF1\s2SEQ表\*ARABIC\s11傳感器類型性能比較公司傳感器體積重量?jī)r(jià)格精度安裝一致性耐用性VPL柔性彎曲光纖傳感器小輕便宜較低簡(jiǎn)單一般一般Vertex電阻傳感器小輕便宜較低簡(jiǎn)單一般一般Exos摩爾傳感器較大較重偏貴較高較復(fù)雜良好一般Megmeet柔性彎曲光纖傳感器小輕便宜較高簡(jiǎn)單良好良好圖2SEQ圖\*ARABIC\s12柔性彎曲光纖傳感器本文中,姿態(tài)傳感器的選用的是MPU6050傳感器。之所以選擇這款傳感器一是因?yàn)樗侨蚴卓钫闲?軸運(yùn)動(dòng)處理件;而是其與其他姿態(tài)傳感器相比,它的檢測(cè)結(jié)果免除了組合陀螺儀與加速器時(shí)之軸差的問題,同時(shí)它還減少了封裝空間,更容易實(shí)現(xiàn)在手套上的配置。其傳感器實(shí)物如REF_Ref40366998\h圖2-3所示,模塊如REF_Ref40454529\h圖2-4所示。圖2SEQ圖\*ARABIC\s13MPU6050傳感器圖2SEQ圖\*ARABIC\s14MPU6050模塊機(jī)器人運(yùn)動(dòng)的實(shí)現(xiàn)分別由控制系統(tǒng)、驅(qū)動(dòng)系統(tǒng)和機(jī)器人主體三部分組成。其控制關(guān)系如REF_Ref40366556\h圖2-5所示。考慮到機(jī)器人手指和機(jī)器人手部的轉(zhuǎn)動(dòng)范圍和受力大小,分別采用了MG955和SG90兩種型號(hào)的舵機(jī)來驅(qū)動(dòng)機(jī)器人手指運(yùn)動(dòng)和手部運(yùn)動(dòng)。其實(shí)物如REF_Ref40456549\h圖2-6、REF_Ref40370683\h圖2-7所示。根據(jù)采集到的手勢(shì)信息生成控制信號(hào),控制舵機(jī)轉(zhuǎn)動(dòng),從而實(shí)現(xiàn)控制機(jī)器人手指彎曲動(dòng)作和機(jī)器人手部姿態(tài)動(dòng)作。圖2SEQ圖\*ARABIC\s15機(jī)器人運(yùn)動(dòng)控制關(guān)系圖2SEQ圖\*ARABIC\s16MG955舵機(jī)圖2SEQ圖\*ARABIC\s17SG90舵機(jī)手勢(shì)控制原理手勢(shì)控制實(shí)際上就是根據(jù)人體的手部信息來控制機(jī)器人運(yùn)動(dòng)的過程。要想實(shí)現(xiàn)這一過程,需要兩部分內(nèi)容,分別是:手勢(shì)信息的獲取以及機(jī)器人運(yùn)動(dòng)的控制。手勢(shì)信息的獲取對(duì)于人體手指彎曲度信息的獲取,本次研究是將表面涂有特殊電阻材料的彎曲傳感器配置在數(shù)據(jù)手套上,這種特殊的電阻材料可以在人體手指運(yùn)動(dòng)時(shí),使得傳感器產(chǎn)生因應(yīng)力變化而發(fā)生的彎曲變形。其表面的電阻大小也隨著彎曲變形的大小成正比例關(guān)系變化。但由于彎曲傳感器所采集到的數(shù)據(jù)為模擬信號(hào),并非STM32單片機(jī)可讀的數(shù)字信號(hào)。因此,需要設(shè)置5個(gè)ADC通道來將這5路模擬信號(hào)轉(zhuǎn)換成STM32單片機(jī)可讀的數(shù)字信號(hào)。通過STM32中文使用手冊(cè)可知,STM32單片機(jī)上的ADC為逐次逼近型的模擬轉(zhuǎn)換器,需經(jīng)過采用、保持、量化與編碼四個(gè)步驟來將模擬信號(hào)轉(zhuǎn)換成數(shù)字信號(hào),其工作原理框圖如REF_Ref39978035\h圖3-1所示。圖3SEQ圖\*ARABIC\s11逐次逼近型模擬數(shù)據(jù)轉(zhuǎn)換器工作原理框圖對(duì)于手部姿態(tài)信息的獲取,本次研究通過在數(shù)據(jù)手套上配置姿態(tài)傳感器MPU6050方式進(jìn)行獲取。REF_Ref40445201\h表3-1為MPU6050傳感器的內(nèi)部資源及其功能介紹。表STYLEREF1\s3SEQ表\*ARABIC\s11MPU6050內(nèi)部資源及其功能MPU6050內(nèi)部資源功能三軸MEMS陀螺儀檢測(cè)物體轉(zhuǎn)動(dòng)的角速度三軸MEMS加速計(jì)檢測(cè)物體運(yùn)動(dòng)的加速度數(shù)據(jù)運(yùn)動(dòng)處理器DMP將檢測(cè)的原始數(shù)據(jù)進(jìn)行換算普通的三軸陀螺儀的實(shí)物如REF_Ref39978048\h圖3-2所示。如果在其三軸陀螺儀工作原理基礎(chǔ)上,結(jié)合科里奧利力的應(yīng)用,就可以得出本文所提及的三軸MEMS陀螺儀。所謂的科里奧利力,其實(shí)可以把它看作為就角速度,也正因此,三軸MEMS陀螺儀的角度可以通過其電容的變化計(jì)算。其關(guān)系如REF_Ref39978060\h圖3-3所示。圖3SEQ圖\*ARABIC\s12三軸陀螺儀圖3SEQ圖\*ARABIC\s13三軸角度與旋轉(zhuǎn)速率的關(guān)系而三軸MEMS加速度計(jì)就是在加速過程中,通過對(duì)人體手部所受到的慣性力的測(cè)量,利用牛頓第二定律獲得加速度值。在靜止?fàn)顟B(tài)下,加速度計(jì)三軸受力的合力與重力大小、方向存在一定的關(guān)系,具體如REF_Ref39979727\h圖34所示。圖3SEQ圖\*ARABIC\s14加速度計(jì)三軸合力在測(cè)量到角速度和加速度后,利用MPU自帶的數(shù)據(jù)處理器DMP對(duì)這些原始數(shù)據(jù)進(jìn)行轉(zhuǎn)換,得到所需的姿態(tài)數(shù)字信號(hào)。這時(shí),STM32單片機(jī)再利用IIC通信對(duì)此姿態(tài)數(shù)字信號(hào)進(jìn)行讀取。至此,手勢(shì)信息的獲取工作已全部完成。機(jī)器人運(yùn)動(dòng)的控制本次研究中,機(jī)器人的運(yùn)動(dòng)是通過驅(qū)動(dòng)舵機(jī)實(shí)現(xiàn)的。因此,可以把機(jī)器人運(yùn)動(dòng)的控制理解成舵機(jī)的控制。舵機(jī)實(shí)際上是一種角度(位置)伺服的驅(qū)動(dòng)器,其內(nèi)部組成如REF_Ref39983186\h圖3-5所示。它適用于角度不斷變化并且可以保持的控制系統(tǒng)。本次研究中,利用STM32單片機(jī)內(nèi)部的定時(shí)器TIM1和TIM2,根據(jù)上述采集到的手勢(shì)數(shù)字信息生成PWM信號(hào)。PWM控制信號(hào)其實(shí)就是一個(gè)高低電平持續(xù)時(shí)間不斷發(fā)生變化的電路,當(dāng)這路進(jìn)入到舵機(jī)時(shí),它與舵機(jī)自身的基準(zhǔn)電路的電壓進(jìn)行比較,并獲得其電壓輸出差,從而實(shí)現(xiàn)對(duì)電機(jī)正反轉(zhuǎn)的控制。其工作原理如REF_Ref39983201\h圖3-6所示。圖3SEQ圖\*ARABIC\s15舵機(jī)的組成圖3SEQ圖\*ARABIC\s16舵機(jī)工作原理圖系統(tǒng)軟件設(shè)計(jì)準(zhǔn)備工作KeiluVision5MDK2006年,ARM公司收購(gòu)了德國(guó)知名軟件公司Keil,并推出了基于ARM7、ARM9、CORTEX-M微處理器的開發(fā)軟件MDK。目前,MDK也是開發(fā)ARM內(nèi)核單片機(jī)的主流開發(fā)工具。它提供了包括C編譯器、宏匯編、連接器、庫(kù)管理和一個(gè)功能強(qiáng)大的仿真調(diào)試器在內(nèi)的完整開發(fā)方案,通過一個(gè)集成開發(fā)環(huán)境(uVision)將這些功能組合在一起。此外,MDK還適合不同層次的開發(fā)者使用,包括了剛?cè)腴T級(jí)別的。因此,我們選擇了KeiluVision4MDK作為我們stm32的軟件開發(fā)平臺(tái)。其初始界面如REF_Ref38529825\h圖4-1所示。圖4SEQ圖\*ARABIC\s11KeiluVision5MDK初始界面VisualStudio由美國(guó)微軟公司推出的VisualStudio應(yīng)用軟件,簡(jiǎn)稱為VS,實(shí)際上是一個(gè)開發(fā)集成系統(tǒng)即常說的IDE。這款軟件中,涵蓋了一個(gè)基本完整的開發(fā)工具集,它包括了如UML工具、代碼管控工具、集成開發(fā)環(huán)境等整個(gè)軟件生命周期中所需要的大部分工具。該軟件適用的開發(fā)語言非常多,REF_Ref40462907\h表41中列舉出了其支持的部分開發(fā)語言。REF_Ref38529838\h圖4-2為VS初始界面。表STYLEREF1\s4SEQ表\*ARABIC\s11VS適用的開發(fā)語言C語言C++C#JAVA圖4SEQ圖\*ARABIC\s12VS初始界面MPU6050傳感器軟件設(shè)計(jì)準(zhǔn)備MPU6050傳感器工作原理如REF_Ref38627000\h圖4-3所示,通過軟件設(shè)置,可以直接得到由其內(nèi)部三軸陀螺儀測(cè)量人手在空間中的角度原始數(shù)據(jù)和加速度計(jì)測(cè)量的加速度原始數(shù)據(jù)。得到原始數(shù)據(jù)后,還需進(jìn)行解算,才能得出研究所需的姿態(tài)數(shù)據(jù)即歐拉角。原始數(shù)據(jù)的解算有兩種方法:一種是調(diào)用MPU自身配置的DMP即數(shù)字運(yùn)動(dòng)處理器,對(duì)原始數(shù)據(jù)直接進(jìn)行四元數(shù)轉(zhuǎn)換,再對(duì)其利用公式計(jì)算得出所需的歐拉角;另一種則是對(duì)其檢測(cè)到的原始數(shù)據(jù)進(jìn)行一些姿態(tài)融合解算(卡爾曼、積分運(yùn)算等),以求出當(dāng)前的歐拉角。對(duì)比兩種方法,明顯發(fā)現(xiàn)第二種比第一種復(fù)雜,所以選擇第一種方來獲取歐拉角。圖4SEQ圖\*ARABIC\s13加速度計(jì)和陀螺儀的原理DMP數(shù)字運(yùn)動(dòng)處理器DMP的意義在于讀取MPU加速度計(jì)和陀螺儀檢測(cè)的原始數(shù)據(jù)并進(jìn)行四元組數(shù)據(jù)轉(zhuǎn)換。轉(zhuǎn)換后的四元組數(shù)據(jù)的浮點(diǎn)數(shù)是放大了2的30次方倍數(shù)的,即采用了q20格式。為了獲得正確的浮點(diǎn)數(shù),方便之后計(jì)算歐拉角,將得到的四元組數(shù)據(jù)除以2的20次方。公式如下所示。q0=quat[0]/q30(式STYLEREF1\s4SEQ式\*ARABIC\s11)q1=quat[1]/q30(式STYLEREF1\s4SEQ式\*ARABIC\s12)q2=quat[2]/q30(式STYLEREF1\s4SEQ式\*ARABIC\s13)q3=quat[3]/q30(式STYLEREF1\s4SEQ式\*ARABIC\s14)其中quant[0]~quat[3]為四元組數(shù)。在求出浮點(diǎn)數(shù)之后,就可以根據(jù)以下公式得出我們需要的歐拉角:俯仰角、橫滾角、航向角俯仰角Pitch=asin(-2*q3*q2+2*q0*q2)*57.3(式STYLEREF1\s4SEQ式\*ARABIC\s15)橫滾角roll=atan2(2*q2*q3+2*q0*q1,-2*q1*q1-2*q2*q2+1)*57.3(式STYLEREF1\s4SEQ式\*ARABIC\s16)航向角yaw=atan2(2*(q1*q2+q0*q3),q0*q0+q1*q1-q2*q2-q3*q3)*57.3(式STYLEREF1\s4SEQ式\*ARABIC\s17)公式中的57.3表示弧度轉(zhuǎn)換為角度,即180/π。STM32移植DMP要想使用DMP來獲取歐拉角,我們還需要將DMP固件庫(kù)移植到控制芯片STM32上。首先,我們需要在官網(wǎng)上下載DMP庫(kù)和IIC文件。在MDK5上創(chuàng)建STM32F103工程文件,選中如REF_Ref40371042\h圖4-4所示文件添加至HARDWARE中。圖4SEQ圖\*ARABIC\s14需要添加文件系統(tǒng)的軟件設(shè)計(jì)手勢(shì)識(shí)別軟件設(shè)計(jì)本文中,手勢(shì)識(shí)別是依靠于數(shù)據(jù)手套實(shí)現(xiàn)的。因此,手勢(shì)識(shí)別軟件設(shè)計(jì)也可以稱為是數(shù)據(jù)手套軟件設(shè)計(jì),其可分為柔性彎曲度光纖傳感器軟件設(shè)計(jì)和MPU6050姿態(tài)傳感器軟件設(shè)計(jì)。柔性彎曲度纖維傳感器軟件設(shè)計(jì)這部分的設(shè)計(jì)需要用到硬件設(shè)備有:柔性彎曲度光纖傳感器、控制芯片STM32、HC05藍(lán)牙模塊、USB數(shù)據(jù)線;需要使用的STM32內(nèi)部資源有:模擬數(shù)據(jù)轉(zhuǎn)換器ADC、直接內(nèi)容存取DMA、定時(shí)器TIM。REF_Ref38529873\h圖5-1為程序控制流程圖。圖5SEQ圖\*ARABIC\s11彎曲傳感器程序控制流程圖此部分的程序設(shè)計(jì)核心程序是采集手指模擬信息并對(duì)其進(jìn)行模數(shù)轉(zhuǎn)換。采集手指模擬信息需利用ADC的信號(hào)輸入通道,本文中將通道10-14都設(shè)置為模擬信號(hào)輸入的引腳,則相對(duì)的程序?yàn)椋篏PIO_InitTypeDefGPIO_InitStructure;GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0;//PC0作為輸入通道

GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AIN;//模擬輸入引腳

GPIO_Init(GPIOC,&GPIO_InitStructure);GPIOC初始化GPIO_InitStructure.GPIO_Pin=GPIO_Pin_1;//PC1作為輸入通道

GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AIN;//模擬輸入引腳

GPIO_Init(GPIOC,&GPIO_InitStructure);GPIOC初始化GPIO_InitStructure.GPIO_Pin=GPIO_Pin_2;//PC2作為輸入通道

GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AIN;//模擬輸入引腳

GPIO_Init(GPIOC,&GPIO_InitStructure);GPIOC初始化GPIO_InitStructure.GPIO_Pin=GPIO_Pin_3;//PC3作為輸入通道

GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AIN;//模擬輸入引腳

GPIO_Init(GPIOC,&GPIO_InitStructure);GPIOC初始化GPIO_InitStructure.GPIO_Pin=GPIO_Pin_4;//PC4作為輸入通道

GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AIN;//模擬輸入引腳

GPIO_Init(GPIOC,&GPIO_InitStructure);GPIOC初始化完成模擬數(shù)據(jù)引腳的設(shè)置后,需配置相應(yīng)的時(shí)鐘,即為:RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);//用到USART1,開啟USARTA時(shí)鐘RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);//因?yàn)閺?fù)用USART1,需開啟RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);//用到PC0-4管腳,所以需要開啟GPIOC時(shí)鐘RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1,ENABLE);//用到ADC1,需要開啟ADC1時(shí)鐘RCC_ADCCLKConfig(RCC_PCLK2_Div6);//配置ADC1模擬時(shí)鐘PCLK2的6分頻,72/6=12MHZ接著就是對(duì)ADC輸出結(jié)構(gòu)體的配置,其程序如下:ADC_InitStructure.ADC_Mode=ADC_Mode_Independent;//設(shè)置ADC為獨(dú)立工作模式ADC_InitStructure.ADC_ScanConvMode=ENABLE;//設(shè)置ADC為掃描模式ADC_InitStructure.ADC_ContinuousConvMode=ENABLE;//設(shè)置ADC為連續(xù)轉(zhuǎn)換模式ADC_InitStructure.ADC_ExternalTrigConv=ADC_ExternalTrigConv_None;//關(guān)閉外部觸發(fā)ADC_InitStructure.ADC_DataAlign=ADC_DataAlign_Right;//轉(zhuǎn)換結(jié)果為右對(duì)齊ADC_InitStructure.ADC_NbrOfChannel=5;//轉(zhuǎn)換通道的數(shù)目ADC_Init(ADC1,&ADC_InitStructure);//初始化ADC1準(zhǔn)備工作完成后,需要設(shè)置其通道的轉(zhuǎn)換時(shí)間。參考STM32中文使用手冊(cè),ABP2總線是掛載了ADC、DMA等外設(shè)時(shí)鐘的。因此,我們?cè)O(shè)置其時(shí)鐘為:RCC_ADCCLKConfig(RCC_PCLK2_Div6);由以上的設(shè)置,可以知道72/6=12MHZ為ADC的時(shí)鐘頻率。接下來,就是對(duì)各輸入通道的采樣順序和時(shí)間進(jìn)行程序設(shè)計(jì)。其程序代碼如下:ADC_RegularChannelConfig(ADC1,ADC_Channel_10,1,ADC_SampleTime_239Cycles5);ADC_RegularChannelConfig(ADC1,ADC_Channel_11,2,ADC_SampleTime_239Cycles5);ADC_RegularChannelConfig(ADC1,ADC_Channel_12,3,ADC_SampleTime_239Cycles5);ADC_RegularChannelConfig(ADC1,ADC_Channel_13,4,ADC_SampleTime_239Cycles5);ADC_RegularChannelConfig(ADC1,ADC_Channel_14,5,ADC_SampleTime_239Cycles5);對(duì)于轉(zhuǎn)換結(jié)果的存儲(chǔ),這里使用到了DMA功能,所以需要在ADC功能初始化程序里開啟DMA功能,并使能,即:ADC_DMACmd(ADC1,ENABLE);ADC_Cmd(ADC1,ENABLE);完成以上內(nèi)容后,就可以開啟轉(zhuǎn)換。其代碼如下:ADC_ResetCalibration(ADC1);while(ADC_GetResetCalibrationStatus(ADC1));ADC_StartCalibration(ADC1);while(ADC_GetCalibrationStatus(ADC1));DMA功能,通ADC功能一樣都時(shí)屬于單片機(jī)的外設(shè)資源,在對(duì)其進(jìn)行調(diào)用是,同樣需要進(jìn)行初始化。其初始化程序如下:voidDMA_init(void){ DMA_InitTypeDefDMA_InitStructure;RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1,ENABLE);//用到DMA1,需要開啟DMA1時(shí)鐘DMA_DeInit(DMA1_Channel1);//指定DMA通道DMA_InitStructure.DMA_PeripheralBaseAddr=(uint32_t)&(ADC1->DR);//DMA外設(shè)ADC地址DMA_InitStructure.DMA_MemoryBaseAddr=(uint32_t)&ADC_ConvertedValue;//DMA內(nèi)存地址,用來存儲(chǔ)轉(zhuǎn)換結(jié)果DMA_InitStructure.DMA_DIR=DMA_DIR_PeripheralSRC;//數(shù)據(jù)傳輸方向,外設(shè)到內(nèi)存DMA_InitStructure.DMA_BufferSize=10*5;//傳輸內(nèi)容的大小,每通道采集次數(shù)乘上通道數(shù)目DMA_InitStructure.DMA_PeripheralInc=DMA_PeripheralInc_Disable;//外設(shè)地址寄存器不變DMA_InitStructure.DMA_MemoryInc=DMA_MemoryInc_Enable;//存儲(chǔ)器地址遞增DMA_InitStructure.DMA_PeripheralDataSize=DMA_PeripheralDataSize_HalfWord;//數(shù)據(jù)寬度為16位DMA_InitStructure.DMA_MemoryDataSize=DMA_MemoryDataSize_HalfWord;//數(shù)據(jù)寬度為16位DMA_InitStructure.DMA_Mode=DMA_Mode_Circular;//DMA設(shè)置為循環(huán)傳輸模式DMA_InitStructure.DMA_Priority=DMA_Priority_High;//DMA通道擁有高優(yōu)先級(jí)DMA_InitStructure.DMA_M2M=DMA_M2M_Disable;//本次設(shè)計(jì)為外設(shè)到到內(nèi)存的傳輸模式,所以需禁止內(nèi)存到內(nèi)存的傳輸模式DMA_Init(DMA1_Channel1,&DMA_InitStructure);//初始化DMADMA_Cmd(DMA1_Channel1,ENABLE);//使能DMA通道 } 完成以上設(shè)置后,就可以在主函數(shù)中輸出相應(yīng)的數(shù)值,其程序如下:intmain(void){ intsum; u8i,j; floatADC_Value[5];//用來保存經(jīng)過轉(zhuǎn)換得到的電壓值 ADC_Init(); DMA_Init(); ADC_SoftwareStartConvCmd(ADC1,ENABLE);//開始采集 while(1) { while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)==RESET);//等待傳輸完成否則第一位數(shù)據(jù)容易丟失 for(i=0;i<6;i<++) { sum=0; for(j=0;j<10;j++) { sum+=ADCConvertedValue[j][i]; } ADC_Value[i]=(float)sum/(10*4096)*3.3;//求平均值并轉(zhuǎn)換成電壓值 } delay_ms(100);// }}至此,關(guān)于柔性彎曲光纖傳感器的軟件設(shè)計(jì)已全部完成。MPU6050姿態(tài)傳感器軟件設(shè)計(jì)這部分需要用到的硬件有:MPU6050傳感器、STM32控制芯片、HC05藍(lán)牙模塊、USB數(shù)據(jù)線;需要使用STM32的內(nèi)部資源有:IIC通信模塊;以及MPU6050內(nèi)部數(shù)字運(yùn)動(dòng)處理DMP。REF_Ref40444321\h圖5-2為MPU6050傳感器控制流程圖。圖5SEQ圖\*ARABIC\s12MPU6050傳感器控制流程圖此部分程序設(shè)計(jì)的核心程序是對(duì)手勢(shì)姿態(tài)信息的采集和獲取。MPU傳感器與單片機(jī)之間信息的傳輸是通過IIC模塊實(shí)現(xiàn)的,因此需要對(duì)進(jìn)行初始化設(shè)置。使用IIC模塊需要用到IO接口PB8和PB9,需要對(duì)其是在進(jìn)行使能,即RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB,ENABLE);配置好管腳時(shí)鐘后,對(duì)其管腳進(jìn)行設(shè)置:GPIO_InitStructure.GPIO_Pin=GPIO_Pin_8|GPIO_Pin_9;GPIO_InitStructure.GPIO_Mode=GPIO_Mode_OUT;//普通輸出模式GPIO_InitStructure.GPIO_OType=GPIO_OType_PP;//推挽輸出GPIO_InitStructure.GPIO_Speed=GPIO_Speed_100MHz;//100MHzGPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_UP;//上拉GPIO_Init(GPIOB,&GPIO_InitStructure);//初始化其管腳初始化完成后,還需對(duì)信號(hào)的開始、停止以及等待三種狀態(tài)進(jìn)行設(shè)置。其程序設(shè)計(jì)如下:/*IIC起始信號(hào)*/voidIIC_Start(void){ SDA_OUT();//sda線輸出 IIC_SDA=1; IIC_SCL=1; delay_us(4); IIC_SDA=0; delay_us(4); IIC_SCL=0;//鉗住I2C總線,準(zhǔn)備發(fā)送或接收數(shù)據(jù)}/*IIC停止信號(hào)*/voidIIC_Stop(void){ SDA_OUT();//sda線輸出 IIC_SCL=0; IIC_SDA=0;// delay_us(4); IIC_SCL=1; IIC_SDA=1;//發(fā)送I2C總線結(jié)束信號(hào) delay_us(4); }/*等待信號(hào)*/u8IIC_Wait_Ack(void){ u8ucErrTime=0; SDA_IN();//SDA設(shè)置為輸入 IIC_SDA=1;delay_us(1); IIC_SCL=1;delay_us(1); while(READ_SDA) { ucErrTime++; if(ucErrTime>250) { IIC_Stop(); return1; } } IIC_SCL=0;//時(shí)鐘輸出0 return0;}在等待信號(hào)時(shí),會(huì)出現(xiàn)兩種狀態(tài)。一種是應(yīng)答、另一種是不應(yīng)答。其相應(yīng)的程序代碼如下:/*產(chǎn)生ACK應(yīng)答*/voidIIC_Ack(void){ IIC_SCL=0; SDA_OUT(); IIC_SDA=0; delay_us(2); IIC_SCL=1; delay_us(2); IIC_SCL=0;}/*不產(chǎn)生ACK應(yīng)答*/voidIIC_NAck(void){ IIC_SCL=0; SDA_OUT(); IIC_SDA=1; delay_us(2); IIC_SCL=1; delay_us(2); IIC_SCL=0;} 接著,就是IIC發(fā)送一個(gè)字節(jié)、讀一個(gè)字節(jié)。其程序代碼如下:VoidIIC_Send_Byte(u8txd){u8t; SDA_OUT(); IIC_SCL=0;//拉低時(shí)鐘開始數(shù)據(jù)傳輸for(t=0;t<8;t++){IIC_SDA=(txd&0x80)>>7;txd<<=1; delay_us(2);//延時(shí) IIC_SCL=1; delay_us(2); IIC_SCL=0; delay_us(2);} } u8IIC_Read_Byte(unsignedcharack){ unsignedchari,receive=0; SDA_IN();//SDA設(shè)置為輸入for(i=0;i<8;i++) {IIC_SCL=0;delay_us(2); IIC_SCL=1;receive<<=1;if(READ_SDA)receive++; delay_us(1);} if(!ack)IIC_NAck();//發(fā)送nACKelseIIC_Ack();//發(fā)送ACKreturnreceive;}至此,IIC通信協(xié)議的初始化已全部完成。在完成IIC通信初始化后,就可以在MPU程序C文件中調(diào)用IIC功能,實(shí)現(xiàn)MPU與STM32之間的通信,這里主要是通過IIC的連續(xù)寫連續(xù)讀的方式對(duì)MPU寄存器進(jìn)行讀寫,即:u8MPU_Write_Byte(u8reg,u8data) {IIC_Start(); IIC_Send_Byte((MPU_ADDR<<1)|0);//發(fā)送器件地址+寫命令 if(IIC_Wait_Ack()) //等待應(yīng)答 { IIC_Stop(); return1; }IIC_Send_Byte(reg); //寫寄存器地址IIC_Wait_Ack(); //等待應(yīng)答 IIC_Send_Byte(data);//發(fā)送數(shù)據(jù) if(IIC_Wait_Ack()) //等待ACK { IIC_Stop(); return1; } IIC_Stop(); return0;}u8MPU_Read_Byte(u8reg){ u8res;IIC_Start(); IIC_Send_Byte((MPU_ADDR<<1)|0);//發(fā)送器件地址+寫命令 IIC_Wait_Ack(); //等待應(yīng)答IIC_Send_Byte(reg); //寫寄存器地址IIC_Wait_Ack(); //等待應(yīng)答IIC_Start(); IIC_Send_Byte((MPU_ADDR<<1)|1);//發(fā)送器件地址+讀命令 IIC_Wait_Ack(); //等待應(yīng)答 res=IIC_Read_Byte(0);//讀取數(shù)據(jù),發(fā)送nACKIIC_Stop(); //產(chǎn)生一個(gè)停止條件 returnres; }至此,MPU與STM32之間的通信搭建完成。完成通信后,需要對(duì)MPU6050傳感器初始化、設(shè)置陀螺儀和加速計(jì)的滿量程范圍以及采樣率等。u8MPU_Init(void)u8MPU_Set_Gyro_Fsr(u8fsr)u8MPU_Set_Accel_Fsr(u8fsr)u8MPU_Set_LPF(u16lpf)u8MPU_Set_Rate(u16rate)完成以上設(shè)置后,接下來就是獲取MPU6050檢測(cè)的原始信息,其程序代碼實(shí)現(xiàn)如下:u8MPU_Get_Gyroscope(short*gx,short*gy,short*gz){u8buf[6],res; res=MPU_Read_Len(MPU_ADDR,MPU_GYRO_XOUTH_REG,6,buf); if(res==0) { *gx=((u16)buf[0]<<8)|buf[1]; *gy=((u16)buf[2]<<8)|buf[3]; *gz=((u16)buf[4]<<8)|buf[5]; } returnres;;}u8MPU_Get_Accelerometer(short*ax,short*ay,short*az){u8buf[6],res; res=MPU_Read_Len(MPU_ADDR,MPU_ACCEL_XOUTH_REG,6,buf); if(res==0) { *ax=((u16)buf[0]<<8)|buf[1]; *ay=((u16)buf[2]<<8)|buf[3]; *az=((u16)buf[4]<<8)|buf[5]; } returnres;;}在得到原始數(shù)據(jù),需要利用自身配有的數(shù)字運(yùn)動(dòng)處理器DMP進(jìn)行換算。同樣的,在使用DMP外設(shè)時(shí),也需要對(duì)其進(jìn)行初始化設(shè)置。程序如下:/*DMP初始化*/u8mpu_dmp_init(void){ u8res=0; MPU_IIC_Init(); //初始化IIC總線 if(mpu_init()==0) //初始化MPU6050 { res=mpu_set_sensors(INV_XYZ_GYRO|INV_XYZ_ACCEL);//設(shè)置所需要的傳感器 if(res)return1; res=mpu_configure_fifo(INV_XYZ_GYRO|INV_XYZ_ACCEL);//設(shè)置FIFO if(res)return2; res=mpu_set_sample_rate(DEFAULT_MPU_HZ); //設(shè)置采樣率 if(res)return3; res=dmp_load_motion_driver_firmware(); //加載dmp固件 if(res)return4; res=dmp_set_orientation(inv_orientation_matrix_to_scalar(gyro_orientation));//設(shè)置陀螺儀方向 if(res)return5; res=dmp_enable_feature(DMP_FEATURE_6X_LP_QUAT|DMP_FEATURE_TAP| //設(shè)置dmp功能 DMP_FEATURE_ANDROID_ORIENT|DMP_FEATURE_SEND_RAW_ACCEL|DMP_FEATURE_SEND_CAL_GYRO| DMP_FEATURE_GYRO_CAL); if(res)return6; res=dmp_set_fifo_rate(DEFAULT_MPU_HZ); //設(shè)置DMP輸出速率(最大不超過200Hz) if(res)return7; res=run_self_test(); //自檢 if(res)return8; res=mpu_set_dmp_state(1); //使能DMP if(res)return9; }elsereturn10; return0;}DMP初始化完成后,就可以在程序中調(diào)用DMP對(duì)檢測(cè)的原始數(shù)據(jù)進(jìn)行轉(zhuǎn)換,其程序代碼如下:u8mpu_dmp_get_data(float*pitch,float*roll,float*yaw){ floatq0=1.0f,q1=0.0f,q2=0.0f,q3=0.0f; unsignedlongsensor_timestamp; shortgyro[3],accel[3],sensors; unsignedcharmore; longquat[4]; if(dmp_read_fifo(gyro,accel,quat,&sensor_timestamp,&sensors,&more)return1; if(sensors&INV_WXYZ_QUAT) { q0=quat[0]/q30; //q30格式轉(zhuǎn)換為浮點(diǎn)數(shù) q1=quat[1]/q30; q2=quat[2]/q30; q3=quat[3]/q30; //計(jì)算得到俯仰角/橫滾角/航向角 *pitch=asin(-2*q1*q3+2*q0*q2)*57.3; //pitch *roll=atan2(2*q2*q3+2*q0*q1,-2*q1*q1-2*q2*q2+1)*57.3; //roll *yaw=atan2(2*(q1*q2+q0*q3),q0*q0+q1*q1-q2*q2-q3*q3)*57.3; //yaw }elsereturn2; return0;}獲取到所需的歐拉角之后,就可以在主函數(shù)里面輸出我們所需的結(jié)果。主函數(shù)的程序如下:intmain(void){ u8t=0,report=1; //默認(rèn)開啟上報(bào) u8key; floatpitch,roll,yaw; //歐拉角 shortaacx,aacy,aacz; //加速度傳感器原始數(shù)據(jù) shortgyrox,gyroy,gyroz; //陀螺儀原始數(shù)據(jù) shorttemp; //溫度 SystemInit(); uart_init(115200); //串口初始化為500000 delay_init(); //延時(shí)初始化 MPU_Init(); //初始化MPU6050 while(mpu_dmp_init()) { printf("\n\rMPU6050Error\n\r"); delay_ms(200); } while(1) { key=KEY_Scan(0); if(key==KEY0_PRES) { report=!report; if(report)printf("\n\rUPLOADON\n\r"); elseprintf("\n\rUPLOADOFF\n\r"); } if(mpu_dmp_get_data(&pitch,&roll,&yaw)==0) { temp=MPU_Get_Temperature(); //得到溫度值 MPU_Get_Accelerometer(&aacx,&aacy,&aacz); //得到加速度傳感器數(shù)據(jù) MPU_Get_Gyroscope(&gyrox,&gyroy,&gyroz); //得到陀螺儀數(shù)據(jù) if(report)mpu6050_send_data(aacx,aacy,aacz,gyrox,gyroy,gyroz);//用自定義幀發(fā)送加速度和陀螺儀原始數(shù)據(jù) if(report)usart1_report_imu(aacx,aacy,aacz,gyrox,gyroy,gyroz,(int)(roll*100),(int)(pitch*100),(int)(yaw*10)); if((t%10)==0) { printf("\n\rtemp:%f\n\r",temp/100.0); printf("\n\rpitch:%f\n\r",pitch*10); printf("\n\rroll:%f\n\r",roll*10); printf("\n\ryaw:%f\n\r",yaw*10); t=0; } } t++; } }5.4機(jī)器人運(yùn)動(dòng)軟件設(shè)計(jì)機(jī)器人運(yùn)動(dòng)軟件設(shè)計(jì)以控制舵機(jī)為核心。所需要用到的硬件設(shè)備有:5個(gè)MG955舵機(jī)、1個(gè)SG90舵機(jī)、控制芯片STM32;使用STM32的內(nèi)部資源有:TIM定時(shí)器。REF_Ref38580188\h圖5-3為機(jī)器人運(yùn)動(dòng)控制流程圖圖5SEQ圖\*ARABIC\s13機(jī)器人運(yùn)動(dòng)控制此部分程序設(shè)計(jì)目的在于利用單片機(jī)內(nèi)部的定時(shí)器產(chǎn)生PWM,來控制舵機(jī)輸出軸的位置。而定時(shí)器產(chǎn)生的PWM波,實(shí)際上就是在其IO口輸出通道上高電平和低電平所持續(xù)的時(shí)間。本次研究中,控制舵機(jī)的PWM波信號(hào)分別是由STM32中的高級(jí)定時(shí)器TIM1以及通用定時(shí)器TIM2產(chǎn)生的。其中,TIM1通道1產(chǎn)生的PWM波是根據(jù)MPU6050傳感器得到的數(shù)據(jù)產(chǎn)生的用來控制SG90舵機(jī)的;TIM2產(chǎn)生的PWM波是根據(jù)ADC轉(zhuǎn)換后的數(shù)據(jù)產(chǎn)生的用來控制MG955舵機(jī)。定時(shí)器是STM32單片機(jī)中的一個(gè)外設(shè)資源,因此在調(diào)用定時(shí)器功能之前,需對(duì)定時(shí)器進(jìn)行初始化設(shè)置。接下來,以定時(shí)器TIM1的初始化為例,詳細(xì)講解定時(shí)器初始化的過程。因?yàn)橛玫蕉〞r(shí)器TIM1、輸入通道1即IO接口PA8,因此需要對(duì)其時(shí)鐘進(jìn)行使能,如下:RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1,ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);完成時(shí)鐘配置后,對(duì)其輸入通道進(jìn)行設(shè)置:GPIO_InitStructure.GPIO_Pin=GPIO_Pin_8;GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;GPIO_Init(GPIOA,&GPIO_InitStructure);接著就是對(duì)定時(shí)器TIM1的模式設(shè)置,其中主要的內(nèi)容就是其時(shí)基結(jié)構(gòu)體的初始化以及輸出結(jié)構(gòu)體的初始化。時(shí)基結(jié)構(gòu)體程序設(shè)計(jì)如下:TIM_TimeBaseInitTypeDefTIM_TimeBaseStructure; TIM_TimeBaseStructure.TIM_Period=arr;//設(shè)置在下一個(gè)更新事件裝入活動(dòng)的自動(dòng)重裝載寄存器周期的值 80K TIM_TimeBaseStructure.TIM_Prescaler=psc;//設(shè)置用來作為TIMx時(shí)鐘頻率除數(shù)的預(yù)分頻值不分頻 TIM_TimeBaseStructure.TIM_ClockDivision=0;//設(shè)置時(shí)鐘分割:TDTS=Tck_tim TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;//計(jì)數(shù)器計(jì)數(shù)模式設(shè)置為向上計(jì)數(shù) TIM_TimeBaseInit(TIM1,&TIM_TimeBaseStructure);//初始化定時(shí)器TIM1輸出結(jié)構(gòu)體程序設(shè)計(jì)如下:TIM_OCInitTypeDefTIM_OCInitStructure; TIM_OCInitStructure.TIM_OCMode=TIM_OCMode_PWM2;//配置為PWM模式2 TIM_OCInitStructure.TIM_OutputState=TIM_OutputState_Enable;//比較輸出使能 TIM_OCInitStructure.TIM_Pulse=0;//設(shè)置待裝入捕獲比較寄存器的脈沖值 TIM_OCInitStructure.TIM_OCPolarity=TIM_OCPolarity_High;//輸出通道電平極性配置:TIM輸出比較極性高 TIM_OC1Init(TIM1,&TIM_OCInitStructure);//初始化TIM1最后使能其計(jì)數(shù)器。即TIM_Cmd(TIM1,ENABLE);TIM_CtrlPWMOutputs(TIM1,ENABLE);//僅僅限于高級(jí)定時(shí)器。其中,值得注意的是,本次研究采用了兩個(gè)定時(shí)器TIM1和TIM2來產(chǎn)生PWM波從而實(shí)現(xiàn)舵機(jī)的控制.所以在定時(shí)器TIM2初始化的過程中,無需添加最好的主使能輸出程序。關(guān)于定時(shí)器TIM1的初始化完成,接下來就是關(guān)于定時(shí)器TIM2的初始化。其程序設(shè)計(jì)如下/*初始化TIM2*/voidTIM2_PWM_Init(u16arr,u16psc){ GPIO_InitTypeDefGPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM2,ENABLE);//用到定時(shí)器TIM2,需要使能TIM3時(shí)鐘 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//用到PA0接口,需要使能GPIOA時(shí)鐘 RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);//用到AFIO,需使能時(shí)鐘 GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0;//設(shè)置輸出端口PA0 GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;//復(fù)用推挽輸出 GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;//50MHZ GPIO_Init(GPIOA,&GPIO_InitStructure);//GPIOA初始化 GPIO_InitStructure.GPIO_Pin=GPIO_Pin_1;//設(shè)置輸出端口PA1 GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;//復(fù)用推挽輸出 GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;//50MHZ GPIO_Init(GPIOA,&GPIO_InitStructure);//GPIOA初始化 GPIO_InitStructure.GPIO_Pin=GPIO_Pin_2;//設(shè)置輸出端口PA2 GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;//復(fù)用推挽輸出 GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;//50MHZ GPIO_Init(GPIOA,&GPIO_InitStructure);//GPIOA初始化 GPIO_InitStructure.GPIO_Pin=GPIO_Pin_3;//設(shè)置輸出端口PA3 GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;//復(fù)用推挽輸出 GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;//50MHZ GPIO_Init(GPIOA,&GPIO_InitStructure);//GPIOA初始化 TIM_TimeBaseInitTypeDefTIM_TimeBaseStructure; TIM_TimeBaseStructure.TIM_Period=arr;//設(shè)置在下一個(gè)更新事件裝入活動(dòng)的自動(dòng)重裝載寄存器周期的值 TIM_TimeBaseStructure.TIM_Prescaler=psc;//設(shè)置用來作為TIMx時(shí)鐘頻率除數(shù)的預(yù)分頻值不分頻 TIM_TimeBaseStructure.TIM_ClockDivision=0;//設(shè)置時(shí)鐘分割:TDTS=Tck_tim TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;//計(jì)數(shù)器計(jì)數(shù)模式設(shè)置為向上計(jì)數(shù) TIM_TimeBaseInit(TIM2,&TIM_TimeBaseStructure);//初始化定時(shí)器TIM2 TIM_OCInitTypeDefTIM_OCInitStructure; TIM_OCInitStructure.TIM_OCMode=TIM_OCMode_PWM2;//配置為PWM模式2 TIM_OCInitStructure.TIM_OutputState=TIM_OutputState_Enable;//比較輸出使能 TIM_OCInitStructure.TIM_Pulse=0;//設(shè)置待裝入捕獲比較寄存器的脈沖值 TIM_OCInitStructure.TIM_OCPolarity=TIM_OCPolarity_High;//輸出通道電平極性配置:TIM輸出比較極性高 TIM_OC1Init(TIM2,&TIM_OCInitStructure);//初始化TIM2CH1通道 TIM_OC2Init(TIM2,&TIM_OCInitStructure);//初始化TIM2CH2通道 TIM_OC3Init(TIM2,&TIM_OCInitStructure);//初始化TIM2CH3通道 TIM_OC4Init(TIM2,&TIM_OCInitStructure);//初始化TIM2CH4通道 TIM_OC1PreloadConfig(TIM2,TIM_OCPreload_Enable);//CH1通道預(yù)裝載使能 TIM_OC2PreloadConfig(TIM2,TIM_OCPreload_Enable);//CH2通道預(yù)裝載使能 TIM_OC3PreloadConfig(TIM2,TIM_OCPreload_Enable);//CH3通道預(yù)裝載使能 TIM_OC4PreloadConfig(TIM2,TIM_OCPreload_Enable);//CH4通道預(yù)裝載使能 TIM_ARRPreloadConfig(TIM1,ENABLE);//使能TIMx在ARR上的預(yù)裝載寄存器 TIM_Cmd(TIM2,ENABLE);//使能TIM2}至此,所需的單片機(jī)外設(shè)定時(shí)器完成初始化之后,接下來就是主函數(shù)中調(diào)節(jié)占空比生成PWM波,以此來控制舵機(jī)轉(zhuǎn)動(dòng)的角度。其實(shí)現(xiàn)程序代碼如下:intmain(void){delay_init();TIM1_PWM_Init(1999,719);while(1)delay_ms(100);TIM_SetCompare2(TIM1,1750);TIM_SetCompare2(TIM1,1800);TIM_SetCompare2(TIM1,1850);TIM_SetCompare2(TIM1,1900);TIM_SetCompare2(TIM1,1945);}}總結(jié)通過這次畢業(yè)設(shè)計(jì),我充分了解到了手勢(shì)機(jī)器人在日后智能領(lǐng)域發(fā)展的重要性。它的出現(xiàn)能夠?qū)⑻摂M與現(xiàn)實(shí)很好地連接在一起,在不同領(lǐng)域上,滿足了各種各樣的需求。例如,將其投入到工業(yè)生產(chǎn)中,免除了人手直接投入機(jī)器作業(yè)帶來的安全風(fēng)險(xiǎn);投入到游戲中,可以增強(qiáng)人們對(duì)虛擬控制的感受。本次設(shè)計(jì),基于STM32單機(jī),以數(shù)據(jù)手套的方式來實(shí)現(xiàn)手勢(shì)控制。不可避免地,在設(shè)計(jì)的過程中我也碰到了大大小小的難題。例如數(shù)據(jù)手套的設(shè)計(jì)。我在網(wǎng)上查閱大量的資料后,總結(jié)出設(shè)計(jì)數(shù)據(jù)手套的需要硬件設(shè)備:柔性彎曲光纖傳感器和MPU6050傳感器后,再根據(jù)STM32中的外設(shè)資源:ADC模數(shù)轉(zhuǎn)換、IIC通信模塊實(shí)現(xiàn)數(shù)據(jù)手套與STM32單片機(jī)之間的通信。在MDK軟件上在標(biāo)準(zhǔn)庫(kù)中調(diào)用相應(yīng)的程序并進(jìn)行編寫。而后,在根據(jù)得到的信息利用單片機(jī)中的定時(shí)器生成控制信號(hào)。雖然,最后所編寫的程序都能夠編譯成功,但遺憾的是,我沒有成功地實(shí)現(xiàn)軟件仿真??偟膩碚f,這次的畢業(yè)設(shè)計(jì)我的收獲是還是非常多的。雖然說,這次的畢業(yè)設(shè)計(jì)是我四年課程學(xué)習(xí)下來的一個(gè)總結(jié),但這過程之中我還是在不斷地學(xué)習(xí)新的知識(shí)。這就正正好說明了,任何一件事的結(jié)束都是學(xué)習(xí)另外一件事的開始。這也警示了我在畢業(yè)設(shè)計(jì)結(jié)束后,繼續(xù)向前學(xué)習(xí)。參考文獻(xiàn)[1]李寧.基于MDK的STM32處理器開發(fā)應(yīng)用.北京航空航天大學(xué)出版社.2008.10[2]劉軍.例說STM32.北京航空航天大學(xué)出版社.2011.4[3]劉火良,楊森.STM32庫(kù)開發(fā)實(shí)戰(zhàn)指南[M].機(jī)械工業(yè)出版社.2013.5[4]明日科技.C語言從入門到精通[M].清華大學(xué)出版社,2012.9[5]李寧.ARMMCU開發(fā)工具M(jìn)DK使用入門[M].北京航空航天大學(xué)出版社.2012.01[6]楊晨光,李智軍,許揚(yáng).機(jī)器人仿真與編程技術(shù).清華大學(xué)出版社.2010.02[7]黃志堅(jiān).機(jī)器人驅(qū)動(dòng)與控制及應(yīng)用實(shí)例.化學(xué)工業(yè)出版社.2016.06[8]沈紅衛(wèi).STM32單片機(jī)應(yīng)用與全案例實(shí)踐.電子工業(yè)出版社.2017.06[9]屈微,王志良.STM32單片機(jī)應(yīng)用基礎(chǔ)與項(xiàng)目實(shí)踐.清華大學(xué)出版社.2019[10]桑勝舉,王太雷.單片機(jī)原理與接口技術(shù).電子工業(yè)出版社.2018.01[11]張淑清,胡永濤,張立國(guó).嵌入式單片機(jī)STM32原理及應(yīng)用.機(jī)械工業(yè)出版社.2019.10[12]丁源,李秀峰.UGNX8.0中文版從入門到精通[M].清華大學(xué)出版社.2013.01[13]楊素行.模擬電子技術(shù)基礎(chǔ)簡(jiǎn)明教程[M].高等教育出版社.2006.05[14]郭天祥.新概念51單片機(jī)C語言教程:入門、提高、開發(fā)、拓展全攻略[M].電子工業(yè)出版社.2009.01[15]張洋,劉軍.原子教你玩STM32(庫(kù)函數(shù)版).北京航天航空大學(xué)出版社.2015.11謝辭朝看水東流,暮看日西沉。轉(zhuǎn)眼間,我的四年大學(xué)生涯也接近了尾聲。在此我想對(duì)大學(xué)里教導(dǎo)過我的每一位老師,幫助過我的每一位同學(xué)說聲感謝。大二的時(shí)候,我曾經(jīng)想過轉(zhuǎn)專業(yè),因?yàn)榻?jīng)過大一一年的學(xué)習(xí),我的成績(jī)并不理想且自己也感覺到學(xué)習(xí)專業(yè)知識(shí)的吃力。班導(dǎo)師在了解到我的想法之后,對(duì)我進(jìn)行了開導(dǎo)并勸我再堅(jiān)持學(xué)一學(xué)期,如果堅(jiān)持不下去了再轉(zhuǎn)。就這樣,我堅(jiān)持了四年。當(dāng)然,我的堅(jiān)持也離不開我的老師和同學(xué)對(duì)我的幫助。在我作業(yè)寫不出來的時(shí)候,我的同學(xué)會(huì)耐心地講解知識(shí)并給我勾畫重點(diǎn);在我做課設(shè)調(diào)試不出實(shí)驗(yàn)結(jié)果的時(shí)候,他們會(huì)主動(dòng)幫助我調(diào)試并且規(guī)整我的使用方法。而我的老師,也會(huì)經(jīng)常詢問我們的學(xué)習(xí)情況,還會(huì)根據(jù)我們所能接受的方式調(diào)整教學(xué)計(jì)劃。在他們大大小小的幫助下,我結(jié)束了一次次的考試,完成了一次次的課設(shè),最終來到最后的畢業(yè)設(shè)計(jì)。在進(jìn)行畢業(yè)設(shè)計(jì)的過程,我也遇到了大大小小的問題。一開始,因?yàn)閷?shí)習(xí)工作的事情導(dǎo)致前期的設(shè)計(jì)進(jìn)度有點(diǎn)跟不上,我的組員每次都認(rèn)真地把我錯(cuò)過的重要信息轉(zhuǎn)達(dá)給我。因?yàn)橐咔樵?,我們畢業(yè)生遲遲不能開學(xué),不能當(dāng)面與導(dǎo)師進(jìn)行溝通。我的導(dǎo)師吳明友老師則通過微信的方式來了解我們的畢業(yè)設(shè)計(jì)進(jìn)展情況,還積極地學(xué)習(xí)視頻會(huì)議對(duì)我們的論文進(jìn)行查看并給出指導(dǎo)性意見。我的課題組員們也會(huì)經(jīng)常性督促我完成論文制作,遇到不確定的功能問題也會(huì)積極地組織商議。在這次畢業(yè)論文的制作中,我希望我能完整地展現(xiàn)出我這四年的所學(xué)所獲。讓我在這大學(xué)四年的生涯里畫上圓滿的句號(hào)。最后,再一次感謝幫助過我的每一位老師、同學(xué)。

HYPERLINK如何給電腦重做系統(tǒng)給電腦重做系統(tǒng),自己學(xué)學(xué),可少花錢,哈哈[圖]

一、準(zhǔn)備工作:

如何重裝電腦系統(tǒng)

首先,在啟動(dòng)電腦的時(shí)候按住DELETE鍵進(jìn)入BIOS,選擇AdvancedBIOSFeatures選項(xiàng),按Enter鍵進(jìn)入設(shè)置程序。選擇FirstBootDevice選項(xiàng),然后按鍵盤上的PageUp或PageDown鍵將該項(xiàng)設(shè)置為CD-ROM,這樣就可以把系統(tǒng)改為光盤啟動(dòng)。

其次,退回到主菜單,保存BIOS設(shè)置。(保存方法是按下F10,然后再按Y鍵即可)

1.準(zhǔn)備好WindowsXPProfessional簡(jiǎn)體中文版安裝光盤,并檢查光驅(qū)是否支持自啟動(dòng)。

2.可能的情況下,在運(yùn)行安裝程序前用磁盤掃描程序掃描所有硬盤檢查硬盤錯(cuò)誤并進(jìn)行修復(fù),否則安裝程序運(yùn)行時(shí)如檢查到有硬盤錯(cuò)誤即會(huì)很麻煩。

3.用紙張記錄安裝文件的產(chǎn)品密匙(安裝序列號(hào))。

4.可能的情況下,用驅(qū)動(dòng)程序備份工具(如:驅(qū)動(dòng)精靈2004V1.9Beta.exe)將原WindowsXP下的所有驅(qū)動(dòng)程序備份到硬盤上(如∶F:Drive)。最好能記下主板、網(wǎng)卡、顯卡等主要硬件的型號(hào)及生產(chǎn)廠家,預(yù)先下載驅(qū)動(dòng)程序備用。

5.如果你想在安裝過程中格式化C盤或D盤(建議安裝過程中格式化C盤),請(qǐng)備份C盤或D盤有用的數(shù)據(jù)。

二、用光盤啟動(dòng)系統(tǒng):

(如果你已經(jīng)知道方法請(qǐng)轉(zhuǎn)到下一步),重新啟動(dòng)系統(tǒng)并把光驅(qū)設(shè)為第一啟動(dòng)盤,保存設(shè)置并重啟。將XP安裝光盤放入光驅(qū),重新啟動(dòng)電腦。剛啟動(dòng)時(shí),當(dāng)出現(xiàn)如下圖所示時(shí)快速按下回車鍵,否則不能啟動(dòng)XP系統(tǒng)光盤安裝。如果你不知道具體做法請(qǐng)參考與這相同的-->如何進(jìn)入純DOS系統(tǒng):

光盤自啟動(dòng)后,如無意外即可見到安裝界面,將出現(xiàn)如下圖1所示

查看原圖

全中文提示,“要現(xiàn)在安裝WindowsXP,請(qǐng)按ENTER”,按回車鍵后,出現(xiàn)如下圖2所示

查看原圖

許可協(xié)議,這里沒有選擇的余地,按“F8”后如下圖3

HYPERLINK

查看原圖

這里用“向下或向上”方向鍵選擇安裝系統(tǒng)所用的分區(qū),如果你已格式化C盤請(qǐng)選擇C分區(qū),選擇好分區(qū)后按“Enter”鍵回車,出現(xiàn)下圖4所示

查看原圖

這里對(duì)所選分區(qū)可以進(jìn)行格式化,從而轉(zhuǎn)換文件系統(tǒng)格,或保存現(xiàn)有文件系統(tǒng),有多種選擇的余地,但要注意的是NTFS格式可節(jié)約磁盤空間提高安全性和減小磁盤碎片但同時(shí)存在很多問題MacOS和98/Me下看不到NTFS格式的分區(qū),在這里選“用FAT文件系統(tǒng)格式化磁盤分區(qū)(快),按“Enter”鍵回車,出現(xiàn)下圖5所示

查看原圖

格式化C盤的警告,按F鍵將準(zhǔn)備格式化c盤,出現(xiàn)下圖6所示

HYPERLINK

查看原圖

由于所選分區(qū)C的空間大于2048M(即2G),FAT文件系統(tǒng)不支持大于2048M的磁盤分區(qū),所以安裝程序會(huì)用FAT32文件系統(tǒng)格式對(duì)C盤進(jìn)行格式化,按“Enter”鍵回車,出現(xiàn)下圖7所示

查看原圖圖7中正在格式化C分區(qū);只有用光盤啟動(dòng)或安裝啟動(dòng)軟盤啟動(dòng)XP安裝程序,才能在安裝過程中提供格式化分區(qū)選項(xiàng);如果用MS-DOS啟動(dòng)盤啟動(dòng)進(jìn)入DOS下,運(yùn)行i386\winnt進(jìn)行安裝XP時(shí),安裝XP時(shí)沒有格式化分區(qū)選項(xiàng)。格式化C分區(qū)完成后,出現(xiàn)下圖8所示

被過濾廣告

查看原圖

圖8中開始復(fù)制文件,文件復(fù)制完后,安裝程序開始初始化Windows配置。然后系統(tǒng)將會(huì)自動(dòng)在15秒后重新啟動(dòng)。重新啟動(dòng)后,出現(xiàn)下圖9所示

HYPERLINK

查看原圖

9

查看原圖

過5分鐘后,當(dāng)提示還需33分鐘時(shí)將出現(xiàn)如下圖10

HYPERLINK

查看原圖

區(qū)域和語言設(shè)置選用默認(rèn)值就可以了,直接點(diǎn)“下一步”按鈕,出現(xiàn)如下圖11

查看原圖

這里輸入你想好的姓名和單位,這里的姓名是你以后注冊(cè)的用戶名,點(diǎn)“下一步”按鈕,出現(xiàn)如下圖12

HYPERLINK

查看原圖

如果你沒有預(yù)先記下產(chǎn)品密鑰(安裝序列號(hào))就大件事啦!這里輸入安裝序列號(hào),點(diǎn)“下一步”按鈕,出現(xiàn)如下圖13

HYPERLINK

查看原圖

安裝程序自動(dòng)為你創(chuàng)建又長(zhǎng)又難看的計(jì)算機(jī)名稱,自己可任意更改,輸入兩次系統(tǒng)管理員密碼,請(qǐng)記住這個(gè)密碼,Administrator系統(tǒng)管理員在系統(tǒng)中具有

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(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)論