基于MPU的INS慣性導(dǎo)航和實(shí)時(shí)姿態(tài)檢測系統(tǒng)(完整資料)_第1頁
基于MPU的INS慣性導(dǎo)航和實(shí)時(shí)姿態(tài)檢測系統(tǒng)(完整資料)_第2頁
基于MPU的INS慣性導(dǎo)航和實(shí)時(shí)姿態(tài)檢測系統(tǒng)(完整資料)_第3頁
基于MPU的INS慣性導(dǎo)航和實(shí)時(shí)姿態(tài)檢測系統(tǒng)(完整資料)_第4頁
基于MPU的INS慣性導(dǎo)航和實(shí)時(shí)姿態(tài)檢測系統(tǒng)(完整資料)_第5頁
已閱讀5頁,還剩201頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

基于MPU的INS慣性導(dǎo)航和實(shí)時(shí)姿態(tài)檢測系統(tǒng)(完整資料)(可以直接使用,可編輯優(yōu)秀版資料,歡迎下載)

基于MPU6050的INS慣性導(dǎo)航和實(shí)時(shí)姿態(tài)檢測系統(tǒng)基于MPU的INS慣性導(dǎo)航和實(shí)時(shí)姿態(tài)檢測系統(tǒng)(完整資料)(可以直接使用,可編輯優(yōu)秀版資料,歡迎下載)項(xiàng)目目標(biāo)及功能說明項(xiàng)目目標(biāo)學(xué)習(xí)使用正點(diǎn)原子探索者開發(fā)板,并熟悉開發(fā)板上的MPU6050六軸傳感器的工作原理和各函數(shù)的調(diào)用過程.同時(shí)學(xué)習(xí)開發(fā)板的擴(kuò)展接口,嘗試在開發(fā)板上擴(kuò)展藍(lán)牙模塊,并實(shí)現(xiàn)開發(fā)板與手機(jī)等含有藍(lán)牙模塊的電子設(shè)備通過藍(lán)牙連接并進(jìn)行數(shù)據(jù)的傳輸。在完成上述內(nèi)容的基礎(chǔ)上,實(shí)現(xiàn)將MPU6050六軸傳感器的加速度計(jì)和陀螺儀的數(shù)據(jù)傳送到手機(jī)上,在手機(jī)上實(shí)現(xiàn)陀螺儀的變化效果展示。同時(shí)通過串口將MPU6050數(shù)據(jù)傳送到電腦上,通過Mat(yī)lab編程處理數(shù)據(jù),實(shí)現(xiàn)慣性導(dǎo)航的簡單展示。系統(tǒng)功能說明系統(tǒng)最主要的功能有兩個(gè):一個(gè)是在手機(jī)端能夠展示開發(fā)板上MPU6050陀螺儀的姿態(tài)變化,通過一個(gè)立方體的轉(zhuǎn)動來表示陀螺儀的轉(zhuǎn)動;另一個(gè)是在電腦端能夠讀取MPU6050的數(shù)據(jù),并通過對數(shù)據(jù)的處理還原數(shù)據(jù)中存儲的MPU6050的姿態(tài)變化,簡單展現(xiàn)出慣性導(dǎo)航的效果.在實(shí)現(xiàn)系統(tǒng)最主要的兩個(gè)功能過程中,還需要實(shí)現(xiàn)一些基礎(chǔ)功能.開發(fā)板能夠通過藍(lán)牙與手機(jī)連接并傳輸數(shù)據(jù);開發(fā)板能夠通過串口將數(shù)據(jù)發(fā)送出去;在電腦端能夠讀取開發(fā)板上串口輸出的數(shù)據(jù)等。需求分析慣性導(dǎo)航系統(tǒng)用于各種運(yùn)動機(jī)具中,包括飛機(jī)、潛艇、航天飛機(jī)等運(yùn)輸工具及導(dǎo)彈,然而成本及復(fù)雜性限制了其可以應(yīng)用的場合.但是,存在一種情形:衛(wèi)星一旦突然因故障、敵方打擊或干擾(如太陽風(fēng)暴)等原因無法提供服務(wù),這對依賴GPS、北斗等衛(wèi)星導(dǎo)航系統(tǒng)作為唯一PNT(Position、Navigation、Time)信息來源的系統(tǒng)來說可能是致命的災(zāi)難。作為目前為止衛(wèi)星導(dǎo)航系統(tǒng)最好的備援—-慣性導(dǎo)航系統(tǒng)(INS),將于屆時(shí)發(fā)揮出巨大的作用,其精度完全可以媲美GPS等衛(wèi)星導(dǎo)航系統(tǒng)。并且它不需要外部參考就可確定當(dāng)前位置、方向及速度,從而使它自然地不受外界的干擾和欺騙。定位、導(dǎo)航和授時(shí)服務(wù)對軍隊(duì)而言就像氧氣對人類一樣不可或缺,因此通過研究新機(jī)理、研制新設(shè)備、開發(fā)新算法,以擺脫人員和系統(tǒng)設(shè)備對GPS的依賴,具有極大的戰(zhàn)略意義。姿態(tài)監(jiān)測系統(tǒng)可廣泛應(yīng)用于關(guān)鍵資產(chǎn)姿態(tài)變化的無線實(shí)時(shí)監(jiān)控。由于目前移動智能終端設(shè)備的數(shù)量和質(zhì)量逐步提升,因此,通過計(jì)算機(jī)上傳統(tǒng)的上位機(jī)軟件進(jìn)行姿態(tài)監(jiān)測,逐漸暴露出了自身的缺點(diǎn)——串口傳輸無法實(shí)現(xiàn)無線監(jiān)測、計(jì)算機(jī)相比智能終端便攜性極差.因此,使用無線傳輸(藍(lán)牙、紅外、WIFI、GSM等)的技術(shù),開發(fā)一款在移動智能終端可以實(shí)時(shí)顯示物體姿態(tài)的應(yīng)用,具有很高的實(shí)用價(jià)值和廣泛的市場應(yīng)用前景。開發(fā)環(huán)境移動終端操作系統(tǒng):?Android4.4.4KitKat計(jì)算機(jī)操作系統(tǒng):Windows8.1Prox64串口開發(fā):?MATLABR2014a開發(fā)板IDE: KeiluVision5AndroidIDE:EclipseJavaEEIDEforWebDevelopersAndroidDevelopmentToolkit23。0.4。1468518項(xiàng)目進(jìn)展情況到目前為止,我組已實(shí)現(xiàn)了以下功能:STM32F4開發(fā)板上MPU6050六軸傳感器的數(shù)據(jù)獲取并顯示在LCD屏幕上。在LCD屏幕上繪出圓形圖案,且圓形圖案能根據(jù)MPU6050六軸傳感器的姿態(tài)變化而運(yùn)動,傳感器傾斜角度越大,圖案運(yùn)動速度越快。擴(kuò)展藍(lán)牙模塊,能通過藍(lán)牙模塊與手機(jī)連接并進(jìn)行數(shù)據(jù)通信。根據(jù)函數(shù)提供的幀格式定義數(shù)據(jù)幀,并通過USART接口將數(shù)據(jù)幀傳給PC端。在手機(jī)端能根據(jù)藍(lán)牙獲取的MPU6050六軸傳感器的陀螺儀數(shù)據(jù)繪出立方體,立方體能在可接受的時(shí)間延遲內(nèi)實(shí)時(shí)展現(xiàn)MPU6050的姿態(tài)變化(轉(zhuǎn)動方向和角度)。在PC端能通過對從USART接口獲取的數(shù)據(jù)幀進(jìn)行解析獲?。停校?050加速度傳感器和陀螺儀的數(shù)據(jù),并根據(jù)數(shù)據(jù)幀中設(shè)置的校驗(yàn)位進(jìn)行數(shù)據(jù)校驗(yàn)。在PC端能根據(jù)解析出的加速度傳感器和陀螺儀數(shù)據(jù),在可接受的誤差范圍內(nèi)還原MPU6050的姿態(tài)變化(包括位移、轉(zhuǎn)動方向和角度),實(shí)現(xiàn)一個(gè)簡單的慣性導(dǎo)航系統(tǒng).系統(tǒng)設(shè)計(jì)IIC總線工作原理總線的構(gòu)成及信號類型I2C總線是由數(shù)據(jù)線SDA和時(shí)鐘SCL構(gòu)成的串行總線,可發(fā)送和接收數(shù)據(jù)。在CPU與被控IC之間、IC與IC之間進(jìn)行雙向傳送,最高傳送速率100kbps。各種被控制電路均并聯(lián)在這條總線上,但就像電話機(jī)一樣只有撥通各自的號碼才能工作,所以每個(gè)電路和模塊都有唯一的地址,在信息的傳輸過程中,I2C總線上并接的每一模塊電路既是主控器(或被控器),又是發(fā)送器(或接收器),這取決于它所要完成的功能。CPU發(fā)出的控制信號分為地址碼和控制量兩部分,地址碼用來選址,即接通需要控制的電路,確定控制的種類;控制量決定該調(diào)整的類別(如對比度、亮度等)及需要調(diào)整的量。這樣,各控制電路雖然掛在同一條總線上,卻彼此獨(dú)立,互不相關(guān)。I2C總線在傳送數(shù)據(jù)過程中共有三種類型信號,它們分別是:開始信號、結(jié)束信號和應(yīng)答信號。開始信號:SCL為高電平時(shí),SDA由高電平向低電平跳變,開始傳送數(shù)據(jù)。結(jié)束信號:SCL為低電平時(shí),SDA由低電平向高電平跳變,結(jié)束傳送數(shù)據(jù)。應(yīng)答信號:接收數(shù)據(jù)的IC在接收到8bit數(shù)據(jù)后,向發(fā)送數(shù)據(jù)的IC發(fā)出特定的低電平脈沖,表示已收到數(shù)據(jù)。CPU向受控單元發(fā)出一個(gè)信號后,等待受控單元發(fā)出一個(gè)應(yīng)答信號,CPU接收到應(yīng)答信號后,根據(jù)實(shí)際情況做出是否繼續(xù)傳遞信號的判斷。若未收到應(yīng)答信號,由判斷為受控單元出現(xiàn)故障。這些信號中,開始信號是必須的,結(jié)束信號和應(yīng)答信號都可以不要,IIC總線時(shí)序圖如圖5.1。1—1所示。圖STYLEREF3\s5。1SEQ圖\*ARABIC\s31IIC總線時(shí)序圖探索者STM32F4開發(fā)板板載的EEPROM芯片型號為24C02.該芯片的總?cè)萘繛?56字節(jié),通過IIC總線與外部連接。STM32F4開發(fā)板有硬件IIC,但是設(shè)計(jì)的比較復(fù)雜,而且穩(wěn)定性不好,所以我組使用GPIO軟件模擬IIC來對24C02進(jìn)行讀寫。同時(shí)使用軟件更具有移植性,只要有IO口,將軟件移植過去就能使用模擬的IIC,而硬件必須MCU的支持。硬件設(shè)計(jì)實(shí)現(xiàn)模擬IIC需要用到的硬件資源有:串口(USMART)、GPIO、24C02。圖STYLEREF3\s5.1SEQ圖\*ARABIC\s32STM32F4與24C02連接圖我組通過GPIO來模擬IIC,24C2的SCL和SDA分別連在GPIO_PB8和GPIO_PB9上,連接關(guān)系如圖5。1.2-1。MPU6050工作原理MPU6050引腳圖STYLEREF3\s5。2SEQ圖\*ARABIC\s31MPU6050結(jié)構(gòu)圖模塊外觀如圖5.2.1—2所示:圖STYLEREF3\s5.2SEQ圖\*ARABIC\s32MPU6050實(shí)物圖圖STYLEREF3\s5。2SEQ圖\*ARABIC\s33MPU6050內(nèi)部邏輯框圖如圖5.2。1-1為MPU6050六軸傳感器的結(jié)構(gòu)圖,總共有24個(gè)引腳,而圖5。2。1-2為MPU6050的內(nèi)部邏輯框圖,描述了MPU6050內(nèi)部的模塊結(jié)構(gòu),以及各引腳的連接情況.表STYLEREF4\s5。2。1SEQ表\*ARABIC\s41MPU6050引腳輸出和信號描述表5。2.1—1對每一個(gè)引腳的名稱和作用進(jìn)行了說明。在上述引腳中,SCL和SDA是連接MCU的IIC接口,MCU通過這個(gè)IIC接口來控制MPU6050.另外還有一個(gè)IIC接口,連接的引腳為AUX_CL和AUX_DA,這個(gè)接口可用來連接外部從設(shè)備,比如磁傳感器,這樣就可以與MPU6050組成一個(gè)九軸傳感器.VLOGIC是IO口電壓,該引腳最低可以到1。8V,我們一般直接VDD即可.AD0是從IIC接口(接MCU)的地址控制引腳,該引腳控制IIC地址的最低位,如果接GND,則MPU6050的IIC地址是0X68;如果接VDD,則是0X69。注意:這里的地址是不包含數(shù)據(jù)傳輸?shù)淖畹臀坏模ㄗ畹臀挥脕肀硎咀x寫).在探索者STM32F4開發(fā)板上,AD0是接GND的,即MPU6050的IIC地址是0X68(不含最低位)。硬件設(shè)計(jì)圖STYLEREF3\s5。2SEQ圖\*ARABIC\s34MPU6050與STM32F4的連接電路圖從圖5.2。2-1可以看出,MPU6050通過三根線與STM32F4開發(fā)板連接,其中IIC總線時(shí)和24C02以及WM8978共用,接在PB8和PB9上面.MPU6050的中斷輸出,連接在STM32F4的PC0腳,不過本例程我們并沒有用到中斷。另外,AD0接的GND,所以MPU6050的器件地址是:0X68。初始化操作在使用STM32F4讀取MPU6050的加速度和角度傳感器數(shù)據(jù)之前,需要做以下初始化操作:初始化IIC接口MPU6050采用IIC與STM32F4通信,所以我們需要先初始化與MPU6050連接的SDA和SCL數(shù)據(jù)線。復(fù)位MPU6050這一步讓MPU6050內(nèi)部所有寄存器恢復(fù)默認(rèn)值,通過對電源管理寄存器1(0X6B)的bit7寫1實(shí)現(xiàn).復(fù)位后,電源管理寄存器1恢復(fù)默認(rèn)值(0X40),然后必須設(shè)置該寄存器為0X00,以喚醒MPU6050,進(jìn)入正常工作狀態(tài)。設(shè)置角速度傳感器(陀螺儀)和加速度傳感器的滿量程范圍這一步,我們設(shè)置兩個(gè)傳感器的滿量程范圍(FSR),分別通過陀螺儀配置寄存器(0X1B)和加速度傳感器配置寄存器(0X1C)設(shè)置。我們一般設(shè)置陀螺儀的滿量程范圍為±2000dps,加速度傳感器的滿量程范圍為±2g。設(shè)置其他參數(shù)這里,我們還需要配置的參數(shù)有:關(guān)閉中斷、關(guān)閉AUXIIC接口、禁止FIFO、設(shè)置陀螺儀采樣率和設(shè)置數(shù)字低通濾波器(DLPF)等。本章我們不用中斷方式讀取數(shù)據(jù),所以關(guān)閉中斷,然后也沒用到AUXIIC接口外接其他傳感器,所以也關(guān)閉這個(gè)接口.分別通過中斷使能寄存器(0X38)和用戶控制寄存器(0X6A)控制。MPU6050可以使用FIFO存儲傳感器數(shù)據(jù),不過本章我們沒有用到,所以關(guān)閉所有FIFO通道,這個(gè)通過FIFO使能寄存器(0X23)控制,默認(rèn)都是0(即禁止FIFO),所以用默認(rèn)值就可以了。陀螺儀采樣率通過采樣率分頻寄存器(0X19)控制,這個(gè)采樣率我們一般設(shè)置為50即可。數(shù)字低通濾波器(DLPF)則通過配置寄存器(0X1A)設(shè)置,一般設(shè)置DLPF為帶寬的1/2即可。配置系統(tǒng)時(shí)鐘源并使能角速度傳感器和加速度傳感器系統(tǒng)時(shí)鐘源同樣是通過電源管理寄存器1(0X1B)來設(shè)置,該寄存器的最低三位用于設(shè)置系統(tǒng)時(shí)鐘源選擇,默認(rèn)值是0(內(nèi)部8MRC震蕩),不過我們一般設(shè)置為1,選擇x軸陀螺PLL作為時(shí)鐘源,以獲得更高精度的時(shí)鐘。同時(shí),使能角速度傳感器和加速度傳感器,這兩個(gè)操作通過電源管理寄存器2(0X6C)來設(shè)置,設(shè)置對應(yīng)位為0即可開啟。相關(guān)寄存器在讀取MPU6050數(shù)據(jù)中主要用到了以下寄存器:PowerManagement1(電源管理寄存器1)表STYLEREF4\s5.2。4SEQ表\*ARABIC\s41電源管理寄存器1各位描述如表5。2.4—1,寄存器地址為0x6B。DEVICE_RESET位用來控制復(fù)位,設(shè)置為1,復(fù)位MPU6050,復(fù)位結(jié)束后,MPU硬件自動清零該位;SLEEEP位用于控制MPU6050的工作模式,復(fù)位后,該位為1,即進(jìn)入了睡眠模式(低功耗),所以我們要清零該位,以進(jìn)入正常工作模式;TEMP_DIS用于設(shè)置是否使能溫度傳感器,設(shè)置為0,則使能;CLKSEL[2:0]用于選擇系統(tǒng)時(shí)鐘源,選擇關(guān)系如表5.2.4-2所示,默認(rèn)是使用內(nèi)部8MRC晶振的,精度不高,所以我們一般選擇X/Y/Z軸陀螺作為參考的PLL作為時(shí)鐘源,一般設(shè)置CLKSEL=001即可。表STYLEREF4\s5.2。4SEQ表\*ARABIC\s42CLKSEL選擇列表GyroscopeConfiguration(陀螺儀配置寄存器)表STYLEREF4\s5。2.4SEQ表\*ARABIC\s43表陀螺儀配置寄存器各位描述如表5.2。4-3,寄存器地址為0x1B。FS_SEL[1:0]兩個(gè)位用于設(shè)置陀螺儀的滿量程范圍:0為±250°/s;1為±500°/s;2為±1000°/s;3為±2000°/s.我們一般設(shè)置為3,即±2000°/s,而因?yàn)橥勇輧x的ADC為16位分辨率,所以得到靈敏度為:65536/4000=16。4LSB/(°/s)。AccelerometerConfiguration(加速度傳感器配置寄存器)表STYLEREF4\s5.2.4SEQ表\*ARABIC\s44加速度傳感器配置寄存器各位描述如表5。2.4-4,寄存器地址為0x1C。AFS_SEL[1:0]兩個(gè)位用于設(shè)置加速度傳感器的滿量程范圍:0為±2g;1為±4g;2為±8g;3為±16g。我們一般設(shè)置為0,即±2g,而因?yàn)榧铀俣葌鞲衅鞯腁DC也是16位分辨率,所以得到靈敏度為:65536/4=16384LSB/g.FIFOEnable(FIFO使能寄存器)表STYLEREF4\s5。2.4SEQ表\*ARABIC\s45FIFO使能寄存器各位描述如表5.2.4—5,寄存器地址為0x23.該寄存器用于控制FIFO使能,在簡單讀取傳感器數(shù)據(jù)的時(shí)候,可以不用FIFO,設(shè)置對應(yīng)位為0即可禁止FIFO,設(shè)置為1,則使能FIFO。注意加速度傳感器的3個(gè)軸,全由1個(gè)位(ACCEL_FIFO_EN)控制,只要該位置1,則加速度傳感器的三個(gè)通道都開啟FIFO了。SampleRateDivider(采樣率分頻寄存器)表STYLEREF4\s5。2.4SEQ表\*ARABIC\s46陀螺儀采樣率分頻寄存器各位描述如表5。2.4—6,寄存器地址為0x19。該寄存器用于設(shè)置MPU6050的陀螺儀采樣頻率,計(jì)算公式為:采樣頻率=陀螺儀輸出頻率/(1+SMPLRT_DIV)這里陀螺儀的輸出頻率,是1Khz或者8Khz,與數(shù)字低通濾波器(DLPF)的設(shè)置有關(guān),當(dāng)DLPF_CFG=0/7的時(shí)候,頻率為8Khz,其他情況是1Khz.而且DLPF濾波頻率一般設(shè)置為采樣率的一半。我們假定設(shè)置采樣率為50Hz,那么SMPLRT_DIV=1000/50—1=19。Configurat(yī)ion(配置寄存器)表STYLEREF4\s5。2.4SEQ表\*ARABIC\s47配置寄存器各位描述如表5.2。4-7,寄存器地址為0x1A。加速度計(jì)和陀螺儀是根據(jù)數(shù)字低通濾波器(DLPF)的三個(gè)設(shè)置位進(jìn)行過濾的,即DLPF_CFG[2:0].DLPF_CFG不同配置對應(yīng)的過濾情況如表5.2。4—8所示:表STYLEREF4\s5。2.4SEQ表\*ARABIC\s48DLPF_CFG配置表加速度傳感器輸出速率(Fs)固定是1Khz,而角速度傳感器的輸出速率(Fs),則根據(jù)DLPF_CFG的配置有所不同。一般我們設(shè)置角速度傳感器的帶寬為其采樣率的一半,如前面所說的,如果設(shè)置采樣率為50Hz,那么帶寬就應(yīng)該設(shè)置為25Hz,取近似值20Hz,就應(yīng)該設(shè)置DLPF_CFG為100。PowerManagement2(電源管理寄存器2)表STYLEREF4\s5.2。4SEQ表\*ARABIC\s49電源管理寄存器2各位描述如表5.2。4-9,寄存器地址為0x6C.該寄存器的LP_WAKE_CTRL用于控制低功耗時(shí)的喚醒頻率,項(xiàng)目中沒有用到.剩下的6位,分別控制加速度和陀螺儀的x/y/z軸是否進(jìn)入待機(jī)模式,由于不需要進(jìn)入待機(jī)模式,所以全部設(shè)置為0。GyroscopeMeasurements(陀螺儀數(shù)據(jù)輸出寄存器)表STYLEREF4\s5.2。4SEQ表\*ARABIC\s410陀螺儀數(shù)據(jù)輸出寄存器各位描述如表5。2.4—10,總共有6個(gè)寄存器,地址為0x43~0x48,通過讀取這6個(gè)寄存器,就可以讀到陀螺儀x/y/z軸的值,比如x軸的數(shù)據(jù),可以通過讀取0x43(高8位)和0x44(低8位)寄存器得到,其他軸以此類推。AccelerometerMeasurements(加速度傳感器數(shù)據(jù)輸出寄存器)表STYLEREF4\s5。2.4SEQ表\*ARABIC\s411加速度傳感器數(shù)據(jù)輸出寄存器各位描述如表5.2.4-11,總共有6個(gè)寄存器,地址為0x3B~0x40,通過讀取這8個(gè)寄存器,就可以讀到加速度傳感器x/y/z軸的值,比如讀x軸的數(shù)據(jù),可以通過讀?。皒3B(高8位)和0x3C(低8位)寄存器得到,其他軸以此類推.ATK-HC05工作原理ATK-HC05引腳ATK—HC05模塊非常小巧(16mm*32mm),模塊通過6個(gè)2。54mm間距的排針與外部連接,模塊外觀如圖5.3。1-1所示:圖STYLEREF3\s5。3SEQ圖\*ARABIC\s31ATK-HC05模塊外觀圖圖5.3.1—1中,從右到左,依次為模塊引出的PIN1~PIN6腳,各引腳的詳細(xì)描述如表5.3.1—1所示:表STYLEREF4\s5.3。1SEQ表\*ARABIC\s41ATK—HC05模塊各引腳功能描述另外,模塊自帶了一個(gè)狀態(tài)指示燈:STA.該燈有3種狀態(tài),分別為:在模塊上電的同時(shí)(也可以是之前),將KEY設(shè)置為高電平(接VCC),此時(shí)STA慢閃(1秒亮1次),模塊進(jìn)入AT狀態(tài),且此時(shí)波特率固定為38400.在模塊上電的時(shí)候,將KEY懸空或接GND,此時(shí)STA快閃(1秒2次),表示模塊進(jìn)入可配對狀態(tài).如果此時(shí)將KEY再拉高,模塊也會進(jìn)入AT狀態(tài),但是STA依舊保持快閃。模塊配對成功,此時(shí)STA雙閃(一次閃2下,2秒閃一次)。硬件設(shè)計(jì)圖STYLEREF3\s5.3SEQ圖\*ARABIC\s32ATK—HC05藍(lán)牙串口模塊原理圖模塊與單片機(jī)連接最少只需要4根線即可:VCC、GND、TXD、RXD、VCC和GND用于給模塊供電,模塊TXD和RXD則連接單片機(jī)的RXD和TXD即可。該模塊兼容5V和3。3V單片機(jī)系統(tǒng),所以可以很方便的連接到系統(tǒng)里面去。ATK-HC05模塊與單片機(jī)系統(tǒng)的典型連接方式如圖5。3。2—2所示:圖STYLEREF3\s5.3SEQ圖\*ARABIC\s33ATK-HC05模塊與單片機(jī)系統(tǒng)連接示意圖圖中虛線連接表示可有可無,可以根據(jù)需要,選擇性的使用。ATK-HC05與藍(lán)牙主機(jī)連接首先,開機(jī)檢測ATK-HC05藍(lán)牙模塊是否存在,如果檢測不成功,則報(bào)錯。檢測成功之后,顯示模塊的主從狀態(tài),并顯示模塊是否處于連接狀態(tài),DS0閃爍,提示程序運(yùn)行正常.按KEY0按鍵,可以開啟/關(guān)閉自動發(fā)送數(shù)據(jù)(通過藍(lán)牙模塊發(fā)送);按KEY_UP按鍵可以切換模塊的主從狀態(tài)。藍(lán)牙模塊接收到的數(shù)據(jù),將直接顯示在LCD上(僅支持ASCII字符顯示).同時(shí),還可以通過USMART對ATK—HC05藍(lán)牙模塊進(jìn)行AT指令查詢和設(shè)置。結(jié)合手機(jī)端藍(lán)牙軟件(藍(lán)牙串口助手v1.97.apk),可以實(shí)現(xiàn)手機(jī)無線控制開發(fā)板(點(diǎn)亮和關(guān)閉LED1)。所要用到的硬件資源如下:指示燈DS0、DS1KEY0/KEY_UP兩個(gè)按鍵串口1、串口3TFTLCD模塊ATK-HC05-V13藍(lán)牙串口模塊前面介紹了ATK—HC05藍(lán)牙串口模塊的接口,而ALIENTEK探索者STM32F407開發(fā)板板載了一個(gè)ATK模塊接口(ATKMODULE),ATK—HC05藍(lán)牙模塊可直接插入該接口實(shí)現(xiàn)與探索者STM32F4開發(fā)板的連接。ATKMODULE同開發(fā)板主芯片的連接原理圖如—1所示:圖STYLEREF3\s5。3SEQ圖\*ARABIC\s34ATK-MODULE接口與MCU連接關(guān)系從上圖可以看出,藍(lán)牙模塊的串口最簡單的辦法是連接在開發(fā)板的串口3上面,只需要用跳線帽短接P10的USART3_RX和GBC_TX以及USART3_TX和GBC_RX即可實(shí)現(xiàn).連接好之后,探索者STM32F407開發(fā)板與ATK—HC05藍(lán)牙模塊的連接關(guān)系如表2.1所示:表STYLEREF4\s5.3.3SEQ表\*ARABIC\s41ATK—HC05藍(lán)牙模塊同探索者STM32F407開發(fā)板連接關(guān)系表使用時(shí),我們只需要將ATK—HC05藍(lán)牙模塊插入到開發(fā)板的ATK—MODULE接口即可,如圖5.3.3-2所示:圖STYLEREF3\s5.3SEQ圖\*ARABIC\s35A(chǔ)TK-HC05藍(lán)牙模塊與探索者開發(fā)板對接實(shí)物圖注意,連接好之后,記得檢查P10的跳線帽:必須短接:USART3_RX和GBC_TX以及USART3_TX和GBC_RX.另外,在實(shí)際使用的時(shí)候,如果不需要進(jìn)入AT設(shè)置和狀態(tài)指示,則連接藍(lán)牙模塊只需要4根線連接即可:VCC/GND/TXD/RXD。ATK-HC05模塊可以與多種藍(lán)牙主機(jī)設(shè)備連接,這里僅以智能手機(jī)為例,進(jìn)行說明。首先,在手機(jī)上安裝:BTClient。apk,該應(yīng)用可以在提供的資料里面找到.安裝完應(yīng)用后,我們打開該應(yīng)用,如圖5.3。3—3所示:圖STYLEREF3\s5.3SEQ圖\*ARABIC\s36BTClient.apk運(yùn)行界面進(jìn)入搜索藍(lán)牙設(shè)備界面,如圖5.3.3—4所示:圖STYLEREF3\s5.3SEQ圖\*ARABIC\s37搜索藍(lán)牙設(shè)備從上圖可以看出,手機(jī)已經(jīng)搜索到藍(lán)牙模塊了,HC-05,點(diǎn)擊這個(gè)設(shè)備,輸入默認(rèn)密鑰1234(僅第一次連接需要設(shè)置),完成配對,如圖5。3.3-5所示:圖STYLEREF3\s5.3SEQ圖\*ARABIC\s38輸入配對密碼在輸入密碼之后,等待一段時(shí)間,即可連接成功,如圖5。3。3-6所示:圖STYLEREF3\s5。3SEQ圖\*ARABIC\s39連接成功此時(shí),手機(jī)和藍(lán)牙模塊就連接上了,手機(jī)便可以接收數(shù)據(jù)并繪制三維圖形了,改變開發(fā)板的姿態(tài),手機(jī)端繪制的三維圖形如圖5.3。3—7所示:圖STYLEREF3\s5。3SEQ圖\*ARABIC\s310手機(jī)繪制三維圖形界面這樣,我們就實(shí)現(xiàn)了ATK—HC05模塊與手機(jī)的連接。同其他藍(lán)牙主機(jī)設(shè)備的連接,方法都是類似的,比較簡單,這里我們就不再介紹了。有了STA指示燈,我們就可以很方便的判斷模塊的當(dāng)前狀態(tài),方便使用。DMP算法原理通過陀螺儀數(shù)據(jù)輸出寄存器和加速度傳感器數(shù)據(jù)輸出寄存器獲取的是MPU6050加速度傳感器和陀螺儀的原始數(shù)據(jù),而實(shí)驗(yàn)需要的是姿態(tài)數(shù)據(jù),即歐拉角:航向角(Yaw)、橫滾角(Roll)和俯仰角(Pitch)。要得到歐拉角數(shù)據(jù),就得利用我們的原始數(shù)據(jù),進(jìn)行姿態(tài)融合解算,這個(gè)比較復(fù)雜,知識點(diǎn)比較多,而MPU6050自帶了數(shù)字運(yùn)動處理器,即DMP,并且,InvenSense提供了一個(gè)MPU6050的嵌入式運(yùn)動驅(qū)動庫,結(jié)合MPU6050的DMP,可以將我們的原始數(shù)據(jù),直接轉(zhuǎn)換成四元數(shù)輸出,而得到四元數(shù)之后,就可以很方便的計(jì)算出歐拉角,從而得到Y(jié)aw、Roll和Pitch.使用MPU6050的DMP輸出的四元數(shù)是q30格式的,也就是浮點(diǎn)數(shù)放大了2的30次方倍。在換算成歐拉角之前,必須先將其轉(zhuǎn)換為浮點(diǎn)數(shù),也就是除以2的30次方,然后再進(jìn)行計(jì)算,計(jì)算公式如下:其中quat[0]~quat[3]是MPU6050的DMP解算后的四元數(shù),為q30格式,所以要除以一個(gè)2的30次方,其中q30是一個(gè)常量為1073741824,即2的30次方,然后帶入公式,計(jì)算出歐拉角。上述計(jì)算公式的57.3是弧度轉(zhuǎn)換為角度,即180/π,這樣得到的結(jié)果就是以度(°)為單位的。q0=quat[0]/q30;//q30格式轉(zhuǎn)換為浮點(diǎn)數(shù)q1=quat[1]/q30;q2=quat[2]/q30;q3=quat(yī)[3]/q30;//計(jì)算得到俯仰角/橫滾角/航向角Pitch=asin(-2*q1*q3+2*q0*q2)*57。3;//俯仰角Roll=at(yī)an2(2*q2*q3+2*q0*q1,-2*q1*q1—2*q2*q2+1)*57。3;//橫滾角Yaw=atan2(2*(q1*q2+q0*q3),q0*q0+q1*q1-q2*q2-q3*q3)*57。3;//航向角AHRSAHRS簡介AHRS稱為航姿參考系統(tǒng),包括多個(gè)軸向傳感器,能夠?yàn)轱w行器提供航向,橫滾和側(cè)翻信息,這類系統(tǒng)用來為飛行器提供準(zhǔn)確可靠的姿態(tài)與航行信息。圖STYLEREF3\s5.5SEQ圖\*ARABIC\s31航姿參考系統(tǒng)航姿參考系統(tǒng)包括基于MEMS的陀螺儀,加速度計(jì)和磁強(qiáng)計(jì)。航姿參考系統(tǒng)與慣性測量單元IMU的區(qū)別在于,航姿參考系統(tǒng)(AHRS)包含了嵌入式的姿態(tài)數(shù)據(jù)解算單元與航向信息,慣性測量單元(IMU)僅僅提供傳感器數(shù)據(jù),并不具有提供準(zhǔn)確可靠的姿態(tài)數(shù)據(jù)。目前常用的航姿參考系統(tǒng)(AHRS)內(nèi)部采用的多傳感器數(shù)據(jù)融合進(jìn)行的航姿解算單元為卡爾曼濾波器。航姿參考系統(tǒng)(AHRS)具有兩個(gè)主要特點(diǎn):高精度360度全方位位置姿態(tài)輸出,但采用歐拉角的會具有萬向鎖,不能全向轉(zhuǎn)動。高效的數(shù)據(jù)融合算法快速動態(tài)響應(yīng)與長時(shí)間穩(wěn)定性(無漂移,無積累誤差)相結(jié)合.航姿參考系統(tǒng)(AHRS)輸出模式為三維全姿態(tài)數(shù)據(jù)(四元數(shù)/歐拉角/旋轉(zhuǎn)矩陣)。AHRS軟件設(shè)計(jì)AHRS的軟件設(shè)計(jì)主要分為:傳感器初始化,包括設(shè)置傳感器的更新速率、量程.初始化卡爾曼濾波的相關(guān)矩陣,根據(jù)傳感器的特點(diǎn)設(shè)置過程激勵噪聲協(xié)方差矩陣Q,設(shè)為對角元素為0.1的四維對角方陣.若成功讀取陀螺儀數(shù)據(jù),進(jìn)行卡爾曼濾波的時(shí)間更新。采集加速度傳感器和磁阻傳感器的數(shù)據(jù),若讀取成功則進(jìn)行觀測更新.加速度觀測更新與磁場觀測更新算法差別在于觀測方差的R,可根據(jù)兩種傳感器的置信度沒置相應(yīng)的值,航向姿態(tài)參考系的程序流程如圖5。5.2-1所示。圖STYLEREF3\s5。5SEQ圖\*ARABIC\s32航向姿態(tài)參考系的程序流程手機(jī)端功能原理及Android代碼對手機(jī)端apk的修改主要是將兩個(gè)獨(dú)立的安卓apk進(jìn)行了源碼級的合并。藍(lán)牙幀處理藍(lán)牙模塊方面,使用了開源的藍(lán)牙串口通訊代碼。在進(jìn)行合并的過程中,主要對代碼的接收模塊進(jìn)行了修改。由于藍(lán)牙的發(fā)送和接收以及Android廣播中傳遞的均為字符串,因此,為了解析方便,我們將藍(lán)牙幀設(shè)置為如下格式: u3_printf(”P:%c%。1fR:%c%.1fY:%c%.1f\n",cp,Pitch,cr,Roll,cy,Yaw);其中,cp、cr、cy分別為Pitch、Roll、Yaw的符號,為非負(fù)數(shù)時(shí)顯示為空格符.這里注意到在進(jìn)行格式化輸出的時(shí)候,控制小數(shù)點(diǎn)后保留一位小數(shù),但是小數(shù)點(diǎn)前的位數(shù)無法控制,猜測是由于c語言頭文件功能較為精簡造成的。參數(shù)的廣播傳遞為了實(shí)現(xiàn)參數(shù)傳遞的功能,查閱了大量Android相關(guān)的代碼和資料,最終選擇了通過Android特有的廣播機(jī)制進(jìn)行參數(shù)的傳遞.此外,在廣播的過程中,還是用了意圖(Intent),這也是Android特有的一個(gè)機(jī)制,用來對廣播進(jìn)行定向生成和接收,保證三維制圖端收到的數(shù)據(jù)為藍(lán)牙接收到并進(jìn)行廣播的數(shù)據(jù)。另外在對藍(lán)牙數(shù)據(jù)進(jìn)行接收時(shí),發(fā)現(xiàn)無法理想地收取到單個(gè)幀數(shù)據(jù),大部分時(shí)候是一次性獲取到了幾十幀的數(shù)據(jù),其中第一幀和最后一幀往往是不完整的,這就要求我們對數(shù)據(jù)進(jìn)行處理之后再進(jìn)行廣播://接收數(shù)據(jù)線程while(true){num=is.read(buffer);//讀入數(shù)據(jù)n=0;Strings0=newString(buffer,0,num);fmsg+=s0;//保存收到數(shù)據(jù)for(i=0;i<num;i++){if((buffer[i]==0x0d)&&(buffer[i+1]==0x0a)){buffer_new[n]=0x0a;i++;}else{buffer_new[n]=buffer[i];}n++;}Strings=newString(buffer_new,0,n);smsg+=s;//寫入接收緩存toSend+=s;//寫入廣播緩存Stringtmp[]=toSend.split(”\n”);//判斷換行符if(toSend.length()〉=21){ for(intlen=0;len<tmp.length;len++){if(tmp[len]。length()>=20){?intent。putExtra(”CCSendflag”,tmp[len]); intent.setAction("CCSendflag");//設(shè)置廣播的action//只有和這個(gè)action一樣的接收者才能接收廣播;sendBroadcast(intent);//發(fā)送廣播 }?}?toSend="";//處理完成,清空廣播緩存}if(is。available()==0)break;//短時(shí)間沒有數(shù)據(jù)才跳出進(jìn)行顯示}//廣播接收類publicclassTestReceiverextendsBroadcastReceiver{privatestaticfinalStringtag="flag”;privatestaticStringmessage="null";publicvoidonReceive(Contextcontext,Intentintent){?Stringstring=intent.getStringExtra("CCSendflag");//接收指定廣播 if(string!=”"){ setString(string);?}}publicvoidsetString(Stringstr){ message=str; }publicStringgetString(){?returnmessage; }}視圖切換在合并過程中,由于涉及到視圖的切換,因此對Android操作系統(tǒng)的進(jìn)程管理和線程創(chuàng)建進(jìn)行了學(xué)習(xí),最終能夠?qū)崿F(xiàn)從藍(lán)牙接收視圖到三維繪制視圖的平滑切換.切換的時(shí)機(jī)最終選擇在藍(lán)牙連接建立后,開始接收數(shù)據(jù)的瞬間://打開接收線程try{is=_socket。getInputStream();//得到藍(lán)牙數(shù)據(jù)輸入流}catch(IOExceptione){Toast.makeText(this,”接收數(shù)據(jù)失??!”,Toast。LENGTH_SHORT).show();?return;}if(bThread==false){?ReadThread.start(); bThread=true;Ient=newIntent(BTClient。this,mainActivity。class);?intent。putExtra(”CC0",smsg); startActivity(intent);}else{ bRun=true;}OpenGL繪圖三維繪圖方面,使用了官方提供的示例代碼,主要在每一幀繪制的過程中加入了參數(shù)傳遞的功能,從而實(shí)現(xiàn)了實(shí)時(shí)從藍(lán)牙接收數(shù)據(jù)并繪制三維圖形:TestReceivertestReceiver;protectedvoidinit(GL10gl){gl.glClearColor(0.0f,0.0f,0.0f,1。0f);gl.glEnable(GL10.GL_DEPTH_TEST);gl.glEnable(GL10.GL_CULL_FACE);gl.glClearDepthf(1。0f);gl.glDepthFunc(GL10.GL_LEQUAL);gl.glClearDepthf(1.0f)gl.glShadeModel(GL10。GL_SMOOTH);//實(shí)例化接收類testReceiver=newTestReceiver();}publicvoidonDrawFrame(GL10gl){//TODOAuto-generat(yī)edmethodstubgl.glClear(GL10。GL_COLOR_BUFFER_BIT|GL10.GL_DEPTH_BUFFER_BIT); //獲取廣播的數(shù)據(jù)StringallString=testReceiver。getString();?//對廣播數(shù)據(jù)進(jìn)行解析,從字符串轉(zhuǎn)化為float類型if(allString。length()>=20){Pitch=Float.parseFloat(yī)(allString.substring(allString.indexOf("P:”)+2, allString。indexOf("R:")-1));Roll=Float.parseFloat(allString.substring(allString。indexOf(”R:")+2, allString。indexOf("Y:")—1));Yaw=Float(yī).parseFloat(allString.substring(allString.indexOf("Y:")+2, allString.length()));}gl。glMatrixMode(GL10.GL_MODELVIEW);gl.glLoadIdentity();GLU.gluLookAt(gl,0,0,3,0,0,0,0,1,0);gl。glVertexPointer(3,GL10.GL_FLOAT,0,cubeBuff);gl。glEnableClientStat(yī)e(GL10.GL_VERTEX_ARRAY);gl。glRotat(yī)ef(xrot,1,0,0);gl.glRotatef(yrot,0,1,0);gl.glRotatef(zrot,0,0,1);gl.glColor4f(1.0f,0,0,1.0f);gl.glDrawArrays(GL10。GL_TRIANGLE_STRIP,0,4);gl.glDrawArrays(GL10。GL_TRIANGLE_STRIP,4,4);gl.glColor4f(0,1.0f,0,1.0f);gl.glDrawArrays(GL10。GL_TRIANGLE_STRIP,8,4);gl。glDrawArrays(GL10。GL_TRIANGLE_STRIP,12,4);gl.glColor4f(0,0,1.0f,1.0f);gl。glDrawArrays(GL10.GL_TRIANGLE_STRIP,16,4);gl。glDrawArrays(GL10.GL_TRIANGLE_STRIP,20,4); //將讀取到的歐拉角賦值給三維圖形的旋轉(zhuǎn)角xrot=Pitch;yrot=-Roll;zrot=Yaw;}系統(tǒng)測試由于三維電子旋轉(zhuǎn)臺和加速度測量儀價(jià)格過于昂貴,因此,只是利用Matlab軟件進(jìn)行了簡單的系統(tǒng)測試。AHRS測試我組對從串口獲取的MPU6050數(shù)據(jù)進(jìn)行了處理,獲得到浮點(diǎn)型數(shù)據(jù),并對使用AHRS和不使用AHRS進(jìn)行了測試比較,由于數(shù)據(jù)量較大,這里我們用圖像展示,結(jié)果如下:圖STYLEREF3\s6。1SEQ圖\*ARABIC\s31未進(jìn)行AHRS處理得到的姿態(tài)變化圖STYLEREF3\s6。1SEQ圖\*ARABIC\s32AHRS處理后得到的姿態(tài)變化由圖可看出,不使用AHRS的數(shù)據(jù)繪出的圖像與實(shí)際姿態(tài)完全不對應(yīng),誤差較大。而使用了AHRS處理的數(shù)據(jù)較穩(wěn)定,且比較符合實(shí)際姿態(tài)。高通濾波算法根據(jù)我組需要實(shí)現(xiàn)的還原MPU6050六軸傳感器姿態(tài)變化的功能,我們需要對獲取的MPU6050加速度傳感器數(shù)據(jù)進(jìn)行處理,通過二次積分得到MPU6050的姿態(tài)的位移。由于加速度傳感器的輸出存在固定的零點(diǎn)漂移,即當(dāng)實(shí)際加速度為0時(shí),傳感器輸出并不一定為0,而是一個(gè)非零輸出。若設(shè)傳感器的輸出值為+,其中為實(shí)際加速度,則在對傳感器輸出值的誤差進(jìn)行二次積分后會產(chǎn)生積分累計(jì)效應(yīng),導(dǎo)致誤差更大。同時(shí),若傳感器初始化時(shí)加速度不為0,也會導(dǎo)致二次積分后產(chǎn)生積分累計(jì)效應(yīng)。通過查閱資料,高通濾波可以解決零點(diǎn)漂移問題,我組選擇使用高通濾波處理數(shù)據(jù),而Mat(yī)lab提供了高通濾波函數(shù)filtfilt(),我組調(diào)用函數(shù)處理的主要代碼如下:%%High—passfilterlinearvelocitytoremovedriftorder=1;filtCutOff=0.1;[b,a]=butter(order,(2*filtCutOff)/(1/samplePeriod),'high');linVelHP=filtfilt(b,a,linVel);%linVelHP=linVel;%Plotfigure('Number','off’,'Name','High—passfilteredLinearVelocity');holdon;plot(linVelHP(:,1),’r');plot(linVelHP(:,2),'g’);plot(linVelHP(:,3),’b’);xlabel('sample');ylabel(’g');title('High-passfilteredlinearvelocity');legend('X’,’Y','Z');其中samplePeriod為取樣周期,取為1/256;buffer()為分段函數(shù),將數(shù)據(jù)分段進(jìn)行濾波;plot()為繪圖函數(shù)。我們對使用高通濾波和不使用高通濾波進(jìn)行了測試比較,由于數(shù)據(jù)量較大,我們以圖像的形式展現(xiàn),結(jié)果如下圖:圖STYLEREF3\s6。2SEQ圖\*ARABIC\s31未進(jìn)行高通濾波處理得到的速度變化圖STYLEREF3\s6.2SEQ圖\*ARABIC\s32高通濾波處理后得到的速度變化如圖6。2-2可看出,不使用高通濾波處理得到的數(shù)據(jù)由于零點(diǎn)漂移導(dǎo)致的二次積分誤差,趨于正向最大或負(fù)向最小;而使用高通濾波處理得到的數(shù)據(jù)趨于穩(wěn)定,且動作被放大,變得更明顯。實(shí)時(shí)姿態(tài)檢測系統(tǒng)測試當(dāng)時(shí)演示時(shí),提出要將手機(jī)固定在板上進(jìn)行測試,結(jié)果是偏差非常大,這與實(shí)際情況有很大差別。后來找到了原因,當(dāng)時(shí)代碼的編寫是將數(shù)據(jù)作為正反饋傳遞給繪圖程序的,而現(xiàn)在為了檢驗(yàn)精度,需要改為負(fù)反饋,同時(shí),為了便于觀察,將3D圖形替換為了一條直線,代碼改變?nèi)缦?原始代碼已被注釋)://gl。glDrawArrays(GL10.GL_TRIANGLE_STRIP,0,4); gl。glDrawArrays(GL10。GL_LINE_STRIP,2,2);xrot=-Pitch;?yrot=Roll;?zrot=-Yaw; /*xrot=Pitch;?yrot=—Roll; zrot=Y(jié)aw;*/如圖,為測試結(jié)果,可以看到誤差逐漸變大,最后無法復(fù)位:關(guān)鍵代碼說明IIC關(guān)鍵代碼初始化IIC//初始化IICvoidIIC_Init(void){GPIO_InitTypeDefGPIO_InitStructure;RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB,ENABLE);//使能GPIOB時(shí)鐘//GPIOB8,B9初始化設(shè)置GPIO_InitStructure。GPIO_Pin=GPIO_Pin_8|GPIO_Pin_9;GPIO_InitStructure。GPIO_Mode=GPIO_M(jìn)ode_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);//初始化IIC_SCL=1;IIC_SDA=1;}通過IIC_Init函數(shù)可看出,函數(shù)主要對GPIO的PB8、PB9引腳進(jìn)行了初始化設(shè)置。先使能GPIOB時(shí)鐘,然后對PB8、PB9引腳的相關(guān)寄存器進(jìn)行初始化設(shè)置,設(shè)置完畢后通過GPIO_Init函數(shù)將初始化設(shè)置有效,最后將SCL和SDA使能。數(shù)據(jù)處理//IO方向設(shè)置#defineSDA_IN(){GPIOB->MODER&=~(3<<(9*2));GPIOB->MODER|=0<〈9*2; //PB9輸入模式}#defineSDA_OUT(){GPIOB—>MODER&=~(3〈<(9*2));GPIOB-〉MODER|=1<〈9*2;//PB9輸出模式}上述代碼定義了SDA_IN和SDA_OUT兩個(gè)函數(shù),通過設(shè)置PB9引腳功能來設(shè)置IIC_SDA接口是輸入模式還是輸出模式。有了這兩個(gè)函數(shù)之后,在IIC函數(shù)文件中,就能夠使用IIC_Send_Byte和IIC_Read_Byte函數(shù)來發(fā)送或讀取數(shù)據(jù)。具體代碼如下://IIC發(fā)送一個(gè)字節(jié)//返回從機(jī)有無應(yīng)答//1,有應(yīng)答//0,無應(yīng)答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);//對TEA5767這三個(gè)延時(shí)都是必須的IIC_SCL=1;delay_us(2);IIC_SCL=0;delay_us(2);}}//讀1個(gè)字節(jié),ack=1時(shí),發(fā)送ACK,ack=0,發(fā)送nACKu8IIC_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;}MPU6050關(guān)鍵代碼初始化根據(jù)5.2。3中說明的,對MPU6050初始化,需要先初始化IIC接口,然后復(fù)位MPU6050,接著設(shè)置相關(guān)參數(shù),最后配置系統(tǒng)時(shí)鐘源并使能加速度傳感器和陀螺儀。具體代碼如下://初始化MPU6050//返回值:0,成功//其他,錯誤代碼u8MPU_Init(void){ u8res;?IIC_Init();//初始化IIC總線 MPU_Write_Byte(MPU_PWR_M(jìn)GMT1_REG,0X80);?//復(fù)位MPU6050delay_ms(100); MPU_Write_Byte(MPU_PWR_MGMT1_REG,0X00); //喚醒MPU6050?MPU_Set_Gyro_Fsr(0);//陀螺儀傳感器,3±2000dps?MPU_Set_Accel_Fsr(0);//加速度傳感器,±2g MPU_Set_Rate(50);//設(shè)置采樣率50Hz MPU_Write_Byte(MPU_INT_EN_REG,0X00);//關(guān)閉所有中斷?MPU_Write_Byte(MPU_USER_CTRL_REG,0X00);//I2C主模式關(guān)閉 MPU_Write_Byte(MPU_FIFO_EN_REG,0X00);//關(guān)閉FIFO MPU_Write_Byte(MPU_INTBP_CFG_REG,0X80);//INT引腳低電平有效 res=MPU_Read_Byte(MPU_DEVICE_ID_REG); if(res==MPU_ADDR)//器件ID正確?{ MPU_Write_Byte(MPU_PWR_MGMT1_REG,0X01); //設(shè)置CLKSEL,PLLX軸為參考 MPU_Write_Byte(MPU_PWR_M(jìn)GMT2_REG,0X00);?//加速度與陀螺儀都工作 MPU_Set_Rate(50);//設(shè)置采樣率為50Hz }elsereturn1;?return0;}設(shè)置寄存器在MPU6050初始化中,需要設(shè)置角速度傳感器(陀螺儀)和加速度傳感器的滿量程范圍以及采樣率,而根據(jù)5。2.4需要通過修改寄存器來設(shè)置,所以用到MPU_Write_Byte函數(shù)來對寄存器進(jìn)行寫操作。具體代碼如下://設(shè)置MPU6050陀螺儀傳感器滿量程范圍//fsr:0,±250dps;1,±500dps;2,±1000dps;3,±2000dps//返回值:0,設(shè)置成功//其他,設(shè)置失敗u8MPU_Set_Gyro_Fsr(u8fsr){ returnMPU_Write_Byte(MPU_GYRO_CFG_REG,fsr〈〈3);//設(shè)置陀螺儀滿量程范圍}//設(shè)置MPU6050加速度傳感器滿量程范圍//fsr:0,±2g;1,±4g;2,±8g;3,±16g//返回值:0,設(shè)置成功//其他,設(shè)置失敗u8MPU_Set_Accel_Fsr(u8fsr){?returnMPU_Write_Byte(MPU_ACCEL_CFG_REG,fsr<<3);//設(shè)置加速度傳感器滿量程范圍}//設(shè)置MPU6050的采樣率(假定Fs=1KHz)//rate:4~1000(Hz)//返回值:0,設(shè)置成功//其他,設(shè)置失敗u8MPU_Set_Rate(u16rat(yī)e){?u8data; if(rate>1000)rate=1000; if(rate〈4)rate=4;?data=1000/rate-1;?data=MPU_Write_Byte(MPU_SAMPLE_RATE_REG,dat(yī)a);?//設(shè)置數(shù)字低通濾波器 returnMPU_Set_LPF(rate/2);//自動設(shè)置LPF為采樣率的一半}從數(shù)據(jù)輸出寄存器讀取數(shù)據(jù)在MPU6050初始化完成后,需要通過加速度傳感器數(shù)據(jù)輸出寄存器和陀螺儀數(shù)據(jù)輸出寄存器來讀取加速度傳感器數(shù)據(jù)和陀螺儀數(shù)據(jù),所以用到MPU_Read_Len函數(shù)來對寄存器進(jìn)行讀操作。具體代碼如下://得到陀螺儀值(原始值)//gx,gy,gz:陀螺儀x,y,z軸的原始讀數(shù)(帶符號)//返回值:0,成功//其他,錯誤代碼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;;}//得到加速度值(原始值)//gx,gy,gz:陀螺儀x,y,z軸的原始讀數(shù)(帶符號)//返回值:0,成功//其他,錯誤代碼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;;}DMP關(guān)鍵代碼初始化mpu_dmp_init()是MPU6050DMP初始化函數(shù),該函數(shù)具體代碼如下://mpu6050,dmp初始化//返回值:0,正常//其他,失敗u8mpu_dmp_init(void){u8res=0;IIC_Init();//初始化IIC總線if(mpu_init()==0){//初始化MPU6050//設(shè)置需要的傳感器res=mpu_set_sensors(INV_XYZ_GYRO|INV_XYZ_ACCEL);if(res)return1;res=mpu_configure_fifo(INV_XYZ_GYRO|INV_XYZ_ACCEL);//設(shè)置FIFOif(res)return2;res=mpu_set_sample_rate(DEFAULT_M(jìn)PU_HZ);//設(shè)置采樣率if(res)return3;res=dmp_load_motion_driver_firmware();//加載dmp固件if(res)return4;//設(shè)置陀螺儀方向res=dmp_set_orientation(inv_orientation_matrix_to_scalar(gyro_orientation));if(res)return5;//設(shè)置dmp功能res=dmp_enable_feature(DMP_FEATURE_6X_LP_QUAT|DMP_FEATURE_TAP|DMP_FEATURE_ANDROID_ORIENT|DMP_FEATURE_SEND_RAW_ACCEL|DMP_FEATURE_SEND_CAL_GYRO|DMP_FEATURE_GYRO_CAL);if(res)return6;//設(shè)置DMP輸出速率(最大200Hz)res=dmp_set_fifo_rate(DEFAULT_MPU_HZ);if(res)return7;res=run_self_test();//自檢if(res)return8;res=mpu_set_dmp_state(1);//使能DMPif(res)return9;}return0;}函數(shù)首先通過IIC_Init(需外部提供)初始化與MPU6050連接的IIC接口,然后調(diào)用mpu_init函數(shù),初始化MPU6050,之后就是設(shè)置DMP所用傳感器、FIFO、采樣率和加載固件等一些列操作,在所有操作都正常之后,最后通過mpu_set_dmp_state(1)使能DMP功能,在使能成功以后才可以通過mpu_dmp_get_data來讀取姿態(tài)解算后的數(shù)據(jù)。讀取數(shù)據(jù)mpu_dmp_get_data()函數(shù)用于得到DMP姿態(tài)解算后的俯仰角、橫滾角和航向角。具體代碼如下://得到dmp處理后的數(shù)據(jù)(注意,本函數(shù)需要比較多堆棧,局部變量有點(diǎn)多)//pitch:俯仰角精度:0。1°范圍:—90.0°<-——>+90.0°//roll:橫滾角精度:0。1°范圍:-180.0°<—--〉+180.0°//yaw:航向角精度:0。1°范圍:-180。0°<—--〉+180.0°//返回值:0,正常//其他,失敗u8mpu_dmp_get_data(float*pitch,float*roll,float(yī)*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(yī)[1]/q30;q2=quat[2]/q30;q3=quat[3]/q30;//計(jì)算得到俯仰角/橫滾角/航向角*pitch=asin(—2*q1*q3+2*q0*q2)*57.3;*roll=at(yī)an2(2*q2*q3+2*q0*q1,-2*q1*q1-2*q2*q2+1)*57。3;*yaw=atan2(2*(q1*q2+q0*q3),q0*q0+q1*q1—q2*q2-q3*q3)*57.3;}elsereturn2;return0;}AHRS關(guān)鍵代碼functionobj=Updat(yī)e(obj,Gyroscope,Accelerometer,Magnetometer)q=obj。Quaternion;%shortnamelocalvariableforreadability%Normaliseaccelerometermeasurementif(norm(Accelerometer)==0),return;end%handleNaNAccelerometer=Accelerometer/norm(Accelerometer);%normalisemagnitude%Normalisemagnetometermeasurementif(norm(Magnetometer)==0),return;end%handleNaNMagnetometer=Magnetometer/norm(Magnetometer);%normalisemagnitude%ReferencedirectionofEarth'smagneticfeildh=quat(yī)ernProd(q,quat(yī)ernProd([0Magnetometer],quaternConj(q)));b=[0norm([h(2)h(3)])0h(4)];%Estimateddirectionofgravityandmagneticfieldv=[2*(q(2)*q(4)-q(1)*q(3))2*(q(1)*q(2)+q(3)*q(4))q(1)^2-q(2)^2-q(3)^2+q(4)^2];w=[2*b(2)*(0。5-q(3)^2—q(4)^2)+2*b(4)*(q(2)*q(4)—q(1)*q(3))2*b(2)*(q(2)*q(3)-q(1)*q(4))+2*b(4)*(q(1)*q(2)+q(3)*q(4))2*b(2)*(q(1)*q(3)+q(2)*q(4))+2*b(4)*(0。5—q(2)^2—q(3)^2)];%Errorissumofcrossproductbetweenestimateddirection?%andmeasureddirectionoffieldse=cross(Accelerometer,v)+cross(Magnetometer,w);if(obj。Ki〉0)obj。eInt=obj。eInt+e*obj.SamplePeriod;elseobj.eInt=[000];end%ApplyfeedbacktermsGyroscope=Gyroscope+obj.Kp*e+obj。Ki*obj。eInt;%ComputerateofchangeofquaternionqDot=0。5*quaternProd(q,[0Gyroscope(1)Gyroscope(2)Gyroscope(3)]);%Integratetoyieldquaternionq=q+qDot*obj.SamplePeriod;obj。Quaternion=q/norm(q);%normalisequaternionendfunctionobj=UpdateIMU(obj,Gyroscope,Accelerometer)q=obj.Quat(yī)ernion;%shortnamelocalvariableforreadability%Normaliseaccelerometermeasurementif(norm(Accelerometer)==0),return;end%handleNaNAccelerometer=Accelerometer/norm(Accelerometer);%normalisemagnitude%Estimateddirectionofgravityandmagneticfluxv=[2*(q(2)*q(4)-q(1)*q(3))2*(q(1)*q(2)+q(3)*q(4))q(1)^2-q(2)^2—q(3)^2+q(4)^2];%Errorissumofcrosductbetweenestimateddirection %andmeasureddirectionoffielde=cross(Accelerometer,v);if(obj.Ki〉0)obj.eInt=obj.eInt+e*obj.SamplePeriod;elseobj.eInt=[000];end%ApplyfeedbacktermsGyroscope=Gyroscope+obj。Kp*e+obj.Ki*obj.eInt;%Computerateofchangeofquat(yī)ernionqDot=0.5*quat(yī)ernProd(q,[0Gyroscope(1)Gyroscope(2)Gyroscope(3)]);%Integratetoyieldquat(yī)ernionq=q+qDot*obj。SamplePeriod;obj。Quaternion=q/norm(q);%normalisequaternionend卡爾曼濾波四維擴(kuò)展卡爾曼濾波算法擴(kuò)展卡爾曼濾波算法(ExtendedKalmanFilter,EKF)是一套由計(jì)算機(jī)實(shí)現(xiàn)的實(shí)時(shí)遞推算法,所處理的對象是隨機(jī)信號,利用系統(tǒng)噪聲和觀測噪聲的統(tǒng)計(jì)特性,以系統(tǒng)的觀測量作為濾波器的輸入,以所要求的估計(jì)值(系統(tǒng)的狀態(tài)變量)作為濾波器的輸出,濾波器的輸入和輸出由時(shí)間更新和觀測更新算法聯(lián)系在一起,根據(jù)系統(tǒng)的狀態(tài)方程和觀測方程估算出所需要處理的信號。AHRS擴(kuò)展卡爾曼濾波算法的狀態(tài)變量采用四維四元數(shù),與采用歐拉角相比,避免了采用歐拉角計(jì)算時(shí)涉及的大量三角函數(shù)運(yùn)算,保證了更新速率和實(shí)時(shí)性,同時(shí)不存在采用歐拉角運(yùn)算出現(xiàn)的奇異性.歐拉角與四元數(shù)的轉(zhuǎn)換關(guān)系如下:θ=-asin2qφ=atan2Ψ=atan22四元數(shù)微分方程如式(4)所示:q1四元數(shù)姿態(tài)矩陣微分方程只要解4個(gè)微分方程,比方向余弦姿態(tài)矩陣微分方程減少了大量的運(yùn)算,便于微處理器的編程實(shí)現(xiàn)。時(shí)間更新系統(tǒng)的狀態(tài)方程如式(5)所示。Xk=AXk-1其中狀態(tài)變量為四元數(shù)X=q0,q1,qA=1-狀態(tài)變量的時(shí)間更新如式(7)所示。Xk=AXk-1協(xié)方差矩陣Pk預(yù)測如式(8)所示,式中Pk=APk-1觀測更新AHRS的觀測更新是通過本體坐標(biāo)系上的重力加速度和地磁場的參考矢量旋轉(zhuǎn)至導(dǎo)航坐標(biāo)系上,再與加速度和磁場傳感器比較,得到觀測變量的殘余。由本體系轉(zhuǎn)換至導(dǎo)航系的轉(zhuǎn)移矩陣由四元數(shù)可以表示為式(9)。Cnb三位參考向量v轉(zhuǎn)移至導(dǎo)航系中可有觀測方程式(10)表示h=Cnb當(dāng)重力加速度觀測更新時(shí)參考向量v等于重力加速度參考矢量(可設(shè)置為當(dāng)平臺靜止水平放置時(shí),加速度計(jì)測量得到的三維矢量為:v=當(dāng)磁場觀測更新時(shí)v等于磁場參考矢量(可設(shè)置為當(dāng)平臺靜止水平放置且航向指向正北時(shí),磁阻計(jì)測量得到的三維矢量為:v=H是h對X求偏導(dǎo)的雅可比矩陣,如式(11)所示。Hi,j=?卡爾曼增益矩陣KkKk=Pk觀測更新:Xk=Xk當(dāng)重力加速度觀測更新時(shí)zkz當(dāng)磁場觀測更新時(shí)zkz協(xié)方差更新:Pk=(1-KkATK-HC05關(guān)鍵代碼初始化ATK-HC05模塊//初始化ATK-HC05模塊//返回值:0,成功;1,失敗。u8HC05_Init(void){?u8retry=10,t; u8temp=1; GPIO_InitTypeDefGPIO_InitStructure;?RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF|RCC_AHB1Periph_GPIOC,ENABLE);//使能GPIOC,GPIOF時(shí)鐘?GPIO_InitStructure.GPIO_Pin=GPIO

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論