您的位置:首页 > 产品设计 > UI/UE

MPU6050原始数据的获取

2018-02-12 15:32 141 查看
MPU6050采用IIC通讯,IIC通讯的结构如下图



      IIC 即Inter-Integrated Circuit(集成电路总线),这种总线类型是由飞利浦半导体公司在八十年代初设计出来的一种简单、双向、二线制、同步串行总线,主要是用来连接整体电路(ICS) ,IIC是一种多向控制总线,也就是说多个芯片可以连接到同一总线结构下,同时每个芯片都可以作为实时数据传输的控制源。这种方式简化了信号传输总线接口。

       IIC总线一共有四根线,分别是VCC,GND,SCL,SDA。SCL的为时钟线,SDA为数据线。I2C总线上的主设备与从设备之间以字节(8位)为单位进行双向的数据传输。

[align=left]       IIC发送数据是8位数据(即8个0或1)为一个小单元一起发送。整个协议发送的顺序如下:[/align][align=left]     [/align][align=left]   [/align][align=left]主发从收:主机发送  START 信号-> 主机发送地址 -> 从机发送ACK应答 -> (主机发送数据 -> 从机发送ACK应答 (循环)) -> 主机发送STOP信号 或 主机发送 START 信号启动下一次传输 [/align][align=left]
[/align][align=left]主收从发:主机发送 START 信号-> 从机发送发地址 -> 主机发送ACK应答 -> (从机发送数据 -> 主机发送ACK应答 (循环)) -> 接受至最后一个字节时,主机发送NACK -> 主机发送 STOP 信号或 主机发送START信号 启动下一次传输 。[/align]

[align=left][/align]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轴旋转的角速度低八位[align=left]
[/align]接下来就是读出这些数据

[align=left]
[/align][align=left]
[/align][align=left]接线方式 [/align][align=left]  
       MPU6050                       Arduino uno
         VCC               ——             3.3V/5V
         GND              ——             GND
         SCL                ——             SCL
         SDA               ——             SDA

[/align]
[align=left]以下是在ARDUINO上面具体实现代码   [/align][align=left]在Arduino ide 1.81版本编译通过[/align]
[align=left]
[/align][align=left]  [/align][align=left]#include <Wire.h>[/align]
#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

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Arduino MPU6050 IIC
相关文章推荐