【51单片机快速入门指南】4.3: I2C读取MPU6050陀螺仪的原始数据
目錄
- 硬知識
- 特性參數
- MPU6050 簡介
- 模塊重要寄存器簡介
- 電源管理寄存器 1
- 陀螺儀配置寄存器
- 加速度傳感器配置寄存器
- FIFO 使能寄存器
- 陀螺儀采樣率分頻寄存器
- 配置寄存器
- 電源管理寄存器 2
- 陀螺儀數據輸出寄存器
- 加速度傳感器數據輸出寄存器
- 溫度傳感器
- 示例程序
- MPU6050.c
- MPU6050.h
- main.c
- 實驗現象
普中51-單核-A2
STC89C52
Keil uVision V5.29.0.0
PK51 Prof.Developers Kit Version:9.60.0.0
串口示波器:Vofa+ 1.3.10
硬知識
摘自《ATK-MPU6050六軸傳感器模塊用戶手冊_V1.0》
特性參數
???????模塊自帶了 3.3V 超低壓差穩壓芯片,給 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)。
MPU6050 簡介
???????該模塊采用InvenSense 公司的 MPU6050 芯片作為核心,該芯片內部整合了 3 軸陀螺儀和 3 軸加速度傳感器,并可利用自帶的數字運動處理器(DMP: Digital Motion Processor)硬件加速引擎,通過主 IIC 接口,向應用端輸出姿態解算后的數據。有了 DMP,我們可以使用 InvenSense 公司提供的運動處理資料庫,非常方便的實現姿態解算,降低了運動處理運算對操作系統的負荷,同時大大降低了開發難度。
???????MPU6050 的特點包括:
① 以數字形式輸出 6 軸或 9 軸(需外接磁傳感器)的旋轉矩陣、四元數(quaternion)、歐拉角格式(Euler Angle forma)的融合演算數據(需 DMP 支持)
② 具有 131 LSBs/°/sec 敏感度與全格感測范圍為±250、±500、±1000 與±2000°/sec 的 3 軸角速度感測器(陀螺儀)
③ 集成可程序控制,范圍為±2g、±4g、±8g 和±16g 的 3 軸加速度傳感器
④ 移除加速器與陀螺儀軸間敏感度,降低設定給予的影響與感測器的飄移
⑤ 自帶數字運動處理(DMP: Digital Motion Processing)引擎可減少 MCU 復雜的融合演算數據、感測器同步化、姿勢感應等的負荷
⑥ 內建運作時間偏差與磁力感測器校正演算技術,免除了客戶須另外進行校正的需求
⑦ 自帶一個數字溫度傳感器
⑧ 帶數字輸入同步引腳(Sync pin)支持視頻電子影相穩定技術與 GPS
⑨ 可程序控制的中斷(interrupt),支持姿勢識別、搖攝、畫面放大縮小、滾動、快速下降中斷、high-G 中斷、零動作感應、觸擊感應、搖動感應功能
⑩ VDD 供電電壓為 2.5V±5%、3.0V±5%、3.3V±5%;VLOGIC 可低至 1.8V± 5%
? 陀螺儀工作電流:5mA,陀螺儀待機電流:5uA;加速器工作電流:500uA,加速
器省電模式電流:40uA@10Hz
? 自帶 1024 字節 FIFO,有助于降低系統功耗
? 高達 400Khz 的 IIC 通信接口
? 超小封裝尺寸:4x4x0.9mm(QFN)
???????MPU6050 傳感器的檢測軸如圖 2.2.1 所示:
???????MPU6050 的內部框圖如圖 2.2.2 所示:
???????其中,SCL 和 SDA 是連接 MCU 的 IIC 接口,MCU 通過這個 IIC 接口來控制 MPU6050,另外還有一個 IIC 接口:AUX_CL 和 AUX_DA,這個接口可用來連接外部從設備,比如磁傳感器,這樣就可以組成一個九軸傳感器。VLOGIC 是 IO 口電壓,該引腳最低可以到 1.8V,我們一般直接接 VDD 即可。AD0 是從 IIC 接口(接 MCU)的地址控制引腳,該引腳控制IIC 地址的最低位。如果接 GND,則 MPU6050 的 IIC 地址是:0X68,如果接 VDD,則是0X69,注意:這里的地址是不包含數據傳輸的最低位的(最低位用來表示讀寫)!!
模塊重要寄存器簡介
電源管理寄存器 1
???????其中,DEVICE_RESET 位用來控制復位,設置為 1,復位 MPU6050,復位結束后,MPU硬件自動清零該位。SLEEEP 位用于控制 MPU6050 的工作模式,復位后,該位為 1,即進入了睡眠模式(低功耗),所以我們要清零該位,以進入正常工作模式。TEMP_DIS 用于設置是否使能溫度傳感器,設置為 0,則使能。最后 CLKSEL[2:0]用于選擇系統時鐘源,選擇關系如表 2.3.1 所示:
???????默認是使用內部 8M RC 晶振的,精度不高,所以我們一般選擇 X/Y/Z 軸陀螺作為參考的 PLL 作為時鐘源,一般設置 CLKSEL=001 即可。
陀螺儀配置寄存器
???????該寄存器我們只關心 FS_SEL[1:0]這兩個位,用于設置陀螺儀的滿量程范圍:0,±250°/S;1,±500°/S;2,±1000°/S;3,±2000°/S ;我們一般設置為 3,即±2000°/S,因為陀螺儀的 ADC 為 16 位分辨率,所以得到靈敏度為:65536/4000= 16.4 LSB/(°/S)。
加速度傳感器配置寄存器
???????該寄存器我們只關心 AFS_SEL[1:0]這兩個位,用于設置加速度傳感器的滿量程范圍:0, ±2g;1,±4g;2,±8g;3,±16g;我們一般設置為 0,即±2g,因為加速度傳感器的ADC 也是 16 位,所以得到靈敏度為:65536/4= 16384 LSB/g。
FIFO 使能寄存器
???????該寄存器用于控制 FIFO 使能,在簡單讀取傳感器數據的時候,可以不用 FIFO,設置對應位為 0 即可禁止 FIFO,設置為 1,則使能 FIFO。注意加速度傳感器的 3 個軸,全由 1個位(ACCEL_FIFO_EN)控制,只要該位置 1,則加速度傳感器的三個通道都開啟 FIFO了。
陀螺儀采樣率分頻寄存器
???????該寄存器用于設置 MPU6050 的陀螺儀采樣頻率,計算公式為:
??????????????采樣頻率 = 陀螺儀輸出頻率 / (1+SMPLRT_DIV)
???????這里陀螺儀的輸出頻率,是 1Khz 或者 8Khz,與數字低通濾波器(DLPF)的設置有關,當 DLPF_CFG=0/7 的時候,頻率為 8Khz,其他情況是 1Khz。而且 DLPF 濾波頻率一般設置為采樣率的一半。采樣率,我們假定設置為 50Hz,那么 SMPLRT_DIV=1000/50-1=19。
配置寄存器
???????這里,我們主要關心數字低通濾波器(DLPF)的設置位,即:DLPF_CFG[2:0],加速度計和陀螺儀,都是根據這三個位的配置進行過濾的。DLPF_CFG 不同配置對應的過濾情況如表 2.3.2 所示:
???????這里的加速度傳感器,輸出速率(Fs)固定是 1Khz,而角速度傳感器的輸出速率(Fs),則根據 DLPF_CFG 的配置有所不同。一般我們設置角速度傳感器的帶寬為其采樣率的一半,如前面所說的,如果設置采樣率為 50Hz,那么帶寬就應該設置為 25Hz,取近似值 20Hz,就應該設置 DLPF_CFG=100。
電源管理寄存器 2
???????該寄存器的 LP_WAKE_CTRL 用于控制低功耗時的喚醒頻率。剩下的 6 位,分別控制加速度和陀螺儀的 x/y/z 軸是否進入待機模式,這里我們全部都不進入待機模式,所以全部設置為 0 即可。
陀螺儀數據輸出寄存器
???????總共有 8 個寄存器組成,地址為:0x43~0x48,
???????通過讀取這 8 個寄存器,就可以讀到陀螺儀 x/y/z 軸的值,比如 x 軸的數據,可以通過讀取0X43(高 8 位)和 0X44(低 8 位)寄存器得到,其他軸以此類推。
加速度傳感器數據輸出寄存器
???????也有 8 個,地址為:0x3B~0x40
???????通過讀取這 8個寄存器,就可以讀到加速度傳感器 x/y/z 軸的值,比如讀 x 軸的數據,可以通過讀取 0X3B(高 8 位)和 0X3C(低 8 位)寄存器得到,其他軸以此類推。
溫度傳感器
???????可以通過讀取 0x41(高 8 位)和 0x42(低 8 位)寄存器得到,溫度換算公式為:
??????????????Temperature=36.53+regval/340Temperature = 36.53 + regval/340Temperature=36.53+regval/340
???????其中,Temperature 為計算得到的溫度值,單位為℃,regval 為從 0x41 和 0x42 讀到的溫度傳感器值。
示例程序
???????移植自正點原子ATK-MPU6050六軸傳感器例程。
???????軟件I2C程序見【51單片機快速入門指南】4: 軟件 I2C
???????stdint.h見【51單片機快速入門指南】1:基礎知識和工程創建
???????串口部分見【51單片機快速入門指南】3.3:USART 串口通信
MPU6050.c
#include "MPU6050.h" #include "./Software_I2C/Software_I2C.h"void Delay1ms(); //@11.0592MHz void MPU_Delay_Ms(uint16_t Milliseconds) //移植時需修改 {while(Milliseconds--)Delay1ms(); }//IIC連續寫 //reg:要寫入的寄存器地址 //len:要寫入的長度 //buf:要寫入的數據的首地址 //返回值:0,正常 // 其他,錯誤代碼 uint8_t MPU_Write_Len(uint8_t reg, uint8_t len, uint8_t *buf) {return i2c_mem_write(MPU_ADDR, reg, buf, len); }//IIC連續讀 //reg:要讀取的寄存器地址 //len:要讀取的長度 //buf:讀取到的數據存儲區 //返回值:0,正常 // 其他,錯誤代碼 uint8_t MPU_Read_Len(uint8_t reg, uint8_t len, uint8_t *buf) {return i2c_mem_read(MPU_ADDR, reg, buf, len); }//IIC寫一個字節 //reg:寄存器地址 //Data:數據 //返回值:0,正常 // 其他,錯誤代碼 uint8_t MPU_Write_Byte(uint8_t reg, uint8_t Data) {return i2c_mem_write(MPU_ADDR, reg, &Data, 1); }//IIC讀一個字節 //reg:寄存器地址 //返回值:讀到的數據 uint8_t MPU_Read_Byte(uint8_t reg) {uint8_t res;i2c_mem_read(MPU_ADDR, reg, &res, 1);return res; }//寫入8位寄存器的一個位 uint8_t MPU_Write_Bit(uint8_t addr, uint8_t bitNum, uint8_t Data) {return i2c_write_bit(MPU_ADDR, addr, bitNum, Data); }//寫入8位寄存器的多個位 uint8_t MPU_Write_Bits(uint8_t addr, uint8_t bitStart, uint8_t length, uint8_t Data) {return i2c_write_bits(MPU_ADDR, addr, bitStart, length, Data); }//讀取一個位從8位器件的寄存器 uint8_t MPU_Read_Bit(uint8_t addr, uint8_t bitNum, uint8_t *Data) {return i2c_read_bit(MPU_ADDR, addr, bitNum, Data); }//讀取8位寄存器的多個位 uint8_t MPU_Read_Bits(uint8_t addr, uint8_t bitStart, uint8_t length, uint8_t *Data) {return i2c_read_bits(MPU_ADDR, addr, bitStart, length, Data); }// //本程序只供學習使用,未經作者許可,不得用于其它任何用途 //ALIENTEK NANO STM32F103開發板 //MPU6050 驅動代碼 //正點原子@ALIENTEK //技術論壇:www.openedv.com //創建日期:2018/7/28 //版本:V1.0 //版權所有,盜版必究。 //Copyright(C) 廣州市星翼電子科技有限公司 208-2028 //All rights reserved // //初始化MPU6050 //返回值:0,成功 // 其他,錯誤代碼 uint8_t MPU_Init(void) {uint8_t res;MPU_Write_Byte(MPU_PWR_MGMT1_REG, 0X80); //復位MPU6050MPU_Delay_Ms(100);MPU_Write_Byte(MPU_PWR_MGMT1_REG, 0X00); //喚醒MPU6050 MPU_Set_Gyro_Fsr(3); //陀螺儀傳感器,±2000dpsMPU_Set_Accel_Fsr(0); //加速度傳感器,±2gMPU_Set_Rate(50); //設置采樣率50HzMPU_Write_Byte(MPU_INT_EN_REG, 0X01); //使能數據就緒中斷MPU_Write_Byte(MPU_USER_CTRL_REG, 0X00); //I2C主模式關閉MPU_Write_Byte(MPU_FIFO_EN_REG, 0X00); //關閉FIFOMPU_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(200); //設置采樣率為200Hz}elsereturn 1;return 0; }//設置MPU6050陀螺儀傳感器滿量程范圍 //fsr:0,±250dps;1,±500dps;2,±1000dps;3,±2000dps //返回值:0,設置成功 // 其他,設置失敗 uint8_t MPU_Set_Gyro_Fsr(uint8_t fsr) {return MPU_Write_Byte(MPU_GYRO_CFG_REG, fsr << 3);//設置陀螺儀滿量程范圍 }//設置MPU6050加速度傳感器滿量程范圍 //fsr:0,±2g;1,±4g;2,±8g;3,±16g //返回值:0,設置成功 // 其他,設置失敗 uint8_t MPU_Set_Accel_Fsr(uint8_t fsr) {return MPU_Write_Byte(MPU_ACCEL_CFG_REG, fsr << 3);//設置加速度傳感器滿量程范圍 }//設置MPU6050的數字低通濾波器 //lpf:數字低通濾波頻率(Hz) //返回值:0,設置成功 // 其他,設置失敗 uint8_t MPU_Set_LPF(uint16_t lpf) {uint8_t Data = 0;if (lpf >= 188)Data = 1;else if (lpf >= 98)Data = 2;else if (lpf >= 42)Data = 3;else if (lpf >= 20)Data = 4;else if (lpf >= 10)Data = 5;else Data = 6;return MPU_Write_Byte(MPU_CFG_REG, Data);//設置數字低通濾波器 }//設置MPU6050的采樣率(假定Fs=1KHz) //rate:4~1000(Hz) //返回值:0,設置成功 // 其他,設置失敗 uint8_t MPU_Set_Rate(uint16_t rate) {uint8_t Data;if (rate>1000)rate = 1000;if (rate<4)rate = 4;Data = 1000 / rate - 1;Data = MPU_Write_Byte(MPU_SAMPLE_RATE_REG, Data); //設置數字低通濾波器return MPU_Set_LPF(rate / 2); //自動設置LPF為采樣率的一半 }//得到溫度值 //返回值:溫度值(擴大了100倍) short MPU_Get_Temperature(void) {uint8_t buf[2];short raw;float temp;MPU_Read_Len(MPU_TEMP_OUTH_REG, 2, buf);raw = ((uint16_t)buf[0] << 8) | buf[1];temp = 36.53 + ((double)raw) / 340;return temp * 100;; }//得到陀螺儀值(原始值) //gx,gy,gz:陀螺儀x,y,z軸的原始讀數(帶符號) //返回值:0,成功 // 其他,錯誤代碼 uint8_t MPU_Get_Gyroscope(short *gx, short *gy, short *gz) {uint8_t buf[6], res;res = MPU_Read_Len(MPU_GYRO_XOUTH_REG, 6, buf);if (res == 0){*gx = ((uint16_t)buf[0] << 8) | buf[1];*gy = ((uint16_t)buf[2] << 8) | buf[3];*gz = ((uint16_t)buf[4] << 8) | buf[5];}return res;; }//得到加速度值(原始值) //gx,gy,gz:陀螺儀x,y,z軸的原始讀數(帶符號) //返回值:0,成功 // 其他,錯誤代碼 uint8_t MPU_Get_Accelerometer(short *ax, short *ay, short *az) {uint8_t buf[6], res;res = MPU_Read_Len(MPU_ACCEL_XOUTH_REG, 6, buf);if (res == 0){*ax = ((uint16_t)buf[0] << 8) | buf[1];*ay = ((uint16_t)buf[2] << 8) | buf[3];*az = ((uint16_t)buf[4] << 8) | buf[5];}return res;; }MPU6050.h
#ifndef __MPU6050_H #define __MPU6050_H#include "stdint.h"// //本程序只供學習使用,未經作者許可,不得用于其它任何用途 //ALIENTEK NANO STM32F103開發板 //MPU6050 驅動代碼 //正點原子@ALIENTEK //技術論壇:www.openedv.com //創建日期:2018/7/28 //版本:V1.0 //版權所有,盜版必究。 //Copyright(C) 廣州市星翼電子科技有限公司 208-2028 //All rights reserved // #define MPU_ACCEL_OFFS_REG 0X06 //accel_offs寄存器,可讀取版本號,寄存器手冊未提到 #define MPU_PROD_ID_REG 0X0C //prod id寄存器,在寄存器手冊未提到 #define MPU_SELF_TESTX_REG 0X0D //自檢寄存器X #define MPU_SELF_TESTY_REG 0X0E //自檢寄存器Y #define MPU_SELF_TESTZ_REG 0X0F //自檢寄存器Z #define MPU_SELF_TESTA_REG 0X10 //自檢寄存器A #define MPU_SAMPLE_RATE_REG 0X19 //采樣頻率分頻器 #define MPU_CFG_REG 0X1A //配置寄存器 #define MPU_GYRO_CFG_REG 0X1B //陀螺儀配置寄存器 #define MPU_ACCEL_CFG_REG 0X1C //加速度計配置寄存器 #define MPU_MOTION_DET_REG 0X1F //運動檢測閥值設置寄存器 #define MPU_FIFO_EN_REG 0X23 //FIFO使能寄存器 #define MPU_I2CMST_CTRL_REG 0X24 //IIC主機控制寄存器 #define MPU_I2CSLV0_ADDR_REG 0X25 //IIC從機0器件地址寄存器 #define MPU_I2CSLV0_REG 0X26 //IIC從機0數據地址寄存器 #define MPU_I2CSLV0_CTRL_REG 0X27 //IIC從機0控制寄存器 #define MPU_I2CSLV1_ADDR_REG 0X28 //IIC從機1器件地址寄存器 #define MPU_I2CSLV1_REG 0X29 //IIC從機1數據地址寄存器 #define MPU_I2CSLV1_CTRL_REG 0X2A //IIC從機1控制寄存器 #define MPU_I2CSLV2_ADDR_REG 0X2B //IIC從機2器件地址寄存器 #define MPU_I2CSLV2_REG 0X2C //IIC從機2數據地址寄存器 #define MPU_I2CSLV2_CTRL_REG 0X2D //IIC從機2控制寄存器 #define MPU_I2CSLV3_ADDR_REG 0X2E //IIC從機3器件地址寄存器 #define MPU_I2CSLV3_REG 0X2F //IIC從機3數據地址寄存器 #define MPU_I2CSLV3_CTRL_REG 0X30 //IIC從機3控制寄存器 #define MPU_I2CSLV4_ADDR_REG 0X31 //IIC從機4器件地址寄存器 #define MPU_I2CSLV4_REG 0X32 //IIC從機4數據地址寄存器 #define MPU_I2CSLV4_DO_REG 0X33 //IIC從機4寫數據寄存器 #define MPU_I2CSLV4_CTRL_REG 0X34 //IIC從機4控制寄存器 #define MPU_I2CSLV4_DI_REG 0X35 //IIC從機4讀數據寄存器#define MPU_I2CMST_STA_REG 0X36 //IIC主機狀態寄存器 #define MPU_INTBP_CFG_REG 0X37 //中斷/旁路設置寄存器 #define MPU_INT_EN_REG 0X38 //中斷使能寄存器 #define MPU_INT_STA_REG 0X3A //中斷狀態寄存器#define MPU_ACCEL_XOUTH_REG 0X3B //加速度值,X軸高8位寄存器 #define MPU_ACCEL_XOUTL_REG 0X3C //加速度值,X軸低8位寄存器 #define MPU_ACCEL_YOUTH_REG 0X3D //加速度值,Y軸高8位寄存器 #define MPU_ACCEL_YOUTL_REG 0X3E //加速度值,Y軸低8位寄存器 #define MPU_ACCEL_ZOUTH_REG 0X3F //加速度值,Z軸高8位寄存器 #define MPU_ACCEL_ZOUTL_REG 0X40 //加速度值,Z軸低8位寄存器#define MPU_TEMP_OUTH_REG 0X41 //溫度值高八位寄存器 #define MPU_TEMP_OUTL_REG 0X42 //溫度值低8位寄存器#define MPU_GYRO_XOUTH_REG 0X43 //陀螺儀值,X軸高8位寄存器 #define MPU_GYRO_XOUTL_REG 0X44 //陀螺儀值,X軸低8位寄存器 #define MPU_GYRO_YOUTH_REG 0X45 //陀螺儀值,Y軸高8位寄存器 #define MPU_GYRO_YOUTL_REG 0X46 //陀螺儀值,Y軸低8位寄存器 #define MPU_GYRO_ZOUTH_REG 0X47 //陀螺儀值,Z軸高8位寄存器 #define MPU_GYRO_ZOUTL_REG 0X48 //陀螺儀值,Z軸低8位寄存器#define MPU_I2CSLV0_DO_REG 0X63 //IIC從機0數據寄存器 #define MPU_I2CSLV1_DO_REG 0X64 //IIC從機1數據寄存器 #define MPU_I2CSLV2_DO_REG 0X65 //IIC從機2數據寄存器 #define MPU_I2CSLV3_DO_REG 0X66 //IIC從機3數據寄存器#define MPU_I2CMST_DELAY_REG 0X67 //IIC主機延時管理寄存器 #define MPU_SIGPATH_RST_REG 0X68 //信號通道復位寄存器 #define MPU_MDETECT_CTRL_REG 0X69 //運動檢測控制寄存器 #define MPU_USER_CTRL_REG 0X6A //用戶控制寄存器 #define MPU_PWR_MGMT1_REG 0X6B //電源管理寄存器1 #define MPU_PWR_MGMT2_REG 0X6C //電源管理寄存器2 #define MPU_FIFO_CNTH_REG 0X72 //FIFO計數寄存器高八位 #define MPU_FIFO_CNTL_REG 0X73 //FIFO計數寄存器低八位 #define MPU_FIFO_RW_REG 0X74 //FIFO讀寫寄存器 #define MPU_DEVICE_ID_REG 0X75 //器件ID寄存器//如果AD0腳(9腳)接地,IIC地址為0X68(不包含最低位). //如果接V3.3,則IIC地址為0X69(不包含最低位). #define MPU_ADDR 0X68 //此為7位地址//因為模塊AD0默認接GND,所以轉為讀寫地址后,為0XD1和0XD0(如果接VCC,則為0XD3和0XD2) #define MPU_READ 0XD1 #define MPU_WRITE 0XD0uint8_t MPU_Init(void); //初始化MPU6050 uint8_t MPU_Read_Len(uint8_t reg, uint8_t len, uint8_t *buf); //IIC連續讀 uint8_t MPU_Write_Len(uint8_t reg, uint8_t len, uint8_t *buf); //IIC連續寫 uint8_t MPU_Write_Byte(uint8_t reg, uint8_t Data); //IIC寫一個字節 uint8_t MPU_Read_Byte(uint8_t reg); //IIC讀一個字節 uint8_t MPU_Write_Bit(uint8_t addr, uint8_t bitNum, uint8_t Data); //寫入8位寄存器的一個位 uint8_t MPU_Write_Bits(uint8_t addr, uint8_t bitStart, uint8_t length, uint8_t Data);//寫入8位寄存器的多個位 uint8_t MPU_Read_Bit(uint8_t addr, uint8_t bitNum, uint8_t *Data); //讀取一個位從8位器件的寄存器 uint8_t MPU_Read_Bits(uint8_t addr, uint8_t bitStart, uint8_t length, uint8_t *Data);//讀取8位寄存器的多個位uint8_t MPU_Set_Gyro_Fsr(uint8_t fsr); uint8_t MPU_Set_Accel_Fsr(uint8_t fsr); uint8_t MPU_Set_LPF(uint16_t lpf); uint8_t MPU_Set_Rate(uint16_t rate);int16_t MPU_Get_Temperature(void); uint8_t MPU_Get_Gyroscope(int16_t *gx, int16_t *gy, int16_t *gz); uint8_t MPU_Get_Accelerometer(int16_t *ax, int16_t *ay, int16_t *az);#define MPU_Refresh() MPU_Write_Byte(MPU_PWR_MGMT1_REG, 0X00) //喚醒MPU6050 void MPU_Delay_Ms(uint16_t Milliseconds); //移植時需修改#endifmain.c
#include <STC89C5xRC.H> #include "intrins.h" #include "stdint.h" #include "USART.h" #include "./MPU6050/MPU6050.h"void Delay1ms() //@11.0592MHz {unsigned char i, j;_nop_();i = 2;j = 199;do{while (--j);} while (--i); }void Delay_ms(int i) {while(i--)Delay1ms(); }void main(void) {int16_t aacx,aacy,aacz; //加速度傳感器原始數據int16_t gyrox,gyroy,gyroz; //陀螺儀原始數據int16_t temp; //溫度USART_Init(USART_MODE_1, Rx_ENABLE, STC_USART_Priority_Lowest, 11059200, 57600, DOUBLE_BAUD_ENABLE, USART_TIMER_1);MPU_Init(); while(1){ temp = MPU_Get_Temperature(); //得到溫度值MPU_Get_Accelerometer(&aacx, &aacy, &aacz); //得到加速度傳感器數據MPU_Get_Gyroscope(&gyrox, &gyroy, &gyroz); //得到陀螺儀數據printf("%d, %d, %d, %d, %d, %d, %d\r\n", aacx,aacy,aacz,gyrox,gyroy,gyroz,temp);} }實驗現象
輕輕轉動陀螺儀,可見數據隨之變化。
總結
以上是生活随笔為你收集整理的【51单片机快速入门指南】4.3: I2C读取MPU6050陀螺仪的原始数据的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Thread.sleep还是TimeUn
- 下一篇: 处理器虚拟化简介