天天看點

STM32複習筆記(十六)MPU6050六軸傳感器一、什麼是MPU6050?:二、MPU6050的特點:三、MPU6050框圖:四、MPU6050初始化:五、寄存器介紹:六、DMP的使用:七、重要函數:

聲明:本篇文章隻是個人知識盲區、知識弱點、重點部分的歸納總結,望各位大佬不喜勿噴。梳理順序是按照正點原子的視訊和文檔的實際順序梳理,轉載請注明出處。

作者:sumjess

适用:這個視訊我已經看過3遍了,總會有忘記的,是以來寫這本書的随手筆記,記錄重點、易忘點。該部落格可以當做字典,也可以當做筆記。

目前内容:MPU6050六軸傳感器

一、什麼是MPU6050?:

       MPU6050是InvenSense公司推出的全球首款整合性6軸運動處理元件,内帶3軸陀螺儀和3軸加速度傳感器,并且含有一個第二IIC接口,可用于連接配接外部磁力傳感器,利用自帶數字運動處理器(DMP: Digital Motion Processor)硬體加速引擎,通過主IIC接口,可以向應用端輸出完整的9軸姿态融合演算資料。

       有了DMP,我們可以使用InvenSense公司提供的運動處理資料庫,非常友善的實作姿态解算,降低了運動處理運算對作業系統的負荷,同時大大降低了開發難度 。

二、MPU6050的特點:

①自帶數字運動處理( DMP: Digital Motion Processing ),可以輸出6軸或9軸(需外接磁傳感器)姿态解算資料。

②內建可程式控制,測量範圍為±250、±500、±1000與±2000°/sec 的3軸角速度感測器(陀螺儀)

③內建可程式控制,範圍為±2g、±4g、±8g和±16g的3軸加速度傳感器  

④自帶數字溫度傳感器

⑤可輸出中斷(interrupt),支援姿勢識别、搖攝、畫面放大縮小、滾動、快速下降中斷、high-G中斷、零動作感應、觸擊感應、搖動感應功能 

⑥自帶1024位元組FIFO,有助于降低系統功耗

⑦高達400Khz的IIC通信接口

⑧超小封裝尺寸:4x4x0.9mm(QFN)

三、MPU6050框圖:

STM32複習筆記(十六)MPU6050六軸傳感器一、什麼是MPU6050?:二、MPU6050的特點:三、MPU6050框圖:四、MPU6050初始化:五、寄存器介紹:六、DMP的使用:七、重要函數:

四、MPU6050初始化:

①初始化IIC接口。

②複位MPU6050。由電源管理寄存器1(0X6B)控制。

③設定角速度傳感器和加速度傳感器的滿量程範圍。由陀螺儀配置寄存器(0X1B)和加速度傳感器配置寄存器(0X1C)設定 。

④設定其他參數。配置中斷,由中斷使能寄存器(0X38)控制;設定AUX IIC接口,由戶控制寄存器(0X6A)控制;設定FIFO,由FIFO使能寄存器(0X23)控制;陀螺儀采樣率 ,由采樣率分頻寄存器(0X19)控制;設定數字低通濾波器,由配置寄存器(0X1A)控制。

⑤設定系統時鐘。由電源管理寄存器1(0X6B)控制。一般選擇x軸陀螺PLL作為時鐘源,以獲得更高精度的時鐘。

⑥使能角速度傳感器(陀螺儀)和加速度傳感器。由電源管理寄存器2(0X6C)控制

初始化完成,即可讀取陀螺儀、加速度傳感器和溫度傳感器的資料了!!

五、寄存器介紹:

(1)電源管理寄存器1(0X6B):

STM32複習筆記(十六)MPU6050六軸傳感器一、什麼是MPU6050?:二、MPU6050的特點:三、MPU6050框圖:四、MPU6050初始化:五、寄存器介紹:六、DMP的使用:七、重要函數:
STM32複習筆記(十六)MPU6050六軸傳感器一、什麼是MPU6050?:二、MPU6050的特點:三、MPU6050框圖:四、MPU6050初始化:五、寄存器介紹:六、DMP的使用:七、重要函數:

(2)陀螺儀配置寄存器(0X1B):

STM32複習筆記(十六)MPU6050六軸傳感器一、什麼是MPU6050?:二、MPU6050的特點:三、MPU6050框圖:四、MPU6050初始化:五、寄存器介紹:六、DMP的使用:七、重要函數:

該寄存器我們隻關心FS_SEL[1:0]這兩個位,用于設定陀螺儀的滿量程範圍:0,±250°/S;1,±500°/S;2,±1000°/S;3,±2000°/S;我們一般設定為3,即±2000°/S,因為陀螺儀的ADC為16位分辨率,是以得到靈敏度為:65536/4000=16.4LSB/(°/S)。

(3)加速度傳感器配置寄存器(0X1C):

STM32複習筆記(十六)MPU6050六軸傳感器一、什麼是MPU6050?:二、MPU6050的特點:三、MPU6050框圖:四、MPU6050初始化:五、寄存器介紹:六、DMP的使用:七、重要函數:

    該寄存器我們隻關心AFS_SEL[1:0]這兩個位,用于設定加速度傳感器的滿量程範圍:0,±2g;1,±4g;2,±8g;3,±16g;我們一般設定為0,即±2g,因為加速度傳感器的ADC也是16位,是以得到靈敏度為:65536/4=16384LSB/g。

(4)FIFO使能寄存器(0X23):

STM32複習筆記(十六)MPU6050六軸傳感器一、什麼是MPU6050?:二、MPU6050的特點:三、MPU6050框圖:四、MPU6050初始化:五、寄存器介紹:六、DMP的使用:七、重要函數:

    該寄存器用于控制FIFO使能,在簡單讀取傳感器資料的時候,可以不用FIFO,設定對應位為:0,即可禁止FIFO,設定為1,則使能FIFO。

    注意:加速度傳感器的3個軸,全由1個位(ACCEL_FIFO_EN)控制,隻要該位置1,則加速度傳感器的三個通道都開啟FIFO了

(5)陀螺儀采樣率分頻寄存器(0X19):

STM32複習筆記(十六)MPU6050六軸傳感器一、什麼是MPU6050?:二、MPU6050的特點:三、MPU6050框圖:四、MPU6050初始化:五、寄存器介紹:六、DMP的使用:七、重要函數:

    該寄存器用于設定MPU6050的陀螺儀采樣頻率,計算公式為:

采樣頻率 = 陀螺儀輸出頻率 / (1+SMPLRT_DIV)

    這裡陀螺儀的輸出頻率,是1Khz或者8Khz,與數字低通濾波器(DLPF)的設定有關,當DLPF_CFG=0/7的時候,頻率為8Khz,其他情況是1Khz。而且DLPF濾波頻率一般設定為采樣率的一半。采樣率,我們假定設定為50Hz,那麼:SMPLRT_DIV=1000/50-1=19。

(6)配置寄存器(0X1A):

STM32複習筆記(十六)MPU6050六軸傳感器一、什麼是MPU6050?:二、MPU6050的特點:三、MPU6050框圖:四、MPU6050初始化:五、寄存器介紹:六、DMP的使用:七、重要函數:

(7)電源管理寄存器2(0X6C):

STM32複習筆記(十六)MPU6050六軸傳感器一、什麼是MPU6050?:二、MPU6050的特點:三、MPU6050框圖:四、MPU6050初始化:五、寄存器介紹:六、DMP的使用:七、重要函數:

    該寄存器的LP_WAKE_CTRL用于控制低功耗時的喚醒頻率,本例程用不到。剩下的6位,分别控制加速度和陀螺儀的x/y/z軸是否進入待機模式,這裡我們全部都不進入待機模式,是以全部設定為:0 ,即可。

(8)加速度傳感器資料輸出寄存器(0X3B~0X40):

STM32複習筆記(十六)MPU6050六軸傳感器一、什麼是MPU6050?:二、MPU6050的特點:三、MPU6050框圖:四、MPU6050初始化:五、寄存器介紹:六、DMP的使用:七、重要函數:

       加速度傳感器資料輸出寄存器總共由6個寄存器組成,輸出X/Y/Z三個軸的加速度傳感器值,高位元組在前,低位元組在後。

(9)陀螺儀資料輸出寄存器(0X43~0X48):

STM32複習筆記(十六)MPU6050六軸傳感器一、什麼是MPU6050?:二、MPU6050的特點:三、MPU6050框圖:四、MPU6050初始化:五、寄存器介紹:六、DMP的使用:七、重要函數:

       陀螺儀資料輸出寄存器總共由6個寄存器組成,輸出X/Y/Z三個軸的陀螺儀傳感器資料,高位元組在前,低位元組在後。

(10)溫度傳感器資料輸出寄存器(0X41~0X42):

STM32複習筆記(十六)MPU6050六軸傳感器一、什麼是MPU6050?:二、MPU6050的特點:三、MPU6050框圖:四、MPU6050初始化:五、寄存器介紹:六、DMP的使用:七、重要函數:

    通過讀取0X41(高8位)和0X42(低8位)寄存器得到,溫度換算公式為:

Temperature = 36.53 + regval/340

    其中,Temperature為計算得到的溫度值,機關為℃,regval為從0X41和0X42讀到的溫度傳感器值。

六、DMP的使用:

    通過前面的學習,我們可以正常讀取MPU6050的加速度傳感器、陀螺儀和溫度傳感器的資料,但是實際使用的時候(比如做四軸),我們更希望得到姿态資料,即歐拉角:航向角(yaw)、橫滾角(roll)和俯仰角(pitch)。

要得到歐拉角資料,就得利用我們的原始資料,進行姿态融合解算,這個比較複雜,知識點比較多,初學者不易掌握。而MPU6050自帶了數字運動處理器,即DMP,并且,InvenSense提供了一個MPU6050的嵌入式運動驅動庫,結合MPU6050的DMP,可以将我們的原始資料,直接轉換成四元數輸出,而得到四元數之後,就可以很友善的計算出歐拉角,進而得到yaw、roll和pitch。

    使用内置的DMP,可以大大簡化代碼設計,MCU不用進行姿态解算過程,大大降低了MCU的負擔,進而有更多的時間去處理其他事件,提高系統實時性。

    InvenSense提供的MPU6050運動驅動庫是基于MSP430的,我們需要将其移植一下,才可以用到STM32上面。官方原版驅動在CD光牒à增值資料àALIENTEK 産品資料àATK-MPU6050六軸傳感器子產品àMPU6050參考資料àDMP資料:

        Embedded_MotionDriver_5.1.rar

        Embedded Motion Driver V5.1.1 API 說明.pdf

        Embedded Motion Driver V5.1.1 教程.pdf

STM32複習筆記(十六)MPU6050六軸傳感器一、什麼是MPU6050?:二、MPU6050的特點:三、MPU6050框圖:四、MPU6050初始化:五、寄存器介紹:六、DMP的使用:七、重要函數:

    MPU6050 DMP輸出的是姿态解算後的四元數,采用q30格式,也就是放大了2的30次方,我們要得到歐拉角,就得做一個轉換,代碼如下:

q0=quat[0] / q30;	//q30格式轉換為浮點數
      q1=quat[1] / q30;
      q2=quat[2] / q30;
      q3=quat[3] / q30; 
      //計算得到俯仰角/橫滾角/航向角
      pitch=asin(-2 * q1 * q3 + 2 * q0* q2)* 57.3; //俯仰角
      roll=atan2(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;	   //航向角
           

quat[0]~quat[3]:是MPU6050的DMP解算後的四元數,q30格式。

q30:是一個常量:1073741824,即2的30次方。

57.3:是弧度轉換為角度,即180/π,這樣結果就是以度(°)為機關的。

七、重要函數:

1,MPU6050 IIC接口驅動代碼

2,MPU_Init函數

3,MPU_Get_Gyroscope函數

4,MPU_Get_Accelerometer函數

5,MPU_Get_Temperature函數

1,DMP移植相關代碼

        i2c_write、i2c_read、delay_ms和get_ms.

2, mpu_dmp_init函數

3, mpu_dmp_get_data函數

繼續閱讀