久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 11263|回復(fù): 0
打印 上一主題 下一主題
收起左側(cè)

基于ARM傾角和加速度的檢測(cè)裝置的設(shè)計(jì)(MPU6050)

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:294212 發(fā)表于 2018-3-19 19:51 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
該文件是本人課程設(shè)計(jì)希望對(duì)大家有所幫助。

測(cè)控技術(shù)與儀器專業(yè)

綜合課程設(shè)計(jì)

基于ARM的加速度和傾檢測(cè)裝置的設(shè)計(jì)


學(xué)生姓名
發(fā)帖作者
學(xué)號(hào)
311404001919
班級(jí)
測(cè)控14-3
指導(dǎo)老師
完成日期
:  2018.3.9


理工大學(xué)機(jī)械與動(dòng)力工程學(xué)院

0



2014級(jí)測(cè)控技術(shù)與儀器專業(yè)綜合課程設(shè)計(jì)

摘要


設(shè)計(jì)了基于STM32F103RCT6的高精度傾斜角和加速度檢測(cè)系統(tǒng),系統(tǒng)硬件包括電源電路、六軸傳感器(MPU6050)、2.8寸 TFT液晶顯示屏、藍(lán)牙模塊以及其他輔助電路;軟件上采用MDK5開發(fā)環(huán)境對(duì)ARM核心板進(jìn)行編程、上位機(jī)進(jìn)行數(shù)據(jù)顯示;該系統(tǒng)可以對(duì)傳感器傾斜角及加速度進(jìn)行檢測(cè)、通過手機(jī)接收MCU傳感器數(shù)據(jù)、系統(tǒng)與上位機(jī)進(jìn)行信息交互。程序先初始化 MPU6050 等外設(shè),然后利用DMP庫,初始化 MPU6050 及使能DMP,最后,在死循環(huán)里面不停讀取:溫度傳感器、加速度傳感器、陀螺儀、 DMP 姿態(tài)解算后的歐拉角等數(shù)據(jù),通過串口上報(bào)給上位機(jī)(溫度不上報(bào)),利用上位機(jī)軟件,可以實(shí)時(shí)顯示 MPU6050 的傳感器狀態(tài)曲線,實(shí)時(shí)顯示 3D 姿態(tài)。可以通過 KEY0按鍵開啟/關(guān)閉數(shù)據(jù)上傳功能。同時(shí),在 LCD模塊上面顯示溫度和歐拉角等信息。



2014級(jí)測(cè)控技術(shù)與儀器專業(yè)綜合課程設(shè)計(jì)
目  錄

摘  要              I

1  設(shè)計(jì)任務(wù)書

1.1              涉及專業(yè)課程              (1)

1.2              設(shè)計(jì)任務(wù)              (1)

1.3              設(shè)計(jì)目標(biāo)              (1)

1.4              本設(shè)計(jì)的主要功能              (2)

1.5              本章小結(jié)              (2)

2  設(shè)計(jì)論證及計(jì)劃

2.1              課程設(shè)計(jì)背景及設(shè)計(jì)意義              (3)

2.2              設(shè)計(jì)采用軟件及規(guī)劃              (3)

2.3              本章小結(jié)              (4)

3  硬件系統(tǒng)設(shè)計(jì)

3.1              總體方案設(shè)計(jì)              (5)

3.2              元器件的選型及分析              (5)

3.3              系統(tǒng)模塊功能及接口設(shè)計(jì)              (13)

3.4              本章小結(jié)              (15)

4  軟件系統(tǒng)設(shè)計(jì)

4.1              軟件系統(tǒng)總體方案設(shè)計(jì)              (16)

4.2              軟件流程設(shè)計(jì)              (16)

4.3              程序代碼設(shè)計(jì)與分析              (17)

4.4              本章小結(jié)              (23)

5  程序載入與調(diào)試

5.1              調(diào)試環(huán)境與工具              (24)

5.2              調(diào)試過程及現(xiàn)象分析              (24)

6  總結(jié)與展望

6.1              課程設(shè)計(jì)總結(jié)              (30)

6.2              工作展望              (30)

附  錄A 設(shè)計(jì)程序              (31)

附  錄 B 設(shè)計(jì)參考資料              (37)



2014級(jí)測(cè)控技術(shù)與儀器專業(yè)綜合課程設(shè)計(jì)
1
     設(shè)計(jì)任務(wù)書



    •   涉及專業(yè)課程

本設(shè)計(jì)主要涉及的專業(yè)課程有:

1、單片機(jī)原理及應(yīng)用

2、信號(hào)分析與處理

3、計(jì)算機(jī)控制技術(shù)

4、傳感器技術(shù)

5、電子線路CAD

6、數(shù)字電子技術(shù)

7、復(fù)變函數(shù)與積分變換




    •   設(shè)計(jì)任務(wù)
1、基于MEMS集成電路檢測(cè)傾斜角度案例:MEMS三軸陀螺儀的傾斜角檢測(cè)應(yīng)用;知識(shí)點(diǎn)包括MEMS陀螺儀的檢測(cè)原理、檢測(cè)電路、常用芯片型號(hào),常見MEMS陀螺儀應(yīng)用場(chǎng)合及注意事項(xiàng)。
2、基于MEMS集成電路檢測(cè)加速度案例:MEMS三軸加速度計(jì)的加速度檢測(cè)應(yīng)用;知識(shí)點(diǎn)包括MEMS加速度的檢測(cè)原理、檢測(cè)電路、常用芯片型號(hào),常見MEMS加速度計(jì)應(yīng)用場(chǎng)合及注意事項(xiàng)。


    •   設(shè)計(jì)目標(biāo)

根據(jù)設(shè)計(jì)任務(wù)并完成以下目標(biāo)

  • 了解六軸傳感器MPU6050工作原理以及其工作方式。
  • 熟練運(yùn)用ARM完成對(duì)傳感器的操作與控制;
  • 傳感器數(shù)據(jù)通過串口通信在上位機(jī)上模擬顯示;
  • 系統(tǒng)與手機(jī)通過藍(lán)牙進(jìn)行數(shù)據(jù)傳輸;
    •   本設(shè)計(jì)的主要功能
該系統(tǒng)主要可以完成對(duì)傾斜角及加速度的檢測(cè)、數(shù)據(jù)通過藍(lán)牙上傳到手機(jī)、與上位機(jī)進(jìn)行信息交互、上位機(jī)顯示三軸方向加速度、顯示三軸方向傾角、實(shí)時(shí)顯示MPU6050的傳感器狀態(tài)曲線、數(shù)據(jù)3D模擬顯示等功能。


    •   本章小結(jié)

結(jié)合所學(xué)課程和設(shè)計(jì)任務(wù),制定了相應(yīng)的工作任務(wù),合理規(guī)劃工作步驟。

2     設(shè)計(jì)論證及計(jì)劃
市面上已經(jīng)出現(xiàn)了眾多以陀螺儀或加速度傳感器為核心的智能設(shè)備,本次課程設(shè)計(jì)以此為課題具有可行性。

    •   課程設(shè)計(jì)背景及設(shè)計(jì)意義
現(xiàn)代工業(yè)生產(chǎn)設(shè)備的發(fā)展正在朝著向大型化,高速化,連續(xù)化和自動(dòng)化的方向發(fā)展。其復(fù)雜程度日益增加,所涉及的知識(shí)范圍廣泛,不但包括機(jī)械設(shè)計(jì)、材料科學(xué),現(xiàn)在又加入了計(jì)算機(jī)技術(shù)、光學(xué)、電路技術(shù)等,其不但價(jià)格昂貴,維護(hù)也同樣麻煩。面對(duì)如此龐大的機(jī)械設(shè)備,我們必須需要一些儀器儀表來進(jìn)行輔助檢查與測(cè)試,我們希望這些儀器儀表具有一定的智能,不但要具有實(shí)時(shí)檢測(cè)、自動(dòng)報(bào)警、結(jié)果顯示與保存等功能,還要具有體積小、重量輕、便于攜帶等優(yōu)點(diǎn)。然而傳統(tǒng)的機(jī)電儀表雖然具備某些優(yōu)點(diǎn),但其本身也是機(jī)、電、光、算的結(jié)合物,其使用與維護(hù)也相當(dāng)?shù)膹?fù)雜,不利于當(dāng)今機(jī)械設(shè)備的發(fā)展。
隨著現(xiàn)代網(wǎng)絡(luò)技術(shù)的發(fā)展和企業(yè)規(guī)模的快速擴(kuò)大,功能獨(dú)立的近距離的傳統(tǒng)儀器測(cè)量已不能滿足工業(yè)需求,遠(yuǎn)距離且大規(guī)模的測(cè)量?jī)x器群將是未來發(fā)展的趨勢(shì)。由于傳統(tǒng)的儀器是模擬信號(hào),不利于計(jì)算機(jī)的控制與運(yùn)算,將不可能勝任現(xiàn)代企業(yè)管理及技術(shù)發(fā)展的需要。
由上分析,我們意識(shí)到傳統(tǒng)的測(cè)量?jī)x器在成本價(jià)格、制作技術(shù)、操作簡(jiǎn)便性等方面存在著不足,不能滿足社會(huì)的需要。而近年來發(fā)展起來的虛擬儀器技術(shù)則在成本價(jià)格、制作技術(shù)、操作簡(jiǎn)便性方面有著不俗的表現(xiàn),能很好的滿足現(xiàn)代科學(xué)技術(shù)發(fā)展的需要,是儀器儀表未來發(fā)展的的重要方向。
六軸傳感器MPU6050近年來廣泛應(yīng)用于各個(gè)領(lǐng)域,是未來智能設(shè)備中不可或缺的重要元件智能型手機(jī)、平板裝置設(shè)備、手持型游戲產(chǎn)品、游戲機(jī)、3D遙控器、可攜式導(dǎo)航設(shè)備。

    •   設(shè)計(jì)采用軟件及設(shè)計(jì)規(guī)劃
本課程設(shè)計(jì)是在MDK環(huán)境下完成的,采用C語言進(jìn)行編程,完全采用面向?qū)ο蟮拈_發(fā)思想,具有很大的個(gè)人發(fā)揮空間,完成同一種功能可以從不同方面下手解決。MDK源自德國(guó)的KEIL公司,是RealView MDK的簡(jiǎn)稱。在全球MDK被超過10萬的嵌入式開發(fā)工程師使用。目前最新版本為:MDK5.14,該版本為 uVision5 IDE集成開發(fā)環(huán)境,是目前針對(duì)ARM處理器,尤其是Cortex M內(nèi)核處理器的最佳開發(fā)工具。
設(shè)計(jì)規(guī)劃:
針對(duì)此次課程設(shè)計(jì),設(shè)計(jì)如下規(guī)劃,如圖2.1所示。

圖2.1 課程設(shè)計(jì)規(guī)劃

    •   本章小結(jié)
本章主要對(duì)課程設(shè)計(jì)的背景進(jìn)行了介紹并對(duì)設(shè)計(jì)進(jìn)行規(guī)劃,制定出合理的工作流程。
3     硬件系統(tǒng)設(shè)計(jì)



    •   總體設(shè)計(jì)方案
傾角加速度檢測(cè)系統(tǒng),主要要完成對(duì)溫度、加速度、傾斜角的采集、顯示等工作。傳統(tǒng)上采集加速度利用的是三軸加速度傳感器而采集傾斜角利用的是三軸陀螺儀,針對(duì)本次課程設(shè)計(jì)要求成本相對(duì)較高。鑒于上述原因,本系統(tǒng)采用MPU6050六軸陀螺儀作為核心傳感器。外部數(shù)據(jù)信號(hào)經(jīng) MPU6050將輸入的模擬信號(hào)轉(zhuǎn)換成數(shù)字信號(hào),并通過IO口傳送到單片機(jī)系統(tǒng)( STM32RCT6)。單片機(jī)系統(tǒng)將接收的數(shù)字信號(hào)譯碼處理,通過TFTLCD將溫度及各個(gè)方向傾角顯示出來,如圖3.1說所示。


圖3.1 設(shè)計(jì)整體架構(gòu)(見附件)



    •   元器件的選型及分析

3.2.1MCU選型及分析

STM32F103RCT6是ST公司推出的一款以CortexM3為核心設(shè)計(jì)的32位單片機(jī),遠(yuǎn)超8位51單片機(jī),能出色完成設(shè)計(jì)任務(wù)。STM32的優(yōu)異性體現(xiàn)在以下幾個(gè)方面。
1.超低的價(jià)格。以8位機(jī)的價(jià)格,得到32位機(jī),是STM32最大的優(yōu)勢(shì)。
2.超多的外設(shè)。STM32擁有包括:FSMC、TIMER、SPI、IIC、USB、CAN、IIS、SDIO、ADC、DAC、RTC、DMA等眾多外設(shè)及功能,具有極高的集成度。
3.豐富的型號(hào)。STM32僅M3內(nèi)核就擁有F100、F101、F102、F103、F105、F107、F207、F217等8個(gè)系列上百種型號(hào),具有QFN、LQFP、BGA等封裝可供選擇。同時(shí)STM32還推出了STM32L和STM32W等超低功耗和無線應(yīng)用型的M3芯片。
4.優(yōu)異的實(shí)時(shí)性能。84個(gè)中斷,16級(jí)可編程優(yōu)先級(jí),并且所有的引腳都可以作為中斷輸入。
5.杰出的功耗控制。STM32各個(gè)外設(shè)都有自己的獨(dú)立時(shí)鐘開關(guān),可以通過關(guān)閉相應(yīng)外設(shè)的時(shí)鐘來降低功耗。
6.極低的開發(fā)成本。STM32的開發(fā)不需要昂貴的仿真器,只需要一個(gè)串口即可下載代碼,并且支持SWD和JTAG兩種調(diào)試口。SWD調(diào)試可以為你的設(shè)計(jì)帶來跟多的方便,只需要2個(gè)IO口,即可實(shí)現(xiàn)仿真調(diào)試。

STM32F103RCT6原理圖,如圖3.2所示。

圖3.2 MCU原理圖

3.2.2 傳感器選型及分析

設(shè)計(jì)要求完成對(duì)傾斜角、加速度和溫度的檢測(cè),完成以上要求分別需要3軸陀螺儀、3軸加速度傳感傳感器、溫度傳感器考慮到成本等各方面因素本次課程設(shè)計(jì)選用具有多種功能的6軸傳感器(MPU6050)來完成對(duì)數(shù)據(jù)的檢測(cè)。
MPU6050 是 InvenSense 公司推出的全球首款整合性 6 軸運(yùn)動(dòng)處理組件,相較于多組件方案,免除了組合陀螺儀與加速器時(shí)之軸間差的問題,減少了安裝空間。MPU6050 內(nèi)部整合了 3 軸陀螺儀和 3 軸加速度傳感器,并且含有一個(gè)第二 IIC 接口,可用于連接外部磁力傳感器,并利用自帶的數(shù)字運(yùn)動(dòng)處理器(DMP: Digital Motion Processor)硬件加速引擎,通過主 IIC 接口,向應(yīng)用端輸出完整的 9 軸融合演算數(shù)據(jù)。有了 DMP,我們可以使用InvenSense 公司提供的運(yùn)動(dòng)處理資料庫,非常方便的實(shí)現(xiàn)姿態(tài)解算,降低了運(yùn)動(dòng)處理運(yùn)算對(duì)操作系統(tǒng)的負(fù)荷,同時(shí)大大降低了開發(fā)難度。
MPU6050 的特點(diǎn)包括:
① 以數(shù)字形式輸出 6 軸或 9 軸(需外接磁傳感器)的旋轉(zhuǎn)矩陣、四元數(shù)(quaternion)、歐拉角格式的融合演算數(shù)據(jù)(需 DMP 支持)。
② 具有 131 LSBs/° /sec 敏感度與全格感測(cè)范圍為±250、±500、±1000 與±2000° /sec的 3 軸角速度感測(cè)器(陀螺儀)。
③ 集成可程序控制,范圍為±2g、±4g、±8g 和±16g 的 3 軸加速度傳感器。
④ 移除加速器與陀螺儀軸間敏感度,降低設(shè)定給予的影響與感測(cè)器的飄移。
⑤ 自帶數(shù)字運(yùn)動(dòng)處理(DMP: Digital Motion Processing)引擎可減少 MCU 復(fù)雜的融合演算數(shù)據(jù)、感測(cè)器同步化、姿勢(shì)感應(yīng)等的負(fù)荷。
⑥ 運(yùn)作時(shí)間偏差與磁力感測(cè)器校正演算技術(shù),免除了須另外進(jìn)行校正的需求
⑦ 自帶一個(gè)數(shù)字溫度傳感器。
⑧ 帶數(shù)字輸入同步引腳(Sync pin)支持視頻電子影像穩(wěn)定技術(shù)與GPS。
⑨ 可程序控制的中斷(interrupt),支持姿勢(shì)識(shí)別、搖攝、畫面放大縮小、滾動(dòng)、快速下降中斷、 high-G 中斷、動(dòng)作感應(yīng)、觸擊感應(yīng)、搖動(dòng)感應(yīng)功能。
⑩ VDD 供電電壓為 2.5V±5%、 3.0V±5%、 3.3V±5%; VLOGIC 可低至 1.8V
⑪ 陀螺儀工作電流: 5mA,陀螺儀待機(jī)電流: 5uA;加速器工作電流: 500uA,加速器省電模式電流: 40uA@10Hz。
⑫ 自帶 1024 字節(jié) FIFO,有助于降低系統(tǒng)功耗。
⑬ 高達(dá) 400Khz 的 IIC 通信接口。
⑭ 超小封裝尺寸: 4x4x0.9mm(QFN)。

MPU6050傳感器實(shí)物圖如3.3所示,其檢測(cè)軸如圖3.4所示。

3.3 MPU6050實(shí)物圖


圖3.4 MPU605檢測(cè)軸方向


MPU6050的內(nèi)部框圖如圖3.5所示。

圖3.5 MPU內(nèi)部框圖
其中SCL和SDA是連接MCU的IIC接口,MCU通過這個(gè)IIC接口控MPU6050,另外還有一個(gè)IIC接口:AUX_CL和AUX_DA,這個(gè)接口可用來連接外部從設(shè)備,比如磁傳感器,這樣就可以組成一個(gè)9軸傳感器。VLOGIC是IO口電壓,該引腳最低可以到1.8V,我們一般直接接VDD即可。AD0是從IIC接口(接MCU)的地址控制引腳,該引腳控制IIC地址的最低位。如果接GND,則MPU6050的IIC地址是:0X68,如果接VDD,則是0X69。MPU6050外圍電路如圖3.6所示。

圖3.6 MPU6050外圍電路圖
MPU6050工作原理:

陀螺儀檢測(cè)也不是完全精確的,存在一定的誤差。由于陀螺儀測(cè)量角度時(shí)使用積
圖3.7 積分誤差

分,會(huì)存在積分誤差,如圖3.7所示,若積分時(shí)間Dt越小,誤差就越小。這十分容易理解,例如計(jì)算路程時(shí),假設(shè)行車時(shí)間為 1 小時(shí),我們隨機(jī)選擇行車過程某個(gè)時(shí)刻的速度Vt乘以1小時(shí),求出的路程誤差是極大的,因?yàn)樾熊嚨倪^程中并不是每個(gè)時(shí)刻都等于該時(shí)刻速度的,如果我們每5分鐘檢測(cè)一次車速,可得到Vt1、Vt2、Vt3-Vt12這12個(gè)時(shí)刻的車速,對(duì)各個(gè)時(shí)刻的速度乘以時(shí)間間隔(5分鐘),并對(duì)這12個(gè)結(jié)果求和,就可得出一個(gè)相對(duì)精確的行車路程了,不斷提高采樣頻率,就可以使積分時(shí)間Dt變小,降低誤差。
同樣地,提高陀螺儀傳感器的采樣頻率,即可減少積分誤差,目前非常普通的陀螺儀傳感器的采樣頻率都可以達(dá)到8KHz,已能滿足大部分應(yīng)用的精度要求。
更難以解決的是器件本身誤差帶來的問題。例如,某種陀螺儀的誤差是0.1度/秒,當(dāng)陀螺儀靜止不動(dòng)時(shí),理想的角速度應(yīng)為0,無論它靜止多久,對(duì)它進(jìn)行積分測(cè)量
得的旋轉(zhuǎn)角度都是0,這是理想的狀態(tài);而由于存在0.1度/秒的誤差,當(dāng)陀螺儀靜止不動(dòng)時(shí),它采樣得的角速度一直為0.1度/秒,若靜止了1分鐘,對(duì)它進(jìn)行積分測(cè)量得的旋轉(zhuǎn)角度為6度,若靜止了1小時(shí),陀螺儀進(jìn)行積分測(cè)量得的旋轉(zhuǎn)角度就是360度,即轉(zhuǎn)過了一整圈。只有當(dāng)正方向誤差和負(fù)方向誤差能正好互相抵消的時(shí)候,才能消除這種累計(jì)誤差。
三軸加速度傳感器檢測(cè)原理:

由于直接用陀螺儀測(cè)量角度在長(zhǎng)時(shí)間測(cè)量時(shí)會(huì)產(chǎn)生累計(jì)誤差,引入了檢測(cè)傾角的傳感器。測(cè)量?jī)A角最常見的例子是建筑中使用的水平儀,在重力的影響下,水平儀內(nèi)的氣泡能大致反映水柱所在直線與重力方向的夾角關(guān)系,利用圖3.8中的T字型水平儀,可以檢測(cè)出橫滾角與俯仰角,而偏航角是無法以這樣的方式檢測(cè)的。在電子設(shè)備中,一般使用加速度傳感器來檢測(cè)傾角,它通過檢測(cè)器件在各個(gè)方向的形變情況而采樣得到受力數(shù)據(jù),根據(jù)F=ma轉(zhuǎn)換,傳感器直接輸出加速度數(shù)據(jù),因而被稱為加速度傳感器。由于地球存在重力場(chǎng),所以重力在任何時(shí)刻都會(huì)作用于傳感器,當(dāng)傳感器靜止的時(shí)候(實(shí)際上加速度為0),傳感器會(huì)在該方向檢測(cè)出加速度g,不能認(rèn)為重力方向測(cè)出的加速度為g,就表示傳感器在該方向作加速度為g的運(yùn)動(dòng)。
圖3.8 T字型水平儀

當(dāng)傳感器的姿態(tài)不同時(shí),它在自身各個(gè)坐標(biāo)軸檢測(cè)到的重力加速度是不一樣利用
各方向的測(cè)量結(jié)果,根據(jù)力的分解原理,可求出各個(gè)坐標(biāo)軸與重力之間的夾角,如圖3.9所示。
圖3.9 重力檢測(cè)
因?yàn)橹亓Ψ较蚴桥c地理坐標(biāo)系的“天地”軸固連的,所以通過測(cè)量載體坐標(biāo)系方向軸與重力方向的夾角即可求得它與地理坐標(biāo)系的角度旋轉(zhuǎn)關(guān)系,從而獲知載體姿態(tài)。
加度傳感器檢測(cè)的誤差
由于這種傾角檢測(cè)方式是利用重力進(jìn)行檢測(cè)的,它無法檢測(cè)到偏航角(Yaw),原理跟 T字型水平儀一樣,無論如何設(shè)計(jì)水平儀,水泡都無法指示這樣的角度。
另一個(gè)缺陷是加速度傳感器并不會(huì)區(qū)分重力加速度與外力加速度,當(dāng)物體運(yùn)動(dòng)的時(shí)候,它也會(huì)在運(yùn)動(dòng)的方向檢測(cè)出加速度,特別在震動(dòng)的狀態(tài)下,傳感器的數(shù)據(jù)會(huì)有非常大的數(shù)據(jù)變化,此時(shí)難以反應(yīng)重力的實(shí)際值。
利用磁場(chǎng)檢測(cè)角度
為了彌補(bǔ)加速度傳感器無法檢測(cè)偏航角(Yaw)的問題,我們?cè)僖氪艌?chǎng)檢測(cè)傳感器,它可以檢測(cè)出各個(gè)方向上的磁場(chǎng)大小,通過檢測(cè)地球磁場(chǎng),它可實(shí)現(xiàn)指南針的功能,所以也被稱為電子羅盤。由于地磁場(chǎng)與地理坐標(biāo)系的“南北”軸“固聯(lián)”,利用磁場(chǎng)檢測(cè)傳感器的指南針功能,就可以測(cè)量出偏航角(Yaw)了。
磁場(chǎng)檢測(cè)器的誤差
與指南針的缺陷一樣,使用磁場(chǎng)傳感器會(huì)受到外部磁場(chǎng)干擾,如載體本身的電磁場(chǎng)干擾,不地理同環(huán)境的磁鐵礦干擾等等。
姿態(tài)融合與四元數(shù)
可以發(fā)現(xiàn),使用陀螺儀檢測(cè)角度時(shí),在靜止?fàn)顟B(tài)下存在缺陷,且受時(shí)間影響,而加速度傳感器檢測(cè)角度時(shí),在運(yùn)動(dòng)狀態(tài)下存在缺陷,且不受時(shí)間影響,剛好互補(bǔ)。假如我們同時(shí)使用這兩種傳感器,并設(shè)計(jì)一個(gè)濾波算法,當(dāng)物體處于靜止?fàn)顟B(tài)時(shí),增大加速度數(shù)據(jù)的權(quán)重,當(dāng)物體處于運(yùn)動(dòng)狀時(shí), 增大陀螺儀數(shù)據(jù)的權(quán)重,從而獲得更準(zhǔn)確的姿態(tài)數(shù)據(jù)。同理,檢測(cè)偏航角,當(dāng)載體在靜止?fàn)顟B(tài)時(shí),可增大磁場(chǎng)檢測(cè)器數(shù)據(jù)的權(quán)重,當(dāng)載體在運(yùn)動(dòng)狀態(tài)時(shí),增大陀螺儀和 GPS 檢測(cè)數(shù)據(jù)的權(quán)重。這些采用多種傳感器數(shù)據(jù)來檢測(cè)姿態(tài)的處理算法被稱為姿態(tài)融合。
在姿態(tài)融合解算的時(shí)候常常使用“四元數(shù)”來表示姿態(tài),它由三個(gè)實(shí)數(shù)及一個(gè)虛數(shù)組成,因而被稱之為四元數(shù)。使用四元數(shù)表示姿態(tài)并不直觀,但因?yàn)槭褂脷W拉角(即前面說的偏航角、橫滾角及俯仰角)表示姿態(tài)的時(shí)候會(huì)有“萬向節(jié)死鎖”問題,且運(yùn)算比較復(fù)雜,所以一般在數(shù)據(jù)處理的時(shí)候會(huì)使用四元數(shù),處理完畢后再把四元數(shù)轉(zhuǎn)換成歐拉角。

    •   系統(tǒng)模塊功能及接口設(shè)計(jì)
該設(shè)計(jì)采用精英STM32F1開發(fā)板的IIC接口連接MPU6050模塊,本章實(shí)驗(yàn)功能簡(jiǎn)介:程序先初始化MPU6050等外設(shè),然后利用DMP庫,初始化MPU6050及使DMP,最后,在死循環(huán)里面不停讀取:溫度傳感器、加速度傳感器、陀螺儀、DMP姿態(tài)解算后的歐拉角等數(shù)據(jù),通過串口上報(bào)給上位機(jī)(溫度不上報(bào)),利用上位機(jī)軟件,可以實(shí)時(shí)顯示 MPU6050 的傳感器狀態(tài)曲線,并顯示3D姿態(tài),可以通過KEY0 按鍵開啟/關(guān)閉數(shù)據(jù)上傳功能。同時(shí),在 LCD 模塊上面顯示溫度和歐拉角等信息。DS0來指示程序正在運(yùn)行。

MPU6050引腳說明

該模塊引出8個(gè)引腳功能說明如表3.1所示。
表3.1 MPU6050功能引腳說明
序號(hào)                     引腳名稱                          說明
1              VCC              3.3/5V 電源輸入
2              GND              地線
3              SCL              I2C從時(shí)鐘信號(hào)線SCL(模塊上已接上拉電阻)
4              SDA              I2C從數(shù)據(jù)信號(hào)線SDA(模塊上已接上拉電阻)
5              XDA              I2C主串行數(shù)據(jù)信號(hào)線,用于外接傳感器
6              XCL              I2C主串行數(shù)據(jù)信號(hào)線,用于外接傳感器
7              AD0              從機(jī)地址設(shè)置引腳:接地或懸空,地址為:0X68
                            接VCC時(shí),地址為:0X69
8              INT          中斷輸出引腳
其中的SDA/SCL、XDA/XCL通訊引腳分別為兩組I2C信號(hào)線。當(dāng)模塊與外部主機(jī)通訊時(shí),使用SDA/SCL,如與STM32芯片通訊;而XDA/XCL則用于MPU6050芯片與其它I2C傳感器通訊時(shí)使用,例如使用它與磁場(chǎng)傳感器連接,MPU6050模塊可以把從主機(jī)SDA/SCL接收的數(shù)據(jù)或命令通過XDA/XCL引腳轉(zhuǎn)發(fā)到磁場(chǎng)傳感器中。但實(shí)際上這種功能比較雞肋,控制麻煩且效率低,一般會(huì)直接把磁場(chǎng)傳感器之類的I2C傳感器直接與MPU6050掛載在同一條總線上(即都連接到SDA/SCL),使用主機(jī)直接控制。

所要用到的硬件資源主要有STM32開發(fā)板和MPU6050模塊,它們的連接方式如圖3.10所示。MPU6050模塊與外部連接,引出了VCC、GND、IIC_SDA、IIC_SCL、MPU_INT和MPU_AD0等信號(hào)。其中,IIC_SDA和IIC_SCL帶了4.7K上拉電阻,外部可以不用再加上拉電阻了,另外MPU_AD0自帶了10K下拉電阻,當(dāng)AD0 懸空時(shí),默認(rèn)IIC地址為(0X68)。模塊的IIC_SCL、IIC_SDA分別連接在STM32的PC12、PC11上面。XDA和XCL是用來擴(kuò)展連接磁力傳感器使MPU6050轉(zhuǎn)換為“九軸傳感器”。
圖3.10 連接方式圖



    •   本章小結(jié)
本章主要介紹CMU的選型外設(shè),以及各種傳感器測(cè)角度的原理及缺陷,MPU6050利用姿態(tài)融合算法彌補(bǔ)傳統(tǒng)傳感器設(shè)計(jì)缺陷。MPU6050各個(gè)接口的功能介紹,單片機(jī)與MPU6050連接方式的設(shè)計(jì)。

4     軟件系統(tǒng)設(shè)計(jì)



    •   軟件系統(tǒng)總體方案設(shè)計(jì)
系統(tǒng)軟件設(shè)計(jì)環(huán)境是MDK,軟件設(shè)計(jì)由主程序模塊、MPU6050程序模塊、串口通訊模塊以及液晶驅(qū)動(dòng)程序模塊組成。



    •   軟件流程設(shè)計(jì)
1)初始化IIC接口
MPU6050采用IIC與STM32F1通信,所以我們需要先初始化與MPU6050連接的SDA和SCL數(shù)據(jù)線。
2)復(fù)位MPU6050
這一步讓MPU6050內(nèi)部所有寄存器恢復(fù)默認(rèn)值,通過對(duì)電源管理寄存器1(0X6B)的bit7寫1實(shí)現(xiàn)。復(fù)位后,電源管理寄存器1恢復(fù)默認(rèn)值(0X40),然后必須設(shè)置該寄存器為0X00,以喚醒MPU6050,進(jìn)入正常工作狀態(tài)。
3)設(shè)置角速度傳感器(陀螺儀)和加速度傳感器的滿量程范圍
這一步,設(shè)置兩個(gè)傳感器的滿量程范圍(FSR),分別通過陀螺儀配置寄存器(0X1B)和加速度傳感器配置寄存器(0X1C)設(shè)置。我們一般設(shè)置陀螺儀的滿量程范圍為±2000dps,加速度傳感器的滿量程范圍位±2g。
4)設(shè)置其他參數(shù)
這里,我們還需要配置的參數(shù)有:關(guān)閉中斷、關(guān)閉AUX IIC接口、禁止FIFO、設(shè)置陀螺儀采樣率和設(shè)置數(shù)字低通濾波器(DLPF)等。本章我們不用中斷方式讀取數(shù)據(jù),所以關(guān)閉中斷,然后也沒用到 AUX IIC 接口外接其他傳感器,所以也關(guān)閉這個(gè)接口。分別通過中斷使能寄存器(0X38)和用戶控制寄存器(0X6A)控制。MPU6050可以使用FIFO存儲(chǔ)傳感器數(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即可。
5)配置系統(tǒng)時(shí)鐘源并使能角速度傳感器和加速度傳感器
系統(tǒng)時(shí)鐘源同樣是通過電源管理寄存器1(0X6B)來設(shè)置,該寄存器的最低三位用于設(shè)置系統(tǒng)時(shí)鐘源選擇,默認(rèn)值是0(內(nèi)部8M RC震蕩),不過我們一般設(shè)置為1,選擇x軸陀螺PLL作為時(shí)鐘源,以獲得更高精度的時(shí)鐘。同時(shí),使能角速度傳感器和加速度傳感器,這兩個(gè)操作通過電源管理寄存器2(0X6C)來設(shè)置,設(shè)置對(duì)應(yīng)位為0即可開啟。至此,MPU6050的初始化就完成了,可以正常工作了(其他未設(shè)置的寄存器全部采用默認(rèn)值即可),接下來,我們就可以讀取相關(guān)寄存器,得到加速度傳感器、角速度傳感器和溫度傳感器的數(shù)據(jù)了。



    •   程序代碼設(shè)計(jì)與分析
      • 主函數(shù)代碼設(shè)計(jì)與分析
  1. 以下是main函數(shù)中中最主要的部分程序
  2. 串口發(fā)送程序:
  3. void usart1_send_char(u8 c)
  4. {
  5.               while((USART1->SR&0X40)==0);//等待上一次發(fā)送完畢  
  6.               USART1->DR=c;               
  7. }
  8. //傳送數(shù)據(jù)給上位機(jī)軟件(
  9. void usart1_niming_report(u8 fun,u8*data,u8 len)
  10. {
  11.               u8 send_buf[32];
  12.               u8 i;
  13.               if(len>28)return;              //最多28字節(jié)數(shù)據(jù)
  14.               send_buf[len+3]=0;              //校驗(yàn)數(shù)置零
  15.               send_buf[0]=0X88;              //幀頭
  16.               send_buf[1]=fun;              //功能字
  17.               send_buf[2]=len;              //數(shù)據(jù)長(zhǎng)度
  18.               for(i=0;i<len;i++)send_buf[3+i]=data[i];                                          //復(fù)制數(shù)據(jù)
  19.               for(i=0;i<len+3;i++)send_buf[len+3]+=send_buf[i];              //計(jì)算校驗(yàn)和            
  20.               for(i=0;i<len+4;i++)usart1_send_char(send_buf[i]);              //發(fā)送數(shù)據(jù)到串口1
  21. }
  22. //發(fā)送加速度傳感器數(shù)據(jù)和陀螺儀數(shù)據(jù)
  23. //aacx,aacy,aacz:x,y,z三個(gè)方向上面的加速度值
  24. //gyrox,gyroy,gyroz:x,y,z三個(gè)方向上面的陀螺儀值
  25. void mpu6050_send_data(short aacx,short aacy,short aacz,short gyrox,short gyroy,short gyroz)
  26. 通過串口上報(bào)結(jié)算后的姿態(tài)數(shù)據(jù)給電腦:
  27. //aacx,aacy,aacz:x,y,z三個(gè)方向上面的加速度值
  28. //gyrox,gyroy,gyroz:x,y,z三個(gè)方向上面的陀螺儀值
  29. //roll:橫滾角.單位0.01度。 -18000 - 18000 對(duì)應(yīng) -180.00  - 180.00度
  30. //pitch:俯仰角.單位 0.01度。-9000 - 9000 對(duì)應(yīng) -90.00 - 90.00 度
  31. //yaw:航向角.單位為0.1度 0 – 360。0度  對(duì)應(yīng) 0 -> 360.0度
  32. void usart1_report_imu(short aacx,short aacy,short aacz,short gyrox,short gyroy,short gyroz,short roll,short pitch,short yaw)
  33. LCD初始化:
  34. int main(void)
  35. {
  36.               u8 t=0,report=1;                            //默認(rèn)開啟上報(bào)
  37.               u8 key;
  38.               float pitch,roll,yaw;               //歐拉角
  39.               short aacx,aacy,aacz;              //加速度傳感器原始數(shù)據(jù)
  40.               short gyrox,gyroy,gyroz;              //陀螺儀原始數(shù)據(jù)
  41.               short temp;                                          //溫度                 
  42.               NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
  43.               delay_init();                                //延時(shí)函數(shù)初始化               
  44.               uart_init(500000);                            //串口初始化為9600
  45.               usmart_dev.init(72);              //初始化USMART
  46.               LED_Init();                                            //初始化與LED連接的硬件接口
  47.               KEY_Init();                                          //初始化按鍵
  48.               LCD_Init();                                          //初始化LCD
  49.               MPU_Init();                                          //初始化MPU6050
  50.               POINT_COLOR=RED;                            //設(shè)置字體為紅色
  51. 顯示屏顯示數(shù)據(jù):
  52.               LCD_ShowString(30,50,200,16,16,"Wang Kai");            
  53.               LCD_ShowString(30,70,200,16,16,"MPU6050 TEST");            
  54.               LCD_ShowString(30,90,200,16,16,"HPU");
  55.               LCD_ShowString(30,110,200,16,16,"2018/3/12");
  56. while(mpu_dmp_init())
  57.               {
  58.                             LCD_ShowString(30,130,200,16,16,"MPU6050 Error");
  59.                             delay_ms(200);
  60.                             LCD_Fill(30,130,239,130+16,WHITE);
  61.                             delay_ms(200);
  62.               }
  63.               LCD_ShowString(30,130,200,16,16,"MPU6050 OK");
  64.               LCD_ShowString(30,150,200,16,16,"KEY0:UPLOAD ON/OFF");
  65.               POINT_COLOR=BLUE;//設(shè)置字體為藍(lán)色
  66.               LCD_ShowString(30,170,200,16,16,"UPLOAD ON ");            
  67.               LCD_ShowString(30,200,200,16,16," Temp:    . C");            
  68.               LCD_ShowString(30,220,200,16,16,"Pitch:    . C");            
  69.               LCD_ShowString(30,240,200,16,16," Roll:    . C");            
  70.               LCD_ShowString(30,260,200,16,16," Yaw :    . C");            
  71.               LCD_ShowString(30,280,200,16,16," Durriculum Design ");
  72.                             if(mpu_dmp_get_data(&pitch,&roll,&yaw)==0)
  73.                             {
  74.                                           temp=MPU_Get_Temperature();              //得到溫度值
  75.                                           MPU_Get_Accelerometer(&aacx,&aacy,&aacz);              //得到加速度傳感器數(shù)據(jù)
  76.                                           MPU_Get_Gyroscope(&gyrox,&gyroy,&gyroz);              //得到陀螺儀數(shù)據(jù)
  77.                             if(report)mpu6050_send_data(aacx,aacy,aacz,gyrox,gyroy,gyroz);//用自定義幀發(fā)送加速度和陀螺儀原始數(shù)據(jù)
  78. 原始數(shù)據(jù)處理:              if(report)usart1_report_imu(aacx,aacy,aacz,gyrox,gyroy,gyroz,(int)(roll*100),(int)(pitch*100),(int)(yaw*10));
  79.                                           if((t%10)==0)
  80.                                           {
  81.                                                         if(temp<0)
  82.                                                         {
  83.                                                                       LCD_ShowChar(30+48,200,'-',16,0);                            //顯示負(fù)號(hào)
  84.                                                         temp=-temp;                            //轉(zhuǎn)為正數(shù)
  85.                                                         }else LCD_ShowChar(30+48,200,' ',16,0);//去掉負(fù)號(hào)
  86.                                                         LCD_ShowNum(30+48+8,200,temp/100,3,16);//顯示整數(shù)部分                                                            LCD_ShowNum(30+48+40,200,temp%10,1,16);//顯示小數(shù)部分                                                         temp=pitch*10;            
  87.                                           if(temp<0)
  88.                                                         {
  89.                                                         LCD_ShowChar(30+48,220,'-',16,0);                            //顯示負(fù)號(hào)
  90.                                                         temp=-temp;                            //轉(zhuǎn)為正數(shù)
  91.                                                         }else LCD_ShowChar(30+48,220,' ',16,0);//去掉負(fù)號(hào)
  92.                                                         LCD_ShowNum(30+48+8,220,temp/10,3,16);              //顯示整數(shù)部分                                                            LCD_ShowNum(30+48+40,220,temp%10,1,16);              //顯示小數(shù)部分
  93.                                                         temp=roll*10;
  94.                                                         if(temp<0)
  95.                                                         {
  96.                                                         LCD_ShowChar(30+48,240,'-',16,0);                            //顯示負(fù)號(hào)
  97.                                                         temp=-temp;                            //轉(zhuǎn)為正數(shù)
  98.                                                         }else LCD_ShowChar(30+48,240,' ',16,0);//去掉負(fù)號(hào)
  99.                                                         LCD_ShowNum(30+48+8,240,temp/10,3,16);              //顯示整數(shù)部分
  100. LCD_ShowNum(30+48+40,240,temp%10,1,16);//顯示小數(shù)部分
  101.                                                         temp=yaw*10;
  102.                                                         if(temp<0)
  103.                                                         {
  104.                                 LCD_ShowChar(30+48,260,'-',16,0);              //顯示負(fù)號(hào)
  105.                                                                       temp=-temp;                            //轉(zhuǎn)為正數(shù)
  106.                                                         }else LCD_ShowChar(30+48,260,' ',16,0);//去掉負(fù)號(hào)
  107.                                                         LCD_ShowNum(30+48+40,260,temp%10,1,16);//顯示小數(shù)部分
  108.                                                         t=0;
  109.                                                         LED0=!LED0;//LED閃爍
  110.                                           }
  111.                             }

  112. 4.3.2 MPU6050程序分析

  113. MPU6050程序初始化:
  114. u8 MPU_Init(void)
  115. {
  116.               u8 res;
  117.               MPU_IIC_Init();//初始化IIC總線
  118.               MPU_Write_Byte(MPU_PWR_MGMT1_REG,0X80);              //復(fù)位MPU6050
  119. delay_ms(100);
  120.               MPU_Write_Byte(MPU_PWR_MGMT1_REG,0X00);              //喚醒MPU6050
  121.               MPU_Set_Gyro_Fsr(3);                                                                      //陀螺儀傳感器,±2000dps
  122.               MPU_Set_Accel_Fsr(0);                                                                      //加速度傳感器,±2g
  123.               MPU_Set_Rate(50);                                                                                    //設(shè)置采樣率50Hz
  124.               MPU_Write_Byte(MPU_INT_EN_REG,0X00);              //關(guān)閉所有中斷
  125.               MPU_Write_Byte(MPU_USER_CTRL_REG,0X00);//I2C主模式關(guān)閉
  126.               MPU_Write_Byte(MPU_FIFO_EN_REG,0X00);              //關(guān)閉FIFO
  127.               MPU_Write_Byte(MPU_INTBP_CFG_REG,0X80);//INT引腳低電平有效
  128.               res=MPU_Read_Byte(MPU_DEVICE_ID_REG);
  129.               if(res==MPU_ADDR)//器件ID正確
  130.               {
  131.                             MPU_Write_Byte(MPU_PWR_MGMT1_REG,0X01);//設(shè)置CLKSEL,PLL X軸為參考
  132.                             MPU_Write_Byte(MPU_PWR_MGMT2_REG,0X00);//加速度與陀螺儀都工作
  133.                             MPU_Set_Rate(50);                                                                      //設(shè)置采樣率為50Hz
  134.               }else return 1;
  135.               return 0;
  136. }
  137. //設(shè)置MPU6050陀螺儀傳感器滿量程范圍
  138. //fsr:0,±250dps;1,±500dps;2,±1000dps;3,±2000dps
  139. //返回值:0,設(shè)置成功
  140. //    其他,設(shè)置失敗
  141. u8 MPU_Set_Gyro_Fsr(u8 fsr)
  142. {
  143.               return MPU_Write_Byte(MPU_GYRO_CFG_REG,fsr<<3);//設(shè)置陀螺儀滿量程范圍
  144. }
  145. 設(shè)置MPU6050加速度傳感器滿量程范圍
  146. //fsr:0,±2g;1,±4g;2,±8g;3,±16g
  147. //返回值:0,設(shè)置成功
  148. //    其他,設(shè)置失敗
  149. u8 MPU_Set_Accel_Fsr(u8 fsr)
  150. {
  151.               return MPU_Write_Byte(MPU_ACCEL_CFG_REG,fsr<<3);//設(shè)置加速度傳感器滿量程范圍
  152. }
  153. //設(shè)置MPU6050的數(shù)字低通濾波器
  154. //lpf:數(shù)字低通濾波頻率(Hz)
  155. //返回值:0,設(shè)置成功
  156. // 其他,設(shè)置失敗
復(fù)制代碼




    •   本章小結(jié)
本章主要是程序代碼的設(shè)計(jì),根據(jù)硬件設(shè)計(jì)相應(yīng)的程序,完成設(shè)計(jì)要求任務(wù)。分析程序主函數(shù)、LCD函數(shù)、串口函數(shù)。

5     程序載入與調(diào)試



    •   調(diào)試環(huán)境與工具

MDK源自德國(guó)的KEIL公司,是RealView MDK的簡(jiǎn)稱。在全球MDK被超過10萬的嵌入式開發(fā)工程師使用。目前最新版本為:MDK5.14,該版本使用uVision5 IDE 集成開發(fā)環(huán)境,是目前針對(duì)ARM處理器,尤其是Cortex M 內(nèi)核處理器的最佳開發(fā)工具。MDK5 向后兼容MDK4和MDK3等,以前的項(xiàng)目同樣可以在MDK5上進(jìn)行開發(fā)(但是頭文件方面得全部自己添加),MDK5同時(shí)加強(qiáng)了針對(duì) Cortex-M微控制器開發(fā)的支持,并且對(duì)傳統(tǒng)的開發(fā)模式和界面進(jìn)行升級(jí),MDK5由兩個(gè)部分組成:MDK Core 和 Software Packs。其中,Software Packs 可以獨(dú)立于工具鏈進(jìn)行新芯片支持和中間庫的升級(jí)。如圖5.1所示。

圖5.1 MDK架構(gòu)圖

從上圖可以看出,MDK Core又分成四個(gè)部分:uVision IDE with Editor(編輯器),ARM C/C++Compiler(編譯器),Pack Installer(包安裝器),uVision Debugger with Trace(調(diào)試跟蹤器)。



    •   調(diào)試過程及現(xiàn)象分析
      • 硬件連接
主要涉及的硬件有USB TO TTL模塊、MPU6050模塊、STM32F103RCT6最小系統(tǒng)板、TFT液晶顯示器,如圖5.1所示。


圖5.2 系統(tǒng)連接圖


實(shí)物連接圖,如圖5.3所示。

USBTOTTL串口及藍(lán)牙接口說明:
VCC接VCC;
GND接GND;
TXD接RXD;
RXD接TXD;
MPU6050接口說明
VCC接VCC;
GND接GND;
SCL接PC12;
SDA接PC11;
INT和AD0未用到,而XDA和XCL是用來接擴(kuò)展。

5.2.2程序燒錄


燒錄前將核心板與電腦通過仿真器連接起來,把仿真器把仿真器用 USB 線連接電腦,如果仿真器的燈亮則表示正常,可以使用。然后把仿真器的另外一端連接到開發(fā)板,給開發(fā)板上電,然后就可以通過軟件MDK給開發(fā)板下載程序。如圖5.4所示及實(shí)物連接圖如5.5所示。

圖5.4 仿真器與電腦和開發(fā)板連接方式

工程軟件配置如圖5.6所示。


圖5.6 工程配置圖







      • 實(shí)驗(yàn)現(xiàn)象及分析
在代碼編譯成功之后,通過仿真器下載代碼到STM32F103開發(fā)板上,可以看到 LCD顯示如圖5.7所示。

屏幕顯示了MPU6050的溫度、俯仰角(pitch)、橫滾角(roll)和航向角(yaw)的數(shù)值。晃動(dòng)MPU6050傳感器各角度隨之變化。另外,通過按KEY0可以開啟或關(guān)閉數(shù)據(jù)上報(bào),開啟狀態(tài)下,打開電腦端上位機(jī),接收STM32F1上傳的數(shù)據(jù),從而圖形化顯示傳感器數(shù)據(jù)。傳感器數(shù)據(jù)波形顯示如圖5.8所示。

圖5.8 上位機(jī)測(cè)試圖

以上就是波形化顯示我們通過 mpu6050_send_data 函數(shù)發(fā)送的數(shù)據(jù),采用 A1功能幀發(fā)送,總共 6 條線(Series1~6)顯示波形,全部來自 A1 功能幀, int16 數(shù)據(jù)格式,Series1~6 分別代表:加速度傳感器 x/y/z 和角速度傳感器(陀螺儀)x/y/z方向的原始數(shù)據(jù)。圖 35.4.3 則 3D 顯示了我們開發(fā)板的姿態(tài),通過usart1_report_imu函數(shù)發(fā)送的數(shù)據(jù)顯示,采用飛控顯示幀格(AF)式上傳,同時(shí)還顯示了加速度陀螺儀等傳感器的原始數(shù)據(jù)。在界面左側(cè)的“基本功能”選項(xiàng)卡里面設(shè)置好 USB 虛擬串口號(hào)以及波特率(500000),然后在“飛控狀態(tài)”選項(xiàng)卡里面依次在右下方選上“高級(jí)收碼”,“波形顯示”和“打開串口”三個(gè)按鈕即可。最后用USMART讀寫 MPU6050 的任何寄存器,來調(diào)試代碼。用 USMART 調(diào)試的時(shí)候,先按 KEY0 關(guān)閉數(shù)據(jù)上傳功能,否則會(huì)收到很多亂碼,波特率設(shè)置為:500Kbps(設(shè)置方法: XCOM 在關(guān)閉串口狀態(tài)下,選擇自定義波特率,然后輸入:500000,再打開串口)。圖5.9 是數(shù)據(jù)利用上位機(jī)模型化成立后的結(jié)果。

ACC代表加速度值,accx,accy,accz分別代表x,y,z三個(gè)方向上的加速度值。
GYRO代表陀螺儀值,gyrox, gyroy, gyroz分別代表下、x,y,z三個(gè)方向上的陀螺儀值。
6     總結(jié)與展望

課程設(shè)計(jì)總結(jié)

本課程設(shè)計(jì)經(jīng)歷了兩周的努力。課程設(shè)計(jì)主要完成內(nèi)容如下:
(1)本系統(tǒng)所設(shè)計(jì)的角度加速度檢測(cè)裝置完成了對(duì)溫度角度加速度的實(shí)時(shí)檢測(cè),并完成了與上位機(jī)通信的功能,除此之外,還能通過藍(lán)牙與手機(jī)完成數(shù)據(jù)傳輸。
(2)算法方面不夠完善,測(cè)試數(shù)據(jù)有誤差。硬件使用杜邦線連接,易受到外界影響。

工作展望

本次課程設(shè)計(jì)從獲得題目開始便著手準(zhǔn)備,首先查詢相關(guān)傳感器原理,選取幾種傳感器進(jìn)行比較,最后確定MPU6050作為主要傳感器,其次是MCU的選取,考慮到51的局限性最后確定STM32F103RCT6作為核心。通過MDK進(jìn)行程序編寫,下載器選擇了Jlink作為下載工具將程序載入核心板。通過在上位機(jī)上進(jìn)行數(shù)據(jù)調(diào)試。在本次課程設(shè)計(jì)過程中得到了李老師以及許多同學(xué)的幫助,感謝那些提供過幫助的李老師和同學(xué)。
課程設(shè)計(jì)還有很多地方需要改進(jìn),在以后的學(xué)習(xí)生活中去嘗試“九軸傳感器”進(jìn)行更多數(shù)據(jù)的測(cè)試。

  1. void usart1_send_char(u8 c)
  2. {
  3.               while((USART1->SR&0X40)==0);//等待上一次發(fā)送完畢
  4.               USART1->DR=c;
  5. }
  6. //傳送數(shù)據(jù)給匿名四軸上位機(jī)軟件(V2.6版本)
  7. //fun:功能字. 0XA0~0XAF
  8. //data:數(shù)據(jù)緩存區(qū),最多28字節(jié)!!
  9. //len:data區(qū)有效數(shù)據(jù)個(gè)數(shù)
  10. void usart1_niming_report(u8 fun,u8*data,u8 len)
  11. {
  12.               u8 send_buf[32];
  13.               u8 i;
  14.               if(len>28)return;              //最多28字節(jié)數(shù)據(jù)
  15.               send_buf[len+3]=0;              //校驗(yàn)數(shù)置零
  16.               send_buf[0]=0X88;              //幀頭
  17.               send_buf[1]=fun;              //功能字
  18.               send_buf[2]=len;              //數(shù)據(jù)長(zhǎng)度
  19.               for(i=0;i<len;i++)send_buf[3+i]=data[i];                                          //復(fù)制數(shù)據(jù)
  20.               for(i=0;i<len+3;i++)send_buf[len+3]+=send_buf[i];              //計(jì)算校驗(yàn)和            
  21.               for(i=0;i<len+4;i++)usart1_send_char(send_buf[i]);              //發(fā)送數(shù)據(jù)到串口1
  22. }
  23. //發(fā)送加速度傳感器數(shù)據(jù)和陀螺儀數(shù)據(jù)
  24. //aacx,aacy,aacz:x,y,z三個(gè)方向上面的加速度值
  25. //gyrox,gyroy,gyroz:x,y,z三個(gè)方向上面的陀螺儀值
  26. void mpu6050_send_data(short aacx,short aacy,short aacz,short gyrox,short gyroy,short gyroz)
  27. {
  28.               u8 tbuf[12];
  29.               tbuf[0]=(aacx>>8)&0XFF;
  30.               tbuf[1]=aacx&0XFF;
  31.               tbuf[2]=(aacy>>8)&0XFF;
  32.               tbuf[3]=aacy&0XFF;
  33.               tbuf[4]=(aacz>>8)&0XFF;
  34.               tbuf[5]=aacz&0XFF;
  35.               tbuf[6]=(gyrox>>8)&0XFF;
  36.               tbuf[7]=gyrox&0XFF;
  37.               tbuf[8]=(gyroy>>8)&0XFF;
  38.               tbuf[9]=gyroy&0XFF;
  39.               tbuf[10]=(gyroz>>8)&0XFF;
  40.               tbuf[11]=gyroz&0XFF;
  41.               usart1_niming_report(0XA1,tbuf,12);//自定義幀,0XA1
  42. }            
  43. //通過串口1上報(bào)結(jié)算后的姿態(tài)數(shù)據(jù)給電腦
  44. //aacx,aacy,aacz:x,y,z三個(gè)方向上面的加速度值
  45. //gyrox,gyroy,gyroz:x,y,z三個(gè)方向上面的陀螺儀值
  46. //roll:橫滾角.單位0.01度。 -18000 -> 18000 對(duì)應(yīng) -180.00  ->  180.00度
  47. //pitch:俯仰角.單位 0.01度。-9000 - 9000 對(duì)應(yīng) -90.00 -> 90.00 度
  48. //yaw:航向角.單位為0.1度 0 -> 3600  對(duì)應(yīng) 0 -> 360.0度
  49. void usart1_report_imu(short aacx,short aacy,short aacz,short gyrox,short gyroy,short gyroz,short roll,short pitch,short yaw)
  50. {
  51.               u8 tbuf[28];
  52.               u8 i;
  53.               for(i=0;i<28;i++)tbuf[i]=0;//清0
  54.               tbuf[0]=(aacx>>8)&0XFF;
  55.               tbuf[1]=aacx&0XFF;
  56.               tbuf[2]=(aacy>>8)&0XFF;
  57.               tbuf[3]=aacy&0XFF;
  58.               tbuf[4]=(aacz>>8)&0XFF;
  59.               tbuf[5]=aacz&0XFF;
  60.               tbuf[6]=(gyrox>>8)&0XFF;
  61.               tbuf[7]=gyrox&0XFF;
  62.               tbuf[8]=(gyroy>>8)&0XFF;
  63.               tbuf[9]=gyroy&0XFF;
  64.               tbuf[10]=(gyroz>>8)&0XFF;
  65.               tbuf[11]=gyroz&0XFF;            
  66.               tbuf[18]=(roll>>8)&0XFF;
  67.               tbuf[19]=roll&0XFF;
  68.               tbuf[20]=(pitch>>8)&0XFF;
  69.               tbuf[21]=pitch&0XFF;
  70.               tbuf[22]=(yaw>>8)&0XFF;
  71.               tbuf[23]=yaw&0XFF;
  72.               usart1_niming_report(0XAF,tbuf,28);//飛控顯示幀,0XAF
  73. }  


  74. int main(void)
  75. {
  76.               u8 t=0,report=1;                                          //默認(rèn)開啟上報(bào)
  77.               u8 key;
  78.               float pitch,roll,yaw;                             //歐拉角
  79.               short aacx,aacy,aacz;                            //加速度傳感器原始數(shù)據(jù)
  80.               short gyrox,gyroy,gyroz;              //陀螺儀原始數(shù)據(jù)
  81.               short temp;                                                                      //溫度                 
  82.             
  83.               NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
  84.               delay_init();                                //延時(shí)函數(shù)初始化               
  85.               uart_init(500000);                            //串口初始化為9600
  86.               usmart_dev.init(72);                            //初始化USMART
  87.               LED_Init();                                                                        //初始化與LED連接的硬件接口
  88.               KEY_Init();                                                                      //初始化按鍵
  89.               LCD_Init();                                                                         //初始化LCD
  90.               MPU_Init();                                                                      //初始化MPU6050
  91.               POINT_COLOR=RED;                                          //設(shè)置字體為紅色
  92.               LCD_ShowString(30,50,200,16,16,"Wang Kai");            
  93.               LCD_ShowString(30,70,200,16,16,"MPU6050 TEST");            
  94.               LCD_ShowString(30,90,200,16,16,"HPU");
  95.               LCD_ShowString(30,110,200,16,16,"2018/3/12");
  96.               while(mpu_dmp_init())
  97.               {
  98.                             LCD_ShowString(30,130,200,16,16,"MPU6050 Error");
  99.                             delay_ms(200);
  100.                             LCD_Fill(30,130,239,130+16,WHITE);
  101.                             delay_ms(200);
  102.               }
  103.               LCD_ShowString(30,130,200,16,16,"MPU6050 OK");
  104.               LCD_ShowString(30,150,200,16,16,"KEY0:UPLOAD ON/OFF");
  105.               POINT_COLOR=BLUE;//設(shè)置字體為藍(lán)色
  106.               LCD_ShowString(30,170,200,16,16,"UPLOAD ON ");            
  107.               LCD_ShowString(30,200,200,16,16," Temp:    . C");            
  108.               LCD_ShowString(30,220,200,16,16,"Pitch:    . C");            
  109.               LCD_ShowString(30,240,200,16,16," Roll:    . C");            
  110.               LCD_ShowString(30,260,200,16,16," Yaw :    . C");            
  111.               LCD_ShowString(30,280,200,16,16," Durriculum Design ");
  112.               while(1)
  113.               {
  114.                             key=KEY_Scan(0);
  115.                             if(key==KEY0_PRES)
  116.                             {
  117.                             report=!report;
  118.                             if(report)LCD_ShowString(30,170,200,16,16,"UPLOAD ON ");
  119.                             else LCD_ShowString(30,170,200,16,16,"UPLOAD OFF");
  120.                             }
  121.                             if(mpu_dmp_get_data(&pitch,&roll,&yaw)==0)
  122.                             {
  123.                             temp=MPU_Get_Temperature();              //得到溫度值
  124.                             MPU_Get_Accelerometer(&aacx,&aacy,&aacz);              //得到加速度傳感器數(shù)據(jù)
  125.                             MPU_Get_Gyroscope(&gyrox,&gyroy,&gyroz);              //得到陀螺儀數(shù)據(jù)
  126.                             if(report)mpu6050_send_data(aacx,aacy,aacz,gyrox,gyroy,gyroz);//用自定義幀發(fā)送加速度和陀螺儀原始數(shù)據(jù)
  127.               if(report)usart1_report_imu(aacx,aacy,aacz,gyrox,gyroy,gyroz,(int)(roll*100),(int)(pitch*100),(int)(yaw*10));
  128.                                           if((t%10)==0)
  129.                                           {
  130.                                                         if(temp<0)
  131.                                                         {
  132.                                                         LCD_ShowChar(30+48,200,'-',16,0);                            //顯示負(fù)號(hào)
  133.                                                         temp=-temp;                            //轉(zhuǎn)為正數(shù)
  134.                                                         }else LCD_ShowChar(30+48,200,' ',16,0);//去掉負(fù)號(hào)
  135.                                                         LCD_ShowNum(30+48+8,200,temp/100,3,16);//顯示整數(shù)部分
  136.                                                         LCD_ShowNum(30+48+40,200,temp%10,1,16);//顯示小數(shù)部分
  137.                                                         temp=pitch*10;
  138.                                                         if(temp<0)
  139.                                                         {
  140.                                                                       LCD_ShowChar(30+48,220,'-',16,0);                            //顯示負(fù)號(hào)
  141.                                                                       temp=-temp;                            //轉(zhuǎn)為正數(shù)
  142.                                                         }else LCD_ShowChar(30+48,220,' ',16,0);//去掉負(fù)號(hào)
  143.                                                         LCD_ShowNum(30+48+8,220,temp/10,3,16);              //顯示整數(shù)部分
  144.                                                         LCD_ShowNum(30+48+40,220,temp%10,1,16);//顯示小數(shù)部分
  145.                                                         temp=roll*10;
  146.                                                         if(temp<0)
  147.                                                         {
  148.                                                                       LCD_ShowChar(30+48,240,'-',16,0);              //顯示負(fù)號(hào)
  149.                                                                       temp=-temp;                            //轉(zhuǎn)為正數(shù)
  150.                                                         }else LCD_ShowChar(30+48,240,' ',16,0);//去掉負(fù)號(hào)
  151.                                                         LCD_ShowNum(30+48+8,240,temp/10,3,16);              //顯示整數(shù)部分
  152.                                                         LCD_ShowNum(30+48+40,240,temp%10,1,16);//顯示數(shù)部分
  153.                                                         temp=yaw*10;
  154.                                                         if(temp<0)
  155.                                                         {
  156.                                                                       LCD_ShowChar(30+48,260,'-',16,0);              //顯示負(fù)號(hào)
  157.                                                                       temp=-temp;              //轉(zhuǎn)為正數(shù)
  158.                                                         }else LCD_ShowChar(30+48,260,' ',16,0);//去掉負(fù)號(hào)
  159.                                                         LCD_ShowNum(30+48+8,260,temp/10,3,16);//顯示整數(shù)部分
  160.                                                         LCD_ShowNum(30+48+40,260,temp%10,1,16);//顯示小數(shù)部分
  161.                                                         t=0;
  162.                                                         LED0=!LED0;//LED閃爍;
  163.                                           }
  164.                             }
  165.                             t++;
  166.               }              
  167. }
復(fù)制代碼


完整的Word格式文檔51黑下載地址:
傾角加速度檢測(cè).doc (1.3 MB, 下載次數(shù): 35)



評(píng)分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 精品免费国产视频 | 一区二区三区四区不卡 | 国产精品久久久久久久久久免费看 | 午夜爽爽爽男女免费观看影院 | 在线视频亚洲 | 天天色天天色 | 一本色道精品久久一区二区三区 | 黄色在线网站 | 精品无码久久久久久久动漫 | 日本aa毛片a级毛片免费观看 | 国产乱码精品1区2区3区 | 毛片免费观看 | 亚洲精品视频一区 | 毛片一级网站 | 草草草久久久 | 久久久视 | 久久久精品视频一区二区三区 | 亚洲精品一区二区另类图片 | 99久久中文字幕三级久久日本 | 在线成人免费视频 | 亚洲高清av| 亚洲国产精品久久久久婷婷老年 | 欧美一区二区三区在线观看 | 免费v片在线观看 | av天天看| 一级片免费视频 | 免费看片在线播放 | 国产91久久精品一区二区 | 日本小电影在线 | 国产亚洲精品久久久久久牛牛 | 在线看片国产精品 | 九九伦理片 | 国产高清一区二区 | 91精品国产一区二区三区 | 在线看黄免费 | 欧美二区三区 | www网站在线观看 | 成人精品鲁一区一区二区 | 欧美国产日韩一区二区三区 | 一级a爱片性色毛片免费 | 欧美成人精品一区二区男人看 |