STM32学习100步之第八十九步-第九十一步——加速度传感器MPU6050

MPU6050传感器

MPU-6000 ( 605Q)为全球首例整合性6轴运动处理组件,相较于多组件方案,免除了组合陀螺仪鸟加速器时间轴之差的问题,减少了大量的封装空间。当连接到三轴磁强计时,MPU-60X0提供完整的9轴运动融合输出到其主I2C或SPI端口(SPI仅在MPU- 6000上可用)。

MPU6050封装如下:

STM32学习100步之第八十九步-第九十一步——加速度传感器MPU6050_第1张图片

其模块化PCB板以及引脚定义:

STM32学习100步之第八十九步-第九十一步——加速度传感器MPU6050_第2张图片
STM32学习100步之第八十九步-第九十一步——加速度传感器MPU6050_第3张图片

具体6轴旋转示意图如下:

STM32学习100步之第八十九步-第九十一步——加速度传感器MPU6050_第4张图片

MPU6050使用I²C总线和单片机通信

MPU6050的器件地址是0xD0,在官方的手册上给出的地址是0x68,但由于IIC的地址是7位,所以在用8位的字节方式表达时会有两种可能,
如果在低位补0,结果就是1101 0000, 如果高位补0,结果是0110 1000,所以才会有一个地址的两种表述。

在STM32硬件I2C的时候要用地址0xD0。

使用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)
}

下图是各个寄存器对应的数据手册图:
STM32学习100步之第八十九步-第九十一步——加速度传感器MPU6050_第5张图片
STM32学习100步之第八十九步-第九十一步——加速度传感器MPU6050_第6张图片
在这里插入图片描述

通过相应配置寄存器的位,便可实现陀螺精度(测定的范围)的设定,设置见下表:
其中要配置寄存器的哪些位以及对应位的取值范围如下图:
在这里插入图片描述
STM32学习100步之第八十九步-第九十一步——加速度传感器MPU6050_第7张图片

加速度精度(测定的范围)的设定,设置见下表:
其中要配置寄存器的哪些位以及对应位的取值范围如下图:
在这里插入图片描述
STM32学习100步之第八十九步-第九十一步——加速度传感器MPU6050_第8张图片
如此便可理解下面

	I2C_SAND_BYTE(MPU6050_ADD,MPU6050_RA_ACCEL_CONFIG,0x00);//配置加速度传感器工作在2G模式
	I2C_SAND_BYTE(MPU6050_ADD,MPU6050_RA_GYRO_CONFIG,0x18);//陀螺仪自检及测量范围,典型值:

如此便实现了相应寄存器的配置,注意范围越大,精度越小。
部分图片出自洋桃电子,仅用于学习目的。

你可能感兴趣的:(STM32学习100步之第八十九步-第九十一步——加速度传感器MPU6050)