正点原子STM32学习笔记——MPU6050介绍
一、MPU6050簡介
1.什么是MPU6050?
????????MPU6050是InvenSense公司推出的全球首款整合性6軸運動處理組件,內(nèi)帶3軸陀螺儀和3軸加速度傳感器,并且含有一個第二IIC接口,可用于連接外部磁力傳感器,利用自帶數(shù)字運動處理器(DMP: Digital Motion Processor)硬件加速引擎,通過主IIC接口,可以向應(yīng)用端輸出完整的9軸姿態(tài)融合演算數(shù)據(jù)。
????????有了DMP,我們可以使用InvenSense公司提供的運動處理資料庫,非常方便的實現(xiàn)姿態(tài)解算,降低了運動處理運算對操作系統(tǒng)的負荷,同時大大降低了開發(fā)難度 。
2.MUP6050特點。
MPU6050 的特點包括:
① 以數(shù)字形式輸出 6 軸或 9 軸(需外接磁傳感器)的旋轉(zhuǎn)矩陣、四元數(shù)(quaternion)、歐拉角格式(Euler Angle forma)的融合演算數(shù)據(jù)(需 DMP 支持)。
② 具有 131 LSBs/°/sec 敏感度與全格感測范圍為±250、±500、±1000 與±2000°/sec 的 3 軸角速度感測器(陀螺儀)。
③ 集成可程序控制,范圍為±2g、±4g、±8g 和±16g 的 3 軸加速度傳感器。
④ 移除加速器與陀螺儀軸間敏感度,降低設(shè)定給予的影響與感測器的飄移。
⑤ 自帶數(shù)字運動處理(DMP: Digital Motion Processing)引擎可減少MCU復雜的融合演算數(shù)據(jù)、感測器同步化、姿勢感應(yīng)等的負荷。
⑥ 內(nèi)建運作時間偏差與磁力感測器校正演算技術(shù),免除了客戶須另外進行校正的需求。
⑦ 自帶一個數(shù)字溫度傳感器。
⑧ 帶數(shù)字輸入同步引腳(Sync pin)支持視頻電子影相穩(wěn)定技術(shù)與 GPS。
⑨ 可程序控制的中斷(interrupt),支持姿勢識別、搖攝、畫面放大縮小、滾動、快速下降中斷、high-G 中斷、零動作感應(yīng)、觸擊感應(yīng)、搖動感應(yīng)功能。
⑩ VDD 供電電壓為 2.5V±5%、3.0V±5%、3.3V±5%;VLOGIC 可低至 1.8V± 5%。
? 陀螺儀工作電流:5mA,陀螺儀待。
? 自帶 1024 字節(jié) FIFO,有助于降低系統(tǒng)功。
? 高達 400Khz 的 IIC 通信接口。
? 超小封裝尺寸:4x4x0.9mm(QFN)。
3.MPU6050框圖。
????????其中,SCL 和 SDA 是連接 MCU 的 IIC 接口,MCU 通過這個 IIC 接口來控制 MPU6050,另外還有一個 IIC 接口:AUX_CL 和 AUX_DA,這個接口可用來連接外部從設(shè)備,比如磁傳感器,這樣就可以組成一個九軸傳感器。VLOGIC 是 IO 口電壓,該引腳最低可以到 1.8V,我們一般直接接 VDD 即可。AD0 是從 IIC 接口(接 MCU)的地址控制引腳,該引腳控制IIC 地址的最低位。如果接 GND,則 MPU6050 的 IIC 地址是:0X68,如果接 VDD,則是0X69,注意:這里的地址是不包含數(shù)據(jù)傳輸?shù)淖畹臀坏?#xff08;最低位用來表示讀寫)!!
另:
①ATK-MPU6050 六軸傳感器模塊外觀:
????????模塊自帶了 3.3V 超低壓差穩(wěn)壓芯片,給 MPU6050 供電,因此外部供電可以選擇:3.3V / 5V 都可以。模塊通過 P1 排針與外部連接,引出了 VCC、GND、IIC_SDA、IIC_SCL、MPU_INT 和 MPU_AD0 等信號,其中,IIC_SDA 和 IIC_SCL 帶了 4.7K上拉電阻,外部可以不用再加上拉電阻了,另外 MPU_AD0 自帶了 10K 下拉電阻,當 AD0懸空時,默認 IIC 地址為(0X68)。
②ATK-MPU6050 模塊原理圖:
4.MPU6050初始化。
1 )初始化 IIC 接口
????????MPU6050 采用 IIC 與 STM32F1 通信,所以我們需要先初始化與 MPU6050 連接的 SDA和 SCL 數(shù)據(jù)線。
2 )復位 MPU6050
????????這一步讓 MPU6050 內(nèi)部所有寄存器恢復默認值,通過對電源管理寄存器 1(0X6B)的bit7 寫 1 實現(xiàn)。 復位后,電源管理寄存器 1 恢復默認值(0X40),然后必須設(shè)置該寄存器為0X00,以喚醒 MPU6050,進入正常工作狀態(tài)。
3 )設(shè)置角速度傳感器(陀螺儀)和加速度傳感器的滿量程范圍
????????這一步,我們設(shè)置兩個傳感器的滿量程范圍(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)閉這個接口。分別通過中斷使能寄存器(0X38)和用戶控制寄存器(0X6A)控制。MPU6050 可以使用 FIFO 存儲傳感器數(shù)據(jù),不過本章我們沒有用到,所以關(guān)閉所有 FIFO 通道,這個通過 FIFO 使能寄存器(0X23)控制,默認都是 0(即禁止 FIFO),所以用默認值就可以了。陀螺儀采樣率通過采樣率分頻寄存器(0X19)控制,這個采樣率我們一般設(shè)置為 50 即可。數(shù)字低通濾波器(DLPF)則通過配置寄存器(0X1A)設(shè)置,一般設(shè)置 DLPF 為帶寬的 1/2 即可。
5 )配置系統(tǒng)時鐘源并使能角速度傳感器和加速度傳感器
????????系統(tǒng)時鐘源同樣是通過電源管理寄存器 1(0X1B)來設(shè)置,該寄存器的最低三位用于設(shè)置系統(tǒng)時鐘源選擇,默認值是 0(內(nèi)部 8M RC 震蕩),不過我們一般設(shè)置為 1,選擇 x 軸陀螺 PLL 作為時鐘源,以獲得更高精度的時鐘。同時,使能角速度傳感器和加速度傳感器,這兩個操作通過電源管理寄存器 2(0X6C)來設(shè)置,設(shè)置對應(yīng)位為 0 即可開啟。
????????至此,MPU6050 的初始化就完成了,可以正常工作了(其他未設(shè)置的寄存器全部采用默認值即可),接下來,我們就可以讀取相關(guān)寄存器,得到加速度傳感器、角速度傳感器和溫度傳感器的數(shù)據(jù)了。不過,我們先簡單介紹幾個重要的寄存器。
5.寄存器介紹
①電源管理寄存器1(寄存器地址為 0X6B)
????????其中,DEVICE_RESET 位用來控制復位,設(shè)置為 1,復位 MPU6050,復位結(jié)束后,MPU硬件自動清零該位。SLEEEP 位用于控制 MPU6050 的工作模式,復位后,該位為 1,即進入了睡眠模式(低功耗),所以我們要清零該位,以進入正常工作模式。TEMP_DIS 用于設(shè)置是否使能溫度傳感器,設(shè)置為 0,則使能。最后 CLKSEL[2:0]用于選擇系統(tǒng)時鐘源,選擇關(guān)系如下表所示:
????????默認是使用內(nèi)部 8M RC 晶振的,精度不高,所以我們一般選擇 X/Y/Z 軸陀螺作為參考的 PLL 作為時鐘源,一般設(shè)置 CLKSEL=001 即可。
②陀螺儀配置寄存器(寄存器地址為0X1B)
????????該寄存器我們只關(guān)心 FS_SEL[1:0]這兩個位,用于設(shè)置陀螺儀的滿量程范圍:0,±250°/S;1,±500°/S;2,±1000°/S;3,±2000°/S;我們一般設(shè)置為 3,即±2000°/S,因為陀螺儀的 ADC 為 16 位分辨率,所以得到靈敏度為:65536/4000=16.4LSB/(°/S)。
③加速度傳感器配置寄存器(寄存器地址為0X1C)
????????該寄存器我們只關(guān)心 AFS_SEL[1:0]這兩個位,用于設(shè)置加速度傳感器的滿量程范圍:0,±2g;1,±4g;2,±8g;3,±16g;我們一般設(shè)置為 0,即±2g,因為加速度傳感器的ADC 也是 16 位,所以得到靈敏度為:65536/4=16384LSB/g。
④ FIFO 使能寄存器(寄存器地址為0X23)
????????該寄存器用于控制 FIFO 使能,在簡單讀取傳感器數(shù)據(jù)的時候,可以不用 FIFO,設(shè)置對應(yīng)位為 0 即可禁止 FIFO,設(shè)置為 1,則使能 FIFO。注意加速度傳感器的 3 個軸,全由 1個位(ACCEL_FIFO_EN)控制,只要該位置 1,則加速度傳感器的三個通道都開啟 FIFO了。
⑤陀螺儀采樣率分頻寄存器(寄存器地址為0X19)
????????該寄存器用于設(shè)置 MPU6050 的陀螺儀采樣頻率,計算公式為:
????????????????????????采樣頻率 = 陀螺儀輸出頻率 / (1+SMPLRT_DIV)
????????這里陀螺儀的輸出頻率,是 1Khz 或者 8Khz,與數(shù)字低通濾波器(DLPF)的設(shè)置有關(guān),當 DLPF_CFG=0/7 的時候,頻率為 8Khz,其他情況是 1Khz。而且 DLPF 濾波頻率一般設(shè)置為采樣率的一半。采樣率,我們假定設(shè)置為 50Hz,那么 SMPLRT_DIV=1000/50-1=19。
⑥配置寄存器(寄存器地址為0X1A)
????????這里,我們主要關(guān)心數(shù)字低通濾波器(DLPF)的設(shè)置位,即:DLPF_CFG[2:0],加速度計和陀螺儀,都是根據(jù)這三個位的配置進行過濾的。DLPF_CFG 不同配置對應(yīng)的過濾情況如下表所示:
????????這里的加速度傳感器,輸出速率(Fs)固定是 1Khz,而角速度傳感器的輸出速率(Fs),則根據(jù) DLPF_CFG 的配置有所不同。一般我們設(shè)置角速度傳感器的帶寬為其采樣率的一半,如前面所說的,如果設(shè)置采樣率為 50Hz,那么帶寬就應(yīng)該設(shè)置為 25Hz,取近似值 20Hz,就應(yīng)該設(shè)置 DLPF_CFG=100。
⑦電源管理寄存器2(0X6C)
????????該寄存器的 LP_WAKE_CTRL 用于控制低功耗時的喚醒頻率,本章用不到。剩下的 6位,分別控制加速度和陀螺儀的 x/y/z 軸是否進入待機模式,這里我們?nèi)慷疾贿M入待機模式,所以全部設(shè)置為 0 即可。
⑧陀螺儀數(shù)據(jù)輸出寄存器(共6個寄存器,地址為0X43~0X48)
????????陀螺儀數(shù)據(jù)輸出寄存器總共由6個寄存器組成,輸出X/Y/Z三個軸的陀螺儀傳感器數(shù)據(jù),高字節(jié)在前,低字節(jié)在后。
⑨加速度傳感器數(shù)據(jù)輸出寄存器(6個,地址為0X3B~0X40)
????????加速度傳感器數(shù)據(jù)輸出寄存器總共由6個寄存器組成,輸出X/Y/Z三個軸的加速度傳感器值,高字節(jié)在前,低字節(jié)在后。
⑩溫度傳感器數(shù)據(jù)輸出寄存器(0X41~0X42)
????????通過讀取0X41(高8位)和0X42(低8位)寄存器得到,溫度換算公式為:
????????????????????????????????????????????????Temperature = 36.53 + regval/340
????????其中,Temperature為計算得到的溫度值,單位為℃,regval為從0X41和0X42讀到的溫度傳感器值。
二、DMP使用簡介
????????MPU6050 自帶了數(shù)字運動處理器,即 DMP,并且,InvenSense 提供了一個 MPU6050 的嵌入式運動驅(qū)動庫,結(jié)合 MPU6050 的 DMP,可以將我們的加速度傳感器和角速度傳感器的原始數(shù)據(jù),直接轉(zhuǎn)換成四元數(shù)輸出,而得到四元數(shù)之后,就可以很方便的計算出歐拉角:航向角(yaw)、橫滾角(roll)和俯仰角(pitch)。
????????使用內(nèi)置的 DMP,大大簡化了四軸的代碼設(shè)計,且 MCU 不用進行姿態(tài)解算過程,大大降低了 MCU 的負擔,從而有更多的時間去處理其他事件,提高系統(tǒng)實時性。
????????使用 MPU6050 的 DMP 輸出的四元數(shù)是 q30 格式的,也就是浮點數(shù)放大了 2 的 30 次方倍。在換算成歐拉角之前,必須先將其轉(zhuǎn)換為浮點數(shù),也就是除以 2 的 30 次方,然后再進行計算,計算公式為:
????????q0=quat[0] / q30; //q30 格式轉(zhuǎn)換為浮點數(shù)
????????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*(q1q2 + q0q3),q0q0+q1q1-q2q2-q3q3) * 57.3; //航向角
????????其中 quat[0]~ quat[3]是 MPU6050 的 DMP 解算后的四元數(shù),q30 格式,所以要除以一個2 的 30 次方,其中 q30 是一個常量:1073741824,即 2 的 30 次方,然后帶入公式,計算出歐拉角。上述計算公式的 57.3 是弧度轉(zhuǎn)換為角度,即 180/π,這樣得到的結(jié)果就是以度(°)為單位的。關(guān)于四元數(shù)與歐拉角的公式推導,這里不進行詳細說明。
總結(jié)
以上是生活随笔為你收集整理的正点原子STM32学习笔记——MPU6050介绍的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Omap3530 的GPIO中断设置
- 下一篇: electron知识点