1. 程式人生 > >MPU6050原始資料的獲取

MPU6050原始資料的獲取

MPU6050採用IIC通訊,IIC通訊的結構如下圖


IIC 即Inter-Integrated Circuit(積體電路匯流排),這種匯流排型別是由飛利浦半導體公司在八十年代初設計出來的一種簡單、雙向、二線制、同步序列匯流排,主要是用來連線整體電路(ICS) ,IIC是一種多向控制匯流排,也就是說多個晶片可以連線到同一匯流排結構下,同時每個晶片都可以作為實時資料傳輸的控制源。這種方式簡化了訊號傳輸匯流排介面。

       IIC匯流排一共有四根線,分別是VCC,GND,SCL,SDA。SCL的為時鐘線,SDA為資料線。I2C總線上的主裝置與從裝置之間以位元組(8位)為單位進行雙向的資料傳輸。

       IIC
傳送資料是8位資料(即8個0或1)為一個小單元一起傳送。整個協議傳送的順序如下:
主發從收:主機發送  START 訊號-> 主機發送地址 -> 從機發送ACK應答 -> (主機發送資料 -> 從機發送ACK應答 (迴圈)) -> 主機發送STOP訊號 或 主機發送 START 訊號啟動下一次傳輸主收從發:主機發送 START 訊號-> 從機發送發地址 -> 主機發送ACK應答 -> (從機發送資料 -> 主機發送ACK應答 (迴圈)) -> 接受至最後一個位元組時,主機發送NACK -> 主機發送 STOP 訊號或 主機發送START訊號 啟動下一次傳輸 。

MPU6050資料在暫存器中的地址:

0x3B,加速度計的X軸分量高八位
0x3C,加速度計的X軸分量低八位
0x3D,加速度計的Y軸分量高八位
0x3E,加速度計的Y軸分量低八位
0x3F,加速度計的Z軸分量高八位
0x40,加速度計的Z軸分量高八位
0x41,當前溫度TEMP高八位
0x42,當前溫度TEMP低八位
0x43,繞X軸旋轉的角速度高八位
0x44,繞X軸旋轉的角速度低八位
0x45,繞Y軸旋轉的角速度高八位
0x46,繞Y軸旋轉的角速度低八位
0x47,繞Z軸旋轉的角速度高八位
0x48,繞Z軸旋轉的角速度低八位

接下來就是讀出這些資料

接線方式   
       MPU6050                       Arduino uno
         VCC               ——             3.3V/5V
         GND              ——             GND
         SCL                ——             SCL
         SDA               ——             SDA

以下是在ARDUINO上面具體實現程式碼   在Arduino ide 1.81版本編譯通過
#include <Wire.h>




#define        ACCEL_XOUT_H                0x3B
#define        ACCEL_XOUT_L                0x3C
#define        ACCEL_YOUT_H                0x3D
#define        ACCEL_YOUT_L                0x3E
#define        ACCEL_ZOUT_H                0x3F
#define        ACCEL_ZOUT_L                0x40

#define        TEMP_OUT_H                0x41
#define        TEMP_OUT_L                0x42

#define        GYRO_XOUT_H                0x43
#define        GYRO_XOUT_L                0x44
#define        GYRO_YOUT_H                0x45
#define        GYRO_YOUT_L                0x46
#define        GYRO_ZOUT_H                0x47
#define        GYRO_ZOUT_L                0x48

unsigned char  DATA_H, DATA_L;
//float ax,ay,az,gx,gy,gz,temp;
void setup() {

  Wire.begin();
  Serial.begin(9600);
  delay(10);
  MPU6050Reset();

}



void loop() {
  mpu6050_TEMP_OUT_data();
  mpu6050_ACCEL_X_data(); 
mpu6050_ACCEL_Y_data(); 
mpu6050_ACCEL_Z_data();
  mpu6050_GYRO_X_data(); 
mpu6050_GYRO_Y_data(); 
mpu6050_GYRO_Z_data() ;

  
 
  Serial.print("  ACCEL_X  "); Serial.print(mpu6050_ACCEL_X_data()); Serial.print(",");
  Serial.print("  ACCEL_Y   "); Serial.print(mpu6050_ACCEL_Y_data()); Serial.print(",");
  Serial.print("  ACCEL_Z  "); Serial.print(mpu6050_ACCEL_Z_data()); Serial.print(",");
  Serial.print("  GYRO_X  "); Serial.print(mpu6050_GYRO_X_data()); Serial.print(",");
  Serial.print("  GYRO_Y  "); Serial.print(mpu6050_GYRO_Y_data()); Serial.print(",");
  Serial.print("  GYRO_Z  "); Serial.print(mpu6050_GYRO_Z_data()); Serial.print(",");
  Serial.print("  TEMP_OUT  ");Serial.print(mpu6050_TEMP_OUT_data());
  Serial.println();




}




void MPU6050Write(unsigned char adr, unsigned char dat)
{

  Wire.beginTransmission(0x68); //開啟MPU6050的傳輸
  Wire.write(adr); //指定暫存器地址
  Wire.write(dat); //寫入一個位元組的資料
  Wire.endTransmission(true); //結束傳輸,true表示釋放匯流排
}
void MPU6050Reset()
{
  MPU6050Write(0x6B, 0x00);
  MPU6050Write(0x19, 0x07);
  MPU6050Write(0x1A, 0x06);
  MPU6050Write(0x1B, 0x18); //2000
  MPU6050Write(0x1C, 0x10); //4g
  /*暫存器的設定參考此文章http://blog.sina.com.cn/s/blog_8240cbef01018i10.html  */
}

unsigned char ReadMPUReg(int nReg) {
  Wire.beginTransmission(0x68);
  Wire.write(nReg);
  Wire.requestFrom(0x68, 1, true);
  Wire.endTransmission(true);
  return Wire.read();
}

//讀 加速度計X軸 資料
 int mpu6050_ACCEL_X_data()
{
  DATA_H = ReadMPUReg(ACCEL_XOUT_H);
  DATA_L = ReadMPUReg(ACCEL_XOUT_L);
 
  return (DATA_H << 8) + DATA_L; 
 
}
//讀 加速度計Y軸 資料
 int mpu6050_ACCEL_Y_data()
{
  DATA_H = ReadMPUReg(ACCEL_YOUT_H);
  DATA_L = ReadMPUReg(ACCEL_YOUT_L);
  return (DATA_H << 8) + DATA_L;
}
//讀 加速度計Z軸 資料
 int mpu6050_ACCEL_Z_data()
{
  DATA_H = ReadMPUReg(ACCEL_ZOUT_H);
  DATA_L = ReadMPUReg(ACCEL_ZOUT_L);
  return (DATA_H << 8) + DATA_L;
}
//讀 陀螺儀計X軸 資料
 int mpu6050_GYRO_X_data()
{
  DATA_H = ReadMPUReg(GYRO_XOUT_H);
  DATA_L = ReadMPUReg(GYRO_XOUT_L);
  return (DATA_H << 8) + DATA_L;
}
//讀 陀螺儀計Y軸 資料
 int mpu6050_GYRO_Y_data()
{
  DATA_H = ReadMPUReg(GYRO_YOUT_H);
  DATA_L = ReadMPUReg(GYRO_YOUT_L);
  return (DATA_H << 8) + DATA_L;
}
//讀 陀螺儀計Z軸 資料
 int mpu6050_GYRO_Z_data()
{
  DATA_H = ReadMPUReg(GYRO_ZOUT_H);
  DATA_L = ReadMPUReg(GYRO_ZOUT_L);
  return (DATA_H << 8) + DATA_L;
}
//讀 溫度 資料
 int mpu6050_TEMP_OUT_data()
{
  DATA_H = ReadMPUReg(TEMP_OUT_H);
  DATA_L = ReadMPUReg(TEMP_OUT_L);
  return (DATA_H << 8) + DATA_L;
}



//by Sunlife  

在ide裡面選擇串列埠監視器可以看見資料

波特率設為9600