MPU-6000 ( 605Q)为全球首例整合性6轴运动处理组件,相较于多组件方案,免除了组合陀螺仪鸟加速器时间轴之差的问题,减少了大量的封装空间。当连接到三轴磁强计时,MPU-60X0提供完整的9轴运动融合输出到其主I2C或SPI端口(SPI仅在MPU- 6000上可用)。
MPU6050的器件地址是0xD0,在官方的手册上给出的地址是0x68,但由于IIC的地址是7位,所以在用8位的字节方式表达时会有两种可能,
如果在低位补0,结果就是1101 0000, 如果高位补0,结果是0110 1000,所以才会有一个地址的两种表述。
使用I²C与MPU6050通信的原理是需要知道MPU6050的地址值,还有其内部各个寄存器的值,如此单片机便可通过I²C总线对MPU6050的各个寄存器进行读写操作,从而可以对MPU6050的各个功能进行设置,也可直接从相应的寄存器中读出
下面是MPU6050内部各个寄存器的地址值,以及相应的功能
#define MPU6050_RA_SMPLRT_DIV 0x19 ////////////////
#define MPU6050_RA_CONFIG 0x1A ////////////////
#define MPU6050_RA_GYRO_CONFIG 0x1B ////////////////
#define MPU6050_RA_ACCEL_CONFIG 0x1C ////////////////
#define MPU6050_RA_ACCEL_XOUT_H 0x3B
#define MPU6050_RA_ACCEL_XOUT_L 0x3C
#define MPU6050_RA_ACCEL_YOUT_H 0x3D
#define MPU6050_RA_ACCEL_YOUT_L 0x3E
#define MPU6050_RA_ACCEL_ZOUT_H 0x3F
#define MPU6050_RA_ACCEL_ZOUT_L 0x40
#define MPU6050_RA_TEMP_OUT_H 0x41
#define MPU6050_RA_TEMP_OUT_L 0x42
#define MPU6050_RA_GYRO_XOUT_H 0x43
#define MPU6050_RA_GYRO_XOUT_L 0x44
#define MPU6050_RA_GYRO_YOUT_H 0x45
#define MPU6050_RA_GYRO_YOUT_L 0x46
#define MPU6050_RA_GYRO_ZOUT_H 0x47
#define MPU6050_RA_GYRO_ZOUT_L 0x48
#define MPU6050_RA_PWR_MGMT_1 0x6B /////////////////////
#define MPU6050_RA_WHO_AM_I 0x75 /////////////////////
上面写出的是对应原始数据存储的寄存器,因为采样是有一个16位的ADC转换器,因此每个数据都是16位的,其中0x41、0x42对应的寄存器存储的数据没有用,读取可以忽略。
存储函数如下:
void MPU6050_READ(u16* n){ //读出X、Y、Z三轴加速度/陀螺仪原始数据 //n[0]是AX,n[1]是AY,n[2]是AZ,n[3]是GX,n[4]是GY,n[5]是GZ
u8 i;
u8 t[14];
I2C_READ_BUFFER(MPU6050_ADD, MPU6050_RA_ACCEL_XOUT_H, t, 14); //读出连续的数据地址,包括了加速度和陀螺仪共12字节
for(i=0; i<3; i++) //整合加速度
n[i]=((t[2*i] << 8) + t[2*i+1]);
for(i=4; i<7; i++) //整合陀螺仪
n[i-1]=((t[2*i] << 8) + t[2*i+1]);
}
上面忽略了两个数据的读取。
初始化函数如下:
void MPU6050_Init(void){ //初始化MPU6050
I2C_SAND_BYTE(MPU6050_ADD,MPU6050_RA_PWR_MGMT_1,0x80);//解除休眠状态
delay_ms(1000); //等待器件就绪
I2C_SAND_BYTE(MPU6050_ADD,MPU6050_RA_PWR_MGMT_1,0x00);//解除休眠状态
I2C_SAND_BYTE(MPU6050_ADD,MPU6050_RA_SMPLRT_DIV,0x07);//陀螺仪采样率
I2C_SAND_BYTE(MPU6050_ADD,MPU6050_RA_CONFIG,0x06);
I2C_SAND_BYTE(MPU6050_ADD,MPU6050_RA_ACCEL_CONFIG,0x00);//配置加速度传感器工作在16G模式
I2C_SAND_BYTE(MPU6050_ADD,MPU6050_RA_GYRO_CONFIG,0x18);//陀螺仪自检及测量范围,典型值:0x18(不自检,2000deg/s)
}
通过相应配置寄存器的位,便可实现陀螺精度(测定的范围)的设定,设置见下表:
其中要配置寄存器的哪些位以及对应位的取值范围如下图:
加速度精度(测定的范围)的设定,设置见下表:
其中要配置寄存器的哪些位以及对应位的取值范围如下图:
如此便可理解下面
I2C_SAND_BYTE(MPU6050_ADD,MPU6050_RA_ACCEL_CONFIG,0x00);//配置加速度传感器工作在2G模式
I2C_SAND_BYTE(MPU6050_ADD,MPU6050_RA_GYRO_CONFIG,0x18);//陀螺仪自检及测量范围,典型值:
如此便实现了相应寄存器的配置,注意范围越大,精度越小。
部分图片出自洋桃电子,仅用于学习目的。