一、簡介
1.MPU6050是一種常用的六軸姿態傳感器模塊,結合了三軸陀螺儀和三軸加速度計,以及一個可擴展的數字運動處理器DMP(Digital Motion Processor),可用I2C接口連接一個第三方的數字傳感器,比如磁力計。MPU6050 對陀螺儀和加速度計分別用了三個16 位的ADC(0~65535),將其測量的模擬量轉化為可輸出的數字量。為了精確跟蹤快速和慢速的運動,傳感器的測量范圍都是用戶可控的,陀螺儀可測范圍為±250,±500,±1000,±2000°/秒(dps),加速度計可測范圍為±2,±4,±8,±16g。并有可編程的低通濾波器。MPU6050模塊的應用場景非常廣泛,包括但不限于以下幾個領域:
(1)姿態感知與控制:通過讀取陀螺儀和加速度計的數據,可以實時獲取物體的姿態信息,如傾斜角度、旋轉角度等。這在飛行器、機器人、無人車等項目中非常常見,用于實現姿態感知和控制。
(2)運動跟蹤與手勢識別:MPU6050可以用于捕捉人體運動軌跡,如手部的姿態和手勢,從而實現運動跟蹤、手勢識別、虛擬現實交互等應用。
(3)震動檢測與防抖:結合加速度計,MPU6050可以檢測到物體的震動和沖擊,用于防抖技術、硬盤保護、運動檢測等。
(4)步態分析與健康監測:MPU6050可以用于分析人體的步態特征和動作,用于健康監測、運動分析、姿勢校正等。
二、所需物料+寄存器說明
.本實驗使用到了CW32F030C8小藍板、GY-521模塊、0.96寸OLED顯示屏Keil5開發環境
CW32F030C8小藍板 |
GY-521模塊 |
實物展示
【GY-521模塊與單片機連線】:VCC<-->+3.3V
GND<-->GND
SCL<-->PB5
SDA<-->PB4
【OLED顯示屏與單片機連線】:VCC<-->+3.3V
GND<-->GND
SCL<-->PA1
SDA<-->PA2
注:SCL和 SDA是連接MCU的 IIC接口,MCU通過這個IIC 接口來控制MPU6050,另外還有一個 IIC 接口: XCL和XDA ,這個接口可用來連外部從設備比如磁力計,這樣就可以組成一個九軸傳感器。AD0是MPU6050的地址控制引腳,該引腳控制的是IIC 地址的最低位。MPU6050的默認IIC地址是:0X68,如果AD0接VDD,則是0X69。需要注意的是:這里的地址0x68(110 1000)和0x69(110 1001)是不包含最低位的7位數據,通常最低位用于表示IIC主機的讀取數據/寫數據模式。如默認情況下對MPU6050進行寫操作,則發送地址0xD0(1101 0000),讀操作則發送地址0xD1(1101 0001)。
寄存器說明:
該寄存器是配置陀螺儀輸出速率的分頻器,用于為MPU-6050生成采樣速率。這里有個公式:采樣頻率=陀螺儀輸出頻率/(1+采樣分頻數)。當 DLPF(數字低通濾波器,見寄存器Configuration)禁用時,陀螺儀輸出頻率為8kHz;當 DLPF 使能,陀螺儀輸出頻率=1KHz。
該寄存器為陀螺儀和加速度計配置外部幀同步(FSYNC) 管腳的采樣和數字低通濾波(DLPF)設置。其中,數字低通濾波器DLPF由DLPF_CFG配置。根據下表所示的DLPF_CFG值對加速度計和陀螺儀進行濾波。
FS為陀螺儀輸出頻率。SMPLRT_DIV由預設定的采樣頻率根據上述的公式計算得出。一般情況下,DPLF濾波頻率為采樣頻率的一半,如設定采樣頻率為50Hz,由表可知當FS為1kHz,SMPLRT_DIV的值為1000/50-1=19。
該寄存器是用來觸發陀螺儀自檢和配置陀螺儀的滿量程范圍。其中,XG_ST、YG_ST、ZG_ST分別用來設置陀螺儀X軸、Y軸、Z軸自檢,置0則不觸發自檢。FS_SEL[1:0]用于設置陀螺儀的滿量程,如下表:
我們一般設置為3,即滿量程為±2000°/s
該寄存器是用來觸發加速度計自檢和配置加速度計的滿量程范圍。同時這個寄存器也可以用于配置數字高通濾波器(DHPF)。其中,XA_ST、YA_ST、ZA_ST分別用來設置加速度計X軸、Y軸、Z軸自檢,置0則不觸發自檢。AFS_SEL[1:0]用于選擇加速度計的滿量程范圍,如下表:
我們一般設置為0,即滿量程為±2g
ACCEL_XOUT :由 2部分組成的 16位數值存儲最近X 軸加速度計的測量值。ACCEL_YOUT :由 2部分組成的 16位數值存儲最近Y 軸加速度計的測量值。ACCEL_ZOUT :由 2部分組成的 16位數值存儲最近Z 軸加速度計的測量值。
以ACCEL_XOUT為例,若倍率設定為2g,則意味著ACC_X取最小值-32768時,當前加速度為沿X軸正方向2倍的重力加速度;若設定為4g,取-32768時表示沿X軸正方向4倍的重力加速度,以此類推。顯然,倍率越低精度越好,倍率越高表示的范圍越大,這要根據具體的應用來設定。以ACC_X為例,若當前設定的加速度倍率為4g,那么將ACC_X讀數換算為加速度的公式為:
g可取當地重力加速度。
該寄存器存儲最近加陀螺儀的測量值,構成與加速度計測量值寄存器相同,不做贅述。
以GYR_X為例,若倍率設定為250度/秒,則意味著GYR取正最大值32768時,當前角速度為順時針250度/秒;若設定為500度/秒,取32768時表示當前角速度為順時針500度/秒。顯然,倍率越低精度越好,倍率越高表示的范圍越大。以GYR_X為例,若當前設定的角速度倍率為1000度/秒,那么將GRY_X讀數換算為角速度(順時針)的公式為:
該寄存器允許用戶配置電源模式和時鐘源,還提供了復位整個設備和禁用溫度傳感器的位。當置SLEEP位為1時,MPU-60X0 可以進入低功耗睡眠模式。該寄存器的最低三位用于設置系統的時鐘源選擇,默認值是0(內部8M RC振蕩),不過一般設置為1,即選擇x軸陀螺儀PLL作為時鐘源,以獲得更高精度的時鐘。DEVICE_RESET該位置 1,重啟內部寄存器到默認值。復位完成后該位自動清0。TEMP_DIS該位置 1,禁用溫度傳感器。
三、核心代碼
main.c: #include "main.h" #include "OLED.h" #include "GY_521.h" #include "MYI2C.h" #include "Delay.h" typedef struct{ int16_t AX; int16_t AY; int16_t AZ; }MPU6050_Adata; //MPU6050加速度計三軸數據 typedef struct{ int16_t GX; int16_t GY; int16_t GZ; }MPU6050_Gdata; //MPU6050陀螺儀三軸數據 MPU6050_Adata Adata; //結構體變量 MPU6050_Gdata Gdata; void GY_521_Init(void) //GY-521初始化 { GY521_GPIO_Init(); //GPIO初始化 //解除睡眠,失能溫度傳感器,選擇X軸的陀螺儀時鐘 WriteData(GY521_ADDR, MPU6050_PWR_MGMT_1, 0x09); WriteData(GY521_ADDR, MPU6050_CONFIG, 0x06); //低通濾波 WriteData(GY521_ADDR, MPU6050_SMPRT_DIV, 0x09); //1KHz十分頻為100Hz WriteData(GY521_ADDR, MPU6050_GYRO_CONFIG, 0x18);//陀螺儀最大量程 WriteData(GY521_ADDR, MPU6050_ACCEL_CONFIG, 0x18);//加速度計最大量程 } void MPU6050_GetData() //獲取MPU6050六軸數據 { uint8_t MPU6050_Raw_Data[14]={0}; //以MPU6050_ACCEL_XOUT_H為起始地址,連續讀取14字節的數據 ReadData(GY521_ADDR,MPU6050_ACCEL_XOUT_H,MPU6050_Raw_Data,14); //數據處理 Adata.AX=(MPU6050_Raw_Data[0]<<8)|MPU6050_Raw_Data[1]; Adata.AY=(MPU6050_Raw_Data[2]<<8)|MPU6050_Raw_Data[3]; Adata.AZ=(MPU6050_Raw_Data[4]<<8)|MPU6050_Raw_Data[5]; Gdata.GX=(MPU6050_Raw_Data[8]<<8)|MPU6050_Raw_Data[9]; Gdata.GY=(MPU6050_Raw_Data[10]<<8)|MPU6050_Raw_Data[11]; Gdata.GZ=(MPU6050_Raw_Data[12]<<8)|MPU6050_Raw_Data[13]; } int main() { OLED_Init(); //OLED初始化 GY_521_Init(); //GY-521初始化 OLED_ShowString(1,1,"A: G:");//提示:左列顯示加速度計數據;右列顯示陀螺儀數據 while(1) { MPU6050_GetData(); //獲取六軸數據 OLED_ShowSignedNum(2,1,Adata.AX,5); OLED_ShowSignedNum(3,1,Adata.AY,5); OLED_ShowSignedNum(4,1,Adata.AZ,5); OLED_ShowSignedNum(2,9,Gdata.GX,5); OLED_ShowSignedNum(3,9,Gdata.GY,5); OLED_ShowSignedNum(4,9,Gdata.GZ,5); Delay_ms(100); //延時刷新 } }
四、效果演示
平放 |
向下傾斜 |
左傾斜向 |
直立 |
讀到的原始數據還不能直接使用,要轉化成四元數,歐拉角后,獲得器件的姿態角才有用,而 MPU6050 自帶了數字運動處理器,即 DMP,并且,InvenSense 提供了一個 MPU6050 的嵌入式運動驅動庫,結合 MPU6050 的 DMP,可以將我們的原始數據,直接轉換成四元數輸出,而得到四元數之后,就可以很方便的計算出歐拉角,從而得到yaw、roll和pitch。
審核編輯:湯梓紅
-
傳感器
+關注
關注
2551文章
51099瀏覽量
753606 -
mcu
+關注
關注
146文章
17148瀏覽量
351213 -
OLED
+關注
關注
119文章
6200瀏覽量
224215 -
寄存器
+關注
關注
31文章
5343瀏覽量
120377 -
CW32
+關注
關注
1文章
203瀏覽量
645
原文標題:【CW32】基于CW32的MPU6050姿態傳感器的應用
文章出處:【微信號:武漢芯源半導體,微信公眾號:武漢芯源半導體】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論