該文件是本人課程設計希望對大家有所幫助。
測控技術與儀器專業(yè) 綜合課程設計 基于ARM的加速度和傾角檢測裝置的設計
理工大學機械與動力工程學院 二0一八年三月
2014級測控技術與儀器專業(yè)綜合課程設計 摘要
設計了基于STM32F103RCT6的高精度傾斜角和加速度檢測系統(tǒng),系統(tǒng)硬件包括電源電路、六軸傳感器(MPU6050)、2.8寸 TFT液晶顯示屏、藍牙模塊以及其他輔助電路;軟件上采用MDK5開發(fā)環(huán)境對ARM核心板進行編程、上位機進行數據顯示;該系統(tǒng)可以對傳感器傾斜角及加速度進行檢測、通過手機接收MCU傳感器數據、系統(tǒng)與上位機進行信息交互。程序先初始化 MPU6050 等外設,然后利用DMP庫,初始化 MPU6050 及使能DMP,最后,在死循環(huán)里面不停讀。簻囟葌鞲衅鳌⒓铀俣葌鞲衅、陀螺儀、 DMP 姿態(tài)解算后的歐拉角等數據,通過串口上報給上位機(溫度不上報),利用上位機軟件,可以實時顯示 MPU6050 的傳感器狀態(tài)曲線,實時顯示 3D 姿態(tài)?梢酝ㄟ^ KEY0按鍵開啟/關閉數據上傳功能。同時,在 LCD模塊上面顯示溫度和歐拉角等信息。
2014級測控技術與儀器專業(yè)綜合課程設計
目 錄摘 要 I 1 設計任務書 1.1 涉及專業(yè)課程 (1) 1.2 設計任務 (1) 1.3 設計目標 (1) 1.4 本設計的主要功能 (2) 1.5 本章小結 (2) 2 設計論證及計劃 2.1 課程設計背景及設計意義 (3) 2.2 設計采用軟件及規(guī)劃 (3) 2.3 本章小結 (4) 3 硬件系統(tǒng)設計 3.1 總體方案設計 (5) 3.2 元器件的選型及分析 (5) 3.3 系統(tǒng)模塊功能及接口設計 (13) 3.4 本章小結 (15) 4 軟件系統(tǒng)設計 4.1 軟件系統(tǒng)總體方案設計 (16) 4.2 軟件流程設計 (16) 4.3 程序代碼設計與分析 (17) 4.4 本章小結 (23) 5 程序載入與調試 5.1 調試環(huán)境與工具 (24) 5.2 調試過程及現象分析 (24) 6 總結與展望 6.1 課程設計總結 (30) 6.2 工作展望 (30) 附 錄A 設計程序 (31) 附 錄 B 設計參考資料 (37)
2014級測控技術與儀器專業(yè)綜合課程設計
1 設計任務書本設計主要涉及的專業(yè)課程有: 1、單片機原理及應用 2、信號分析與處理 3、計算機控制技術 4、傳感器技術 5、電子線路CAD 6、數字電子技術 7、復變函數與積分變換 1、基于MEMS集成電路檢測傾斜角度案例:MEMS三軸陀螺儀的傾斜角檢測應用;知識點包括MEMS陀螺儀的檢測原理、檢測電路、常用芯片型號,常見MEMS陀螺儀應用場合及注意事項。 2、基于MEMS集成電路檢測加速度案例:MEMS三軸加速度計的加速度檢測應用;知識點包括MEMS加速度的檢測原理、檢測電路、常用芯片型號,常見MEMS加速度計應用場合及注意事項。 根據設計任務并完成以下目標 - 了解六軸傳感器MPU6050工作原理以及其工作方式。
- 熟練運用ARM完成對傳感器的操作與控制;
- 傳感器數據通過串口通信在上位機上模擬顯示;
- 系統(tǒng)與手機通過藍牙進行數據傳輸;
該系統(tǒng)主要可以完成對傾斜角及加速度的檢測、數據通過藍牙上傳到手機、與上位機進行信息交互、上位機顯示三軸方向加速度、顯示三軸方向傾角、實時顯示MPU6050的傳感器狀態(tài)曲線、數據3D模擬顯示等功能。 結合所學課程和設計任務,制定了相應的工作任務,合理規(guī)劃工作步驟。 2 設計論證及計劃市面上已經出現了眾多以陀螺儀或加速度傳感器為核心的智能設備,本次課程設計以此為課題具有可行性。 現代工業(yè)生產設備的發(fā)展正在朝著向大型化,高速化,連續(xù)化和自動化的方向發(fā)展。其復雜程度日益增加,所涉及的知識范圍廣泛,不但包括機械設計、材料科學,現在又加入了計算機技術、光學、電路技術等,其不但價格昂貴,維護也同樣麻煩。面對如此龐大的機械設備,我們必須需要一些儀器儀表來進行輔助檢查與測試,我們希望這些儀器儀表具有一定的智能,不但要具有實時檢測、自動報警、結果顯示與保存等功能,還要具有體積小、重量輕、便于攜帶等優(yōu)點。然而傳統(tǒng)的機電儀表雖然具備某些優(yōu)點,但其本身也是機、電、光、算的結合物,其使用與維護也相當的復雜,不利于當今機械設備的發(fā)展。 隨著現代網絡技術的發(fā)展和企業(yè)規(guī)模的快速擴大,功能獨立的近距離的傳統(tǒng)儀器測量已不能滿足工業(yè)需求,遠距離且大規(guī)模的測量儀器群將是未來發(fā)展的趨勢。由于傳統(tǒng)的儀器是模擬信號,不利于計算機的控制與運算,將不可能勝任現代企業(yè)管理及技術發(fā)展的需要。 由上分析,我們意識到傳統(tǒng)的測量儀器在成本價格、制作技術、操作簡便性等方面存在著不足,不能滿足社會的需要。而近年來發(fā)展起來的虛擬儀器技術則在成本價格、制作技術、操作簡便性方面有著不俗的表現,能很好的滿足現代科學技術發(fā)展的需要,是儀器儀表未來發(fā)展的的重要方向。 六軸傳感器MPU6050近年來廣泛應用于各個領域,是未來智能設備中不可或缺的重要元件智能型手機、平板裝置設備、手持型游戲產品、游戲機、3D遙控器、可攜式導航設備。 本課程設計是在MDK環(huán)境下完成的,采用C語言進行編程,完全采用面向對象的開發(fā)思想,具有很大的個人發(fā)揮空間,完成同一種功能可以從不同方面下手解決。MDK源自德國的KEIL公司,是RealView MDK的簡稱。在全球MDK被超過10萬的嵌入式開發(fā)工程師使用。目前最新版本為:MDK5.14,該版本為 uVision5 IDE集成開發(fā)環(huán)境,是目前針對ARM處理器,尤其是Cortex M內核處理器的最佳開發(fā)工具。 設計規(guī)劃: 針對此次課程設計,設計如下規(guī)劃,如圖2.1所示。
圖2.1 課程設計規(guī)劃 本章主要對課程設計的背景進行了介紹并對設計進行規(guī)劃,制定出合理的工作流程。 3 硬件系統(tǒng)設計傾角加速度檢測系統(tǒng),主要要完成對溫度、加速度、傾斜角的采集、顯示等工作。傳統(tǒng)上采集加速度利用的是三軸加速度傳感器而采集傾斜角利用的是三軸陀螺儀,針對本次課程設計要求成本相對較高。鑒于上述原因,本系統(tǒng)采用MPU6050六軸陀螺儀作為核心傳感器。外部數據信號經 MPU6050將輸入的模擬信號轉換成數字信號,并通過IO口傳送到單片機系統(tǒng)( STM32RCT6)。單片機系統(tǒng)將接收的數字信號譯碼處理,通過TFTLCD將溫度及各個方向傾角顯示出來,如圖3.1說所示。
圖3.1 設計整體架構(見附件) 3.2.1MCU的選型及分析 STM32F103RCT6是ST公司推出的一款以CortexM3為核心設計的32位單片機,遠超8位51單片機,能出色完成設計任務。STM32的優(yōu)異性體現在以下幾個方面。 1.超低的價格。以8位機的價格,得到32位機,是STM32最大的優(yōu)勢。 2.超多的外設。STM32擁有包括:FSMC、TIMER、SPI、IIC、USB、CAN、IIS、SDIO、ADC、DAC、RTC、DMA等眾多外設及功能,具有極高的集成度。 3.豐富的型號。STM32僅M3內核就擁有F100、F101、F102、F103、F105、F107、F207、F217等8個系列上百種型號,具有QFN、LQFP、BGA等封裝可供選擇。同時STM32還推出了STM32L和STM32W等超低功耗和無線應用型的M3芯片。 4.優(yōu)異的實時性能。84個中斷,16級可編程優(yōu)先級,并且所有的引腳都可以作為中斷輸入。 5.杰出的功耗控制。STM32各個外設都有自己的獨立時鐘開關,可以通過關閉相應外設的時鐘來降低功耗。 6.極低的開發(fā)成本。STM32的開發(fā)不需要昂貴的仿真器,只需要一個串口即可下載代碼,并且支持SWD和JTAG兩種調試口。SWD調試可以為你的設計帶來跟多的方便,只需要2個IO口,即可實現仿真調試。 
STM32F103RCT6原理圖,如圖3.2所示。 圖3.2 MCU原理圖 3.2.2 傳感器的選型及分析 設計要求完成對傾斜角、加速度和溫度的檢測,完成以上要求分別需要3軸陀螺儀、3軸加速度傳感傳感器、溫度傳感器考慮到成本等各方面因素本次課程設計選用具有多種功能的6軸傳感器(MPU6050)來完成對數據的檢測。 MPU6050 是 InvenSense 公司推出的全球首款整合性 6 軸運動處理組件,相較于多組件方案,免除了組合陀螺儀與加速器時之軸間差的問題,減少了安裝空間。MPU6050 內部整合了 3 軸陀螺儀和 3 軸加速度傳感器,并且含有一個第二 IIC 接口,可用于連接外部磁力傳感器,并利用自帶的數字運動處理器(DMP: Digital Motion Processor)硬件加速引擎,通過主 IIC 接口,向應用端輸出完整的 9 軸融合演算數據。有了 DMP,我們可以使用InvenSense 公司提供的運動處理資料庫,非常方便的實現姿態(tài)解算,降低了運動處理運算對操作系統(tǒng)的負荷,同時大大降低了開發(fā)難度。 MPU6050 的特點包括:
① 以數字形式輸出 6 軸或 9 軸(需外接磁傳感器)的旋轉矩陣、四元數(quaternion)、歐拉角格式的融合演算數據(需 DMP 支持)。 ② 具有 131 LSBs/° /sec 敏感度與全格感測范圍為±250、±500、±1000 與±2000° /sec的 3 軸角速度感測器(陀螺儀)。 ③ 集成可程序控制,范圍為±2g、±4g、±8g 和±16g 的 3 軸加速度傳感器。 ④ 移除加速器與陀螺儀軸間敏感度,降低設定給予的影響與感測器的飄移。 ⑤ 自帶數字運動處理(DMP: Digital Motion Processing)引擎可減少 MCU 復雜的融合演算數據、感測器同步化、姿勢感應等的負荷。 ⑥ 運作時間偏差與磁力感測器校正演算技術,免除了須另外進行校正的需求 ⑦ 自帶一個數字溫度傳感器。 ⑧ 帶數字輸入同步引腳(Sync pin)支持視頻電子影像穩(wěn)定技術與GPS。 ⑨ 可程序控制的中斷(interrupt),支持姿勢識別、搖攝、畫面放大縮小、滾動、快速下降中斷、 high-G 中斷、動作感應、觸擊感應、搖動感應功能。 ⑩ VDD 供電電壓為 2.5V±5%、 3.0V±5%、 3.3V±5%; VLOGIC 可低至 1.8V ⑪ 陀螺儀工作電流: 5mA,陀螺儀待機電流: 5uA;加速器工作電流: 500uA,加速器省電模式電流: 40uA@10Hz。 ⑫ 自帶 1024 字節(jié) FIFO,有助于降低系統(tǒng)功耗。 ⑬ 高達 400Khz 的 IIC 通信接口。 ⑭ 超小封裝尺寸: 4x4x0.9mm(QFN)。 
MPU6050傳感器實物圖如3.3所示,其檢測軸如圖3.4所示。
3.3 MPU6050實物圖 圖3.4 MPU605檢測軸方向 
MPU6050的內部框圖如圖3.5所示。
圖3.5 MPU內部框圖 其中SCL和SDA是連接MCU的IIC接口,MCU通過這個IIC接口控MPU6050,另外還有一個IIC接口:AUX_CL和AUX_DA,這個接口可用來連接外部從設備,比如磁傳感器,這樣就可以組成一個9軸傳感器。VLOGIC是IO口電壓,該引腳最低可以到1.8V,我們一般直接接VDD即可。AD0是從IIC接口(接MCU)的地址控制引腳,該引腳控制IIC地址的最低位。如果接GND,則MPU6050的IIC地址是:0X68,如果接VDD,則是0X69。MPU6050外圍電路如圖3.6所示。 圖3.6 MPU6050外圍電路圖 MPU6050工作原理:  
陀螺儀檢測也不是完全精確的,存在一定的誤差。由于陀螺儀測量角度時使用積 圖3.7 積分誤差
分,會存在積分誤差,如圖3.7所示,若積分時間Dt越小,誤差就越小。這十分容易理解,例如計算路程時,假設行車時間為 1 小時,我們隨機選擇行車過程某個時刻的速度Vt乘以1小時,求出的路程誤差是極大的,因為行車的過程中并不是每個時刻都等于該時刻速度的,如果我們每5分鐘檢測一次車速,可得到Vt1、Vt2、Vt3-Vt12這12個時刻的車速,對各個時刻的速度乘以時間間隔(5分鐘),并對這12個結果求和,就可得出一個相對精確的行車路程了,不斷提高采樣頻率,就可以使積分時間Dt變小,降低誤差。 同樣地,提高陀螺儀傳感器的采樣頻率,即可減少積分誤差,目前非常普通的陀螺儀傳感器的采樣頻率都可以達到8KHz,已能滿足大部分應用的精度要求。 更難以解決的是器件本身誤差帶來的問題。例如,某種陀螺儀的誤差是0.1度/秒,當陀螺儀靜止不動時,理想的角速度應為0,無論它靜止多久,對它進行積分測量 得的旋轉角度都是0,這是理想的狀態(tài);而由于存在0.1度/秒的誤差,當陀螺儀靜止不動時,它采樣得的角速度一直為0.1度/秒,若靜止了1分鐘,對它進行積分測量得的旋轉角度為6度,若靜止了1小時,陀螺儀進行積分測量得的旋轉角度就是360度,即轉過了一整圈。只有當正方向誤差和負方向誤差能正好互相抵消的時候,才能消除這種累計誤差。 三軸加速度傳感器檢測原理: 
由于直接用陀螺儀測量角度在長時間測量時會產生累計誤差,引入了檢測傾角的傳感器。測量傾角最常見的例子是建筑中使用的水平儀,在重力的影響下,水平儀內的氣泡能大致反映水柱所在直線與重力方向的夾角關系,利用圖3.8中的T字型水平儀,可以檢測出橫滾角與俯仰角,而偏航角是無法以這樣的方式檢測的。在電子設備中,一般使用加速度傳感器來檢測傾角,它通過檢測器件在各個方向的形變情況而采樣得到受力數據,根據F=ma轉換,傳感器直接輸出加速度數據,因而被稱為加速度傳感器。由于地球存在重力場,所以重力在任何時刻都會作用于傳感器,當傳感器靜止的時候(實際上加速度為0),傳感器會在該方向檢測出加速度g,不能認為重力方向測出的加速度為g,就表示傳感器在該方向作加速度為g的運動。 圖3.8 T字型水平儀 
當傳感器的姿態(tài)不同時,它在自身各個坐標軸檢測到的重力加速度是不一樣利用
各方向的測量結果,根據力的分解原理,可求出各個坐標軸與重力之間的夾角,如圖3.9所示。 圖3.9 重力檢測 因為重力方向是與地理坐標系的“天地”軸固連的,所以通過測量載體坐標系方向軸與重力方向的夾角即可求得它與地理坐標系的角度旋轉關系,從而獲知載體姿態(tài)。 加度度傳感器檢測的誤差: 由于這種傾角檢測方式是利用重力進行檢測的,它無法檢測到偏航角(Yaw),原理跟 T字型水平儀一樣,無論如何設計水平儀,水泡都無法指示這樣的角度。 另一個缺陷是加速度傳感器并不會區(qū)分重力加速度與外力加速度,當物體運動的時候,它也會在運動的方向檢測出加速度,特別在震動的狀態(tài)下,傳感器的數據會有非常大的數據變化,此時難以反應重力的實際值。 利用磁場檢測角度 為了彌補加速度傳感器無法檢測偏航角(Yaw)的問題,我們再引入磁場檢測傳感器,它可以檢測出各個方向上的磁場大小,通過檢測地球磁場,它可實現指南針的功能,所以也被稱為電子羅盤。由于地磁場與地理坐標系的“南北”軸“固聯”,利用磁場檢測傳感器的指南針功能,就可以測量出偏航角(Yaw)了。 磁場檢測器的誤差 與指南針的缺陷一樣,使用磁場傳感器會受到外部磁場干擾,如載體本身的電磁場干擾,不地理同環(huán)境的磁鐵礦干擾等等。 姿態(tài)融合與四元數 可以發(fā)現,使用陀螺儀檢測角度時,在靜止狀態(tài)下存在缺陷,且受時間影響,而加速度傳感器檢測角度時,在運動狀態(tài)下存在缺陷,且不受時間影響,剛好互補。假如我們同時使用這兩種傳感器,并設計一個濾波算法,當物體處于靜止狀態(tài)時,增大加速度數據的權重,當物體處于運動狀時, 增大陀螺儀數據的權重,從而獲得更準確的姿態(tài)數據。同理,檢測偏航角,當載體在靜止狀態(tài)時,可增大磁場檢測器數據的權重,當載體在運動狀態(tài)時,增大陀螺儀和 GPS 檢測數據的權重。這些采用多種傳感器數據來檢測姿態(tài)的處理算法被稱為姿態(tài)融合。 在姿態(tài)融合解算的時候常常使用“四元數”來表示姿態(tài),它由三個實數及一個虛數組成,因而被稱之為四元數。使用四元數表示姿態(tài)并不直觀,但因為使用歐拉角(即前面說的偏航角、橫滾角及俯仰角)表示姿態(tài)的時候會有“萬向節(jié)死鎖”問題,且運算比較復雜,所以一般在數據處理的時候會使用四元數,處理完畢后再把四元數轉換成歐拉角。 該設計采用精英STM32F1開發(fā)板的IIC接口連接MPU6050模塊,本章實驗功能簡介:程序先初始化MPU6050等外設,然后利用DMP庫,初始化MPU6050及使DMP,最后,在死循環(huán)里面不停讀。簻囟葌鞲衅、加速度傳感器、陀螺儀、DMP姿態(tài)解算后的歐拉角等數據,通過串口上報給上位機(溫度不上報),利用上位機軟件,可以實時顯示 MPU6050 的傳感器狀態(tài)曲線,并顯示3D姿態(tài),可以通過KEY0 按鍵開啟/關閉數據上傳功能。同時,在 LCD 模塊上面顯示溫度和歐拉角等信息。DS0來指示程序正在運行。 MPU6050引腳說明 該模塊引出8個引腳功能說明如表3.1所示。 表3.1 MPU6050功能引腳說明  序號 引腳名稱 說明 1  VCC 3.3/5V 電源輸入 2 GND 地線 3 SCL I2C從時鐘信號線SCL(模塊上已接上拉電阻) 4 SDA I2C從數據信號線SDA(模塊上已接上拉電阻) 5 XDA I2C主串行數據信號線,用于外接傳感器 6 XCL I2C主串行數據信號線,用于外接傳感器 7 AD0 從機地址設置引腳:接地或懸空,地址為:0X68 接VCC時,地址為:0X69 8 INT 中斷輸出引腳 其中的SDA/SCL、XDA/XCL通訊引腳分別為兩組I2C信號線。當模塊與外部主機通訊時,使用SDA/SCL,如與STM32芯片通訊;而XDA/XCL則用于MPU6050芯片與其它I2C傳感器通訊時使用,例如使用它與磁場傳感器連接,MPU6050模塊可以把從主機SDA/SCL接收的數據或命令通過XDA/XCL引腳轉發(fā)到磁場傳感器中。但實際上這種功能比較雞肋,控制麻煩且效率低,一般會直接把磁場傳感器之類的I2C傳感器直接與MPU6050掛載在同一條總線上(即都連接到SDA/SCL),使用主機直接控制。 
所要用到的硬件資源主要有STM32開發(fā)板和MPU6050模塊,它們的連接方式如圖3.10所示。MPU6050模塊與外部連接,引出了VCC、GND、IIC_SDA、IIC_SCL、MPU_INT和MPU_AD0等信號。其中,IIC_SDA和IIC_SCL帶了4.7K上拉電阻,外部可以不用再加上拉電阻了,另外MPU_AD0自帶了10K下拉電阻,當AD0 懸空時,默認IIC地址為(0X68)。模塊的IIC_SCL、IIC_SDA分別連接在STM32的PC12、PC11上面。XDA和XCL是用來擴展連接磁力傳感器使MPU6050轉換為“九軸傳感器”。  圖3.10 連接方式圖 本章主要介紹CMU的選型外設,以及各種傳感器測角度的原理及缺陷,MPU6050利用姿態(tài)融合算法彌補傳統(tǒng)傳感器設計缺陷。MPU6050各個接口的功能介紹,單片機與MPU6050連接方式的設計。
4 軟件系統(tǒng)設計系統(tǒng)軟件設計環(huán)境是MDK,軟件設計由主程序模塊、MPU6050程序模塊、串口通訊模塊以及液晶驅動程序模塊組成。 1)初始化IIC接口 MPU6050采用IIC與STM32F1通信,所以我們需要先初始化與MPU6050連接的SDA和SCL數據線。 2)復位MPU6050 這一步讓MPU6050內部所有寄存器恢復默認值,通過對電源管理寄存器1(0X6B)的bit7寫1實現。復位后,電源管理寄存器1恢復默認值(0X40),然后必須設置該寄存器為0X00,以喚醒MPU6050,進入正常工作狀態(tài)。 3)設置角速度傳感器(陀螺儀)和加速度傳感器的滿量程范圍 這一步,設置兩個傳感器的滿量程范圍(FSR),分別通過陀螺儀配置寄存器(0X1B)和加速度傳感器配置寄存器(0X1C)設置。我們一般設置陀螺儀的滿量程范圍為±2000dps,加速度傳感器的滿量程范圍位±2g。 4)設置其他參數 這里,我們還需要配置的參數有:關閉中斷、關閉AUX IIC接口、禁止FIFO、設置陀螺儀采樣率和設置數字低通濾波器(DLPF)等。本章我們不用中斷方式讀取數據,所以關閉中斷,然后也沒用到 AUX IIC 接口外接其他傳感器,所以也關閉這個接口。分別通過中斷使能寄存器(0X38)和用戶控制寄存器(0X6A)控制。MPU6050可以使用FIFO存儲傳感器數據,不過本章我們沒有用到,所以關閉所有FIFO通道,這個通過FIFO使能寄存器(0X23)控制,默認都是0(即禁止 FIFO),所以用默認值就可以了。陀螺儀采樣率通過采樣率分頻寄存器(0X19)控制,這個采樣率我們一般設置為50即可。數字低通濾波器(DLPF)則通過配置寄存器(0X1A)設置,一般設置DLPF為帶寬的1/2即可。 5)配置系統(tǒng)時鐘源并使能角速度傳感器和加速度傳感器 系統(tǒng)時鐘源同樣是通過電源管理寄存器1(0X6B)來設置,該寄存器的最低三位用于設置系統(tǒng)時鐘源選擇,默認值是0(內部8M RC震蕩),不過我們一般設置為1,選擇x軸陀螺PLL作為時鐘源,以獲得更高精度的時鐘。同時,使能角速度傳感器和加速度傳感器,這兩個操作通過電源管理寄存器2(0X6C)來設置,設置對應位為0即可開啟。至此,MPU6050的初始化就完成了,可以正常工作了(其他未設置的寄存器全部采用默認值即可),接下來,我們就可以讀取相關寄存器,得到加速度傳感器、角速度傳感器和溫度傳感器的數據了。 - 以下是main函數中中最主要的部分程序
- 串口發(fā)送程序:
- void usart1_send_char(u8 c)
- {
- while((USART1->SR&0X40)==0);//等待上一次發(fā)送完畢
- USART1->DR=c;
- }
- //傳送數據給上位機軟件(
- void usart1_niming_report(u8 fun,u8*data,u8 len)
- {
- u8 send_buf[32];
- u8 i;
- if(len>28)return; //最多28字節(jié)數據
- send_buf[len+3]=0; //校驗數置零
- send_buf[0]=0X88; //幀頭
- send_buf[1]=fun; //功能字
- send_buf[2]=len; //數據長度
- for(i=0;i<len;i++)send_buf[3+i]=data[i]; //復制數據
- for(i=0;i<len+3;i++)send_buf[len+3]+=send_buf[i]; //計算校驗和
- for(i=0;i<len+4;i++)usart1_send_char(send_buf[i]); //發(fā)送數據到串口1
- }
- //發(fā)送加速度傳感器數據和陀螺儀數據
- //aacx,aacy,aacz:x,y,z三個方向上面的加速度值
- //gyrox,gyroy,gyroz:x,y,z三個方向上面的陀螺儀值
- void mpu6050_send_data(short aacx,short aacy,short aacz,short gyrox,short gyroy,short gyroz)
- 通過串口上報結算后的姿態(tài)數據給電腦:
- //aacx,aacy,aacz:x,y,z三個方向上面的加速度值
- //gyrox,gyroy,gyroz:x,y,z三個方向上面的陀螺儀值
- //roll:橫滾角.單位0.01度。 -18000 - 18000 對應 -180.00 - 180.00度
- //pitch:俯仰角.單位 0.01度。-9000 - 9000 對應 -90.00 - 90.00 度
- //yaw:航向角.單位為0.1度 0 – 360。0度 對應 0 -> 360.0度
- void usart1_report_imu(short aacx,short aacy,short aacz,short gyrox,short gyroy,short gyroz,short roll,short pitch,short yaw)
- LCD初始化:
- int main(void)
- {
- u8 t=0,report=1; //默認開啟上報
- u8 key;
- float pitch,roll,yaw; //歐拉角
- short aacx,aacy,aacz; //加速度傳感器原始數據
- short gyrox,gyroy,gyroz; //陀螺儀原始數據
- short temp; //溫度
- NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
- delay_init(); //延時函數初始化
- uart_init(500000); //串口初始化為9600
- usmart_dev.init(72); //初始化USMART
- LED_Init(); //初始化與LED連接的硬件接口
- KEY_Init(); //初始化按鍵
- LCD_Init(); //初始化LCD
- MPU_Init(); //初始化MPU6050
- POINT_COLOR=RED; //設置字體為紅色
- 顯示屏顯示數據:
- LCD_ShowString(30,50,200,16,16,"Wang Kai");
- LCD_ShowString(30,70,200,16,16,"MPU6050 TEST");
- LCD_ShowString(30,90,200,16,16,"HPU");
- LCD_ShowString(30,110,200,16,16,"2018/3/12");
- while(mpu_dmp_init())
- {
- LCD_ShowString(30,130,200,16,16,"MPU6050 Error");
- delay_ms(200);
- LCD_Fill(30,130,239,130+16,WHITE);
- delay_ms(200);
- }
- LCD_ShowString(30,130,200,16,16,"MPU6050 OK");
- LCD_ShowString(30,150,200,16,16,"KEY0:UPLOAD ON/OFF");
- POINT_COLOR=BLUE;//設置字體為藍色
- LCD_ShowString(30,170,200,16,16,"UPLOAD ON ");
- LCD_ShowString(30,200,200,16,16," Temp: . C");
- LCD_ShowString(30,220,200,16,16,"Pitch: . C");
- LCD_ShowString(30,240,200,16,16," Roll: . C");
- LCD_ShowString(30,260,200,16,16," Yaw : . C");
- LCD_ShowString(30,280,200,16,16," Durriculum Design ");
- if(mpu_dmp_get_data(&pitch,&roll,&yaw)==0)
- {
- temp=MPU_Get_Temperature(); //得到溫度值
- MPU_Get_Accelerometer(&aacx,&aacy,&aacz); //得到加速度傳感器數據
- MPU_Get_Gyroscope(&gyrox,&gyroy,&gyroz); //得到陀螺儀數據
- if(report)mpu6050_send_data(aacx,aacy,aacz,gyrox,gyroy,gyroz);//用自定義幀發(fā)送加速度和陀螺儀原始數據
- 原始數據處理: if(report)usart1_report_imu(aacx,aacy,aacz,gyrox,gyroy,gyroz,(int)(roll*100),(int)(pitch*100),(int)(yaw*10));
- if((t%10)==0)
- {
- if(temp<0)
- {
- LCD_ShowChar(30+48,200,'-',16,0); //顯示負號
- temp=-temp; //轉為正數
- }else LCD_ShowChar(30+48,200,' ',16,0);//去掉負號
- LCD_ShowNum(30+48+8,200,temp/100,3,16);//顯示整數部分 LCD_ShowNum(30+48+40,200,temp%10,1,16);//顯示小數部分 temp=pitch*10;
- if(temp<0)
- {
- LCD_ShowChar(30+48,220,'-',16,0); //顯示負號
- temp=-temp; //轉為正數
- }else LCD_ShowChar(30+48,220,' ',16,0);//去掉負號
- LCD_ShowNum(30+48+8,220,temp/10,3,16); //顯示整數部分 LCD_ShowNum(30+48+40,220,temp%10,1,16); //顯示小數部分
- temp=roll*10;
- if(temp<0)
- {
- LCD_ShowChar(30+48,240,'-',16,0); //顯示負號
- temp=-temp; //轉為正數
- }else LCD_ShowChar(30+48,240,' ',16,0);//去掉負號
- LCD_ShowNum(30+48+8,240,temp/10,3,16); //顯示整數部分
- LCD_ShowNum(30+48+40,240,temp%10,1,16);//顯示小數部分
- temp=yaw*10;
- if(temp<0)
- {
- LCD_ShowChar(30+48,260,'-',16,0); //顯示負號
- temp=-temp; //轉為正數
- }else LCD_ShowChar(30+48,260,' ',16,0);//去掉負號
- LCD_ShowNum(30+48+40,260,temp%10,1,16);//顯示小數部分
- t=0;
- LED0=!LED0;//LED閃爍
- }
- }
-
- 4.3.2 MPU6050程序分析
- MPU6050程序初始化:
- u8 MPU_Init(void)
- {
- u8 res;
- MPU_IIC_Init();//初始化IIC總線
- MPU_Write_Byte(MPU_PWR_MGMT1_REG,0X80); //復位MPU6050
- delay_ms(100);
- MPU_Write_Byte(MPU_PWR_MGMT1_REG,0X00); //喚醒MPU6050
- MPU_Set_Gyro_Fsr(3); //陀螺儀傳感器,±2000dps
- MPU_Set_Accel_Fsr(0); //加速度傳感器,±2g
- MPU_Set_Rate(50); //設置采樣率50Hz
- MPU_Write_Byte(MPU_INT_EN_REG,0X00); //關閉所有中斷
- MPU_Write_Byte(MPU_USER_CTRL_REG,0X00);//I2C主模式關閉
- MPU_Write_Byte(MPU_FIFO_EN_REG,0X00); //關閉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);//設置CLKSEL,PLL X軸為參考
- MPU_Write_Byte(MPU_PWR_MGMT2_REG,0X00);//加速度與陀螺儀都工作
- MPU_Set_Rate(50); //設置采樣率為50Hz
- }else return 1;
- return 0;
- }
- //設置MPU6050陀螺儀傳感器滿量程范圍
- //fsr:0,±250dps;1,±500dps;2,±1000dps;3,±2000dps
- //返回值:0,設置成功
- // 其他,設置失敗
- u8 MPU_Set_Gyro_Fsr(u8 fsr)
- {
- return MPU_Write_Byte(MPU_GYRO_CFG_REG,fsr<<3);//設置陀螺儀滿量程范圍
- }
- 設置MPU6050加速度傳感器滿量程范圍
- //fsr:0,±2g;1,±4g;2,±8g;3,±16g
- //返回值:0,設置成功
- // 其他,設置失敗
- u8 MPU_Set_Accel_Fsr(u8 fsr)
- {
- return MPU_Write_Byte(MPU_ACCEL_CFG_REG,fsr<<3);//設置加速度傳感器滿量程范圍
- }
- //設置MPU6050的數字低通濾波器
- //lpf:數字低通濾波頻率(Hz)
- //返回值:0,設置成功
- // 其他,設置失敗
復制代碼
本章主要是程序代碼的設計,根據硬件設計相應的程序,完成設計要求任務。分析程序主函數、LCD函數、串口函數。
5 程序載入與調試
MDK源自德國的KEIL公司,是RealView MDK的簡稱。在全球MDK被超過10萬的嵌入式開發(fā)工程師使用。目前最新版本為:MDK5.14,該版本使用uVision5 IDE 集成開發(fā)環(huán)境,是目前針對ARM處理器,尤其是Cortex M 內核處理器的最佳開發(fā)工具。MDK5 向后兼容MDK4和MDK3等,以前的項目同樣可以在MDK5上進行開發(fā)(但是頭文件方面得全部自己添加),MDK5同時加強了針對 Cortex-M微控制器開發(fā)的支持,并且對傳統(tǒng)的開發(fā)模式和界面進行升級,MDK5由兩個部分組成:MDK Core 和 Software Packs。其中,Software Packs 可以獨立于工具鏈進行新芯片支持和中間庫的升級。如圖5.1所示。圖5.1 MDK架構圖 從上圖可以看出,MDK Core又分成四個部分:uVision IDE with Editor(編輯器),ARM C/C++Compiler(編譯器),Pack Installer(包安裝器),uVision Debugger with Trace(調試跟蹤器)。 主要涉及的硬件有USB TO TTL模塊、MPU6050模塊、STM32F103RCT6最小系統(tǒng)板、TFT液晶顯示器,如圖5.1所示。
圖5.2 系統(tǒng)連接圖 
實物連接圖,如圖5.3所示。
USBTOTTL串口及藍牙接口說明: VCC接VCC; GND接GND; TXD接RXD; RXD接TXD; MPU6050接口說明: VCC接VCC; GND接GND; SCL接PC12; SDA接PC11; INT和AD0未用到,而XDA和XCL是用來接擴展。 5.2.2程序燒錄 
燒錄前將核心板與電腦通過仿真器連接起來,把仿真器把仿真器用 USB 線連接電腦,如果仿真器的燈亮則表示正常,可以使用。然后把仿真器的另外一端連接到開發(fā)板,給開發(fā)板上電,然后就可以通過軟件MDK給開發(fā)板下載程序。如圖5.4所示及實物連接圖如5.5所示。 圖5.4 仿真器與電腦和開發(fā)板連接方式 工程軟件配置如圖5.6所示。

圖5.6 工程配置圖
在代碼編譯成功之后,通過仿真器下載代碼到STM32F103開發(fā)板上,可以看到 LCD顯示如圖5.7所示。  
屏幕顯示了MPU6050的溫度、俯仰角(pitch)、橫滾角(roll)和航向角(yaw)的數值;蝿覯PU6050傳感器各角度隨之變化。另外,通過按KEY0可以開啟或關閉數據上報,開啟狀態(tài)下,打開電腦端上位機,接收STM32F1上傳的數據,從而圖形化顯示傳感器數據。傳感器數據波形顯示如圖5.8所示。 
圖5.8 上位機測試圖 以上就是波形化顯示我們通過 mpu6050_send_data 函數發(fā)送的數據,采用 A1功能幀發(fā)送,總共 6 條線(Series1~6)顯示波形,全部來自 A1 功能幀, int16 數據格式,Series1~6 分別代表:加速度傳感器 x/y/z 和角速度傳感器(陀螺儀)x/y/z方向的原始數據。圖 35.4.3 則 3D 顯示了我們開發(fā)板的姿態(tài),通過usart1_report_imu函數發(fā)送的數據顯示,采用飛控顯示幀格(AF)式上傳,同時還顯示了加速度陀螺儀等傳感器的原始數據。在界面左側的“基本功能”選項卡里面設置好 USB 虛擬串口號以及波特率(500000),然后在“飛控狀態(tài)”選項卡里面依次在右下方選上“高級收碼”,“波形顯示”和“打開串口”三個按鈕即可。最后用USMART讀寫 MPU6050 的任何寄存器,來調試代碼。用 USMART 調試的時候,先按 KEY0 關閉數據上傳功能,否則會收到很多亂碼,波特率設置為:500Kbps(設置方法: XCOM 在關閉串口狀態(tài)下,選擇自定義波特率,然后輸入:500000,再打開串口)。圖5.9 是數據利用上位機模型化成立后的結果。 ACC代表加速度值,accx,accy,accz分別代表x,y,z三個方向上的加速度值。 GYRO代表陀螺儀值,gyrox, gyroy, gyroz分別代表下、x,y,z三個方向上的陀螺儀值。 6 總結與展望課程設計總結 本課程設計經歷了兩周的努力。課程設計主要完成內容如下: (1)本系統(tǒng)所設計的角度加速度檢測裝置完成了對溫度角度加速度的實時檢測,并完成了與上位機通信的功能,除此之外,還能通過藍牙與手機完成數據傳輸。 (2)算法方面不夠完善,測試數據有誤差。硬件使用杜邦線連接,易受到外界影響。 工作展望 本次課程設計從獲得題目開始便著手準備,首先查詢相關傳感器原理,選取幾種傳感器進行比較,最后確定MPU6050作為主要傳感器,其次是MCU的選取,考慮到51的局限性最后確定STM32F103RCT6作為核心。通過MDK進行程序編寫,下載器選擇了Jlink作為下載工具將程序載入核心板。通過在上位機上進行數據調試。在本次課程設計過程中得到了李老師以及許多同學的幫助,感謝那些提供過幫助的李老師和同學。 課程設計還有很多地方需要改進,在以后的學習生活中去嘗試“九軸傳感器”進行更多數據的測試。
- void usart1_send_char(u8 c)
- {
- while((USART1->SR&0X40)==0);//等待上一次發(fā)送完畢
- USART1->DR=c;
- }
- //傳送數據給匿名四軸上位機軟件(V2.6版本)
- //fun:功能字. 0XA0~0XAF
- //data:數據緩存區(qū),最多28字節(jié)!!
- //len:data區(qū)有效數據個數
- void usart1_niming_report(u8 fun,u8*data,u8 len)
- {
- u8 send_buf[32];
- u8 i;
- if(len>28)return; //最多28字節(jié)數據
- send_buf[len+3]=0; //校驗數置零
- send_buf[0]=0X88; //幀頭
- send_buf[1]=fun; //功能字
- send_buf[2]=len; //數據長度
- for(i=0;i<len;i++)send_buf[3+i]=data[i]; //復制數據
- for(i=0;i<len+3;i++)send_buf[len+3]+=send_buf[i]; //計算校驗和
- for(i=0;i<len+4;i++)usart1_send_char(send_buf[i]); //發(fā)送數據到串口1
- }
- //發(fā)送加速度傳感器數據和陀螺儀數據
- //aacx,aacy,aacz:x,y,z三個方向上面的加速度值
- //gyrox,gyroy,gyroz:x,y,z三個方向上面的陀螺儀值
- void mpu6050_send_data(short aacx,short aacy,short aacz,short gyrox,short gyroy,short gyroz)
- {
- u8 tbuf[12];
- tbuf[0]=(aacx>>8)&0XFF;
- tbuf[1]=aacx&0XFF;
- tbuf[2]=(aacy>>8)&0XFF;
- tbuf[3]=aacy&0XFF;
- tbuf[4]=(aacz>>8)&0XFF;
- tbuf[5]=aacz&0XFF;
- tbuf[6]=(gyrox>>8)&0XFF;
- tbuf[7]=gyrox&0XFF;
- tbuf[8]=(gyroy>>8)&0XFF;
- tbuf[9]=gyroy&0XFF;
- tbuf[10]=(gyroz>>8)&0XFF;
- tbuf[11]=gyroz&0XFF;
- usart1_niming_report(0XA1,tbuf,12);//自定義幀,0XA1
- }
- //通過串口1上報結算后的姿態(tài)數據給電腦
- //aacx,aacy,aacz:x,y,z三個方向上面的加速度值
- //gyrox,gyroy,gyroz:x,y,z三個方向上面的陀螺儀值
- //roll:橫滾角.單位0.01度。 -18000 -> 18000 對應 -180.00 -> 180.00度
- //pitch:俯仰角.單位 0.01度。-9000 - 9000 對應 -90.00 -> 90.00 度
- //yaw:航向角.單位為0.1度 0 -> 3600 對應 0 -> 360.0度
- void usart1_report_imu(short aacx,short aacy,short aacz,short gyrox,short gyroy,short gyroz,short roll,short pitch,short yaw)
- {
- u8 tbuf[28];
- u8 i;
- for(i=0;i<28;i++)tbuf[i]=0;//清0
- tbuf[0]=(aacx>>8)&0XFF;
- tbuf[1]=aacx&0XFF;
- tbuf[2]=(aacy>>8)&0XFF;
- tbuf[3]=aacy&0XFF;
- tbuf[4]=(aacz>>8)&0XFF;
- tbuf[5]=aacz&0XFF;
- tbuf[6]=(gyrox>>8)&0XFF;
- tbuf[7]=gyrox&0XFF;
- tbuf[8]=(gyroy>>8)&0XFF;
- tbuf[9]=gyroy&0XFF;
- tbuf[10]=(gyroz>>8)&0XFF;
- tbuf[11]=gyroz&0XFF;
- tbuf[18]=(roll>>8)&0XFF;
- tbuf[19]=roll&0XFF;
- tbuf[20]=(pitch>>8)&0XFF;
- tbuf[21]=pitch&0XFF;
- tbuf[22]=(yaw>>8)&0XFF;
- tbuf[23]=yaw&0XFF;
- usart1_niming_report(0XAF,tbuf,28);//飛控顯示幀,0XAF
- }
-
-
- int main(void)
- {
- u8 t=0,report=1; //默認開啟上報
- u8 key;
- float pitch,roll,yaw; //歐拉角
- short aacx,aacy,aacz; //加速度傳感器原始數據
- short gyrox,gyroy,gyroz; //陀螺儀原始數據
- short temp; //溫度
-
- NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
- delay_init(); //延時函數初始化
- uart_init(500000); //串口初始化為9600
- usmart_dev.init(72); //初始化USMART
- LED_Init(); //初始化與LED連接的硬件接口
- KEY_Init(); //初始化按鍵
- LCD_Init(); //初始化LCD
- MPU_Init(); //初始化MPU6050
- POINT_COLOR=RED; //設置字體為紅色
- LCD_ShowString(30,50,200,16,16,"Wang Kai");
- LCD_ShowString(30,70,200,16,16,"MPU6050 TEST");
- LCD_ShowString(30,90,200,16,16,"HPU");
- LCD_ShowString(30,110,200,16,16,"2018/3/12");
- while(mpu_dmp_init())
- {
- LCD_ShowString(30,130,200,16,16,"MPU6050 Error");
- delay_ms(200);
- LCD_Fill(30,130,239,130+16,WHITE);
- delay_ms(200);
- }
- LCD_ShowString(30,130,200,16,16,"MPU6050 OK");
- LCD_ShowString(30,150,200,16,16,"KEY0:UPLOAD ON/OFF");
- POINT_COLOR=BLUE;//設置字體為藍色
- LCD_ShowString(30,170,200,16,16,"UPLOAD ON ");
- LCD_ShowString(30,200,200,16,16," Temp: . C");
- LCD_ShowString(30,220,200,16,16,"Pitch: . C");
- LCD_ShowString(30,240,200,16,16," Roll: . C");
- LCD_ShowString(30,260,200,16,16," Yaw : . C");
- LCD_ShowString(30,280,200,16,16," Durriculum Design ");
- while(1)
- {
- key=KEY_Scan(0);
- if(key==KEY0_PRES)
- {
- report=!report;
- if(report)LCD_ShowString(30,170,200,16,16,"UPLOAD ON ");
- else LCD_ShowString(30,170,200,16,16,"UPLOAD OFF");
- }
- if(mpu_dmp_get_data(&pitch,&roll,&yaw)==0)
- {
- temp=MPU_Get_Temperature(); //得到溫度值
- MPU_Get_Accelerometer(&aacx,&aacy,&aacz); //得到加速度傳感器數據
- MPU_Get_Gyroscope(&gyrox,&gyroy,&gyroz); //得到陀螺儀數據
- if(report)mpu6050_send_data(aacx,aacy,aacz,gyrox,gyroy,gyroz);//用自定義幀發(fā)送加速度和陀螺儀原始數據
- if(report)usart1_report_imu(aacx,aacy,aacz,gyrox,gyroy,gyroz,(int)(roll*100),(int)(pitch*100),(int)(yaw*10));
- if((t%10)==0)
- {
- if(temp<0)
- {
- LCD_ShowChar(30+48,200,'-',16,0); //顯示負號
- temp=-temp; //轉為正數
- }else LCD_ShowChar(30+48,200,' ',16,0);//去掉負號
- LCD_ShowNum(30+48+8,200,temp/100,3,16);//顯示整數部分
- LCD_ShowNum(30+48+40,200,temp%10,1,16);//顯示小數部分
- temp=pitch*10;
- if(temp<0)
- {
- LCD_ShowChar(30+48,220,'-',16,0); //顯示負號
- temp=-temp; //轉為正數
- }else LCD_ShowChar(30+48,220,' ',16,0);//去掉負號
- LCD_ShowNum(30+48+8,220,temp/10,3,16); //顯示整數部分
- LCD_ShowNum(30+48+40,220,temp%10,1,16);//顯示小數部分
- temp=roll*10;
- if(temp<0)
- {
- LCD_ShowChar(30+48,240,'-',16,0); //顯示負號
- temp=-temp; //轉為正數
- }else LCD_ShowChar(30+48,240,' ',16,0);//去掉負號
- LCD_ShowNum(30+48+8,240,temp/10,3,16); //顯示整數部分
- LCD_ShowNum(30+48+40,240,temp%10,1,16);//顯示數部分
- temp=yaw*10;
- if(temp<0)
- {
- LCD_ShowChar(30+48,260,'-',16,0); //顯示負號
- temp=-temp; //轉為正數
- }else LCD_ShowChar(30+48,260,' ',16,0);//去掉負號
- LCD_ShowNum(30+48+8,260,temp/10,3,16);//顯示整數部分
- LCD_ShowNum(30+48+40,260,temp%10,1,16);//顯示小數部分
- t=0;
- LED0=!LED0;//LED閃爍;
- }
- }
- t++;
- }
- }
復制代碼
完整的Word格式文檔51黑下載地址:
傾角加速度檢測.doc
(1.3 MB, 下載次數: 35)
2018-3-19 19:51 上傳
點擊文件名下載附件
|