MPU6050理论部分
[参考视频链接(bilibili)](用人话告诉你 mpu6050 电子陀螺芯片怎么使用_哔哩哔哩_bilibili)
6050的各个地址
#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_PWR 0x6b //电源
#define MPU6050_SMPLRT_DIV 0x19 //取样时钟
#define MPU6050_CONFIG 0x1a //低通滤波
#define MPU6050_GYRO_CONFIG 0x1b //陀螺仪量程(bit3,4)(0-250,1-500,2-1000,3-2000)
#define MPU6050_ACCEL_CONFIG 0x1c //加速度计量程(bit3,4)(0-2g,1-4g,2-8g,3-16g)
#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
6050可以获取的数据
6050总共可以获得七项数据,分别为
- 俯仰角(pitch),偏航角(roll),横滚角(yaw)加速度
- X,Y,Z轴旋转角速度
- 温度
DMP
6050内含数字运动处理器(Digital Motion Processor),输出4个值,可以简单处理后获得加速度和角速度值运算出三个角
DMP采样率、输出率不能超过200Hz
数据输出方式
通常使用IIC,注意IIC虽然可以通过设备地址挂载很多设备,但是如果设备越多、高频信号越多,则会出现信号堵塞的现象,建议高频信号额外开一路IIC
FIFO
当数据采集过快导致设备之间信息不同步时,数据缓存在FIFO,芯片可通过读取FIFO解决数据不同步的问题
使用6050的i2c通信
6050的i2c地址为 0x68
I2C 的数据字节定义为8-bits长度,对每次传送的总字节数量没有限制。对每一次传输 必须伴有一个应答(ACK)信号,其时钟由主设备提供,而真正的应答信号由从设备发出, 在时钟为高时,通过拉低并保持SDA的值来实现。如果从设备忙,它可以使SCL保持在低电平,这会强制使主设备进入等待状态。当从 设备空闲后,并且释放时钟线,原来的数据传输才会继续。
开始标志(S)发出后,主设备会传送一个7位的Slave地址(实际上就是从机地址),并且后面跟着一个第8 位,称为Read/Write位。R/W位表示主设备是在接受从设备的数据还是在向其写数据。然 后,主设备释放SDA线,等待从设备的应答信号(ACK)。每个字节的传输都要跟随有一 个应答位。应答产生时,从设备将SDA线拉低并且在SCL为高电平时保持低。数据传输总 是以停止标志(P)结束,然后释放通信线路。然而,主设备也可以产生重复的开始信号去 操作另一台从设备,而不发出结束标志。综上可知,所有的SDA信号变化都要在SCL时钟 为低电平时进行,除了开始和结束标志
寄存器的写
如果要写MPU-60X0寄存器,主设备除了发出开始标志(S)和地址位,还要加一个 R/W 位,0为写,1为读。在第9个时钟周期(高电平时),MPU-60X0产生应答信号。然 后主设备开始传送寄存器地址(RA),接到应答后,开始传送寄存器数据,然后仍然要有应 答信号,依次类推
单字节写入如上
多字节写入如上
寄存器的读
如果要读取MPU-60X0寄存器的值,首先由主设备产生开始信号(S),然后发送从设备地址位和一个写数据位,然后发送寄存器地址,才能开始读寄存器。紧接着,收到应答信号后,主设备再发一个开始信号,然后发送从设备地址位和一个读数据位。然后,作为从设 备的MPU-60X0产生应答信号并开始发送寄存器数据。通信以主设备产生的拒绝应答信号 (NACK)和结束标志(P)结束。拒绝应答信号(NACK)产生定义为SDA数据在第9个 时钟周期一直为高
实际上是否连续读写取决于主机给slave的应答为NACK还是ACK
怎么读寄存器的连续数据??
MPU6050的加速度计和陀螺仪数据寄存器的地址是连续的,因为每个轴的数据通常以16位(两个字节)的格式存储。具体来说,X、Y、Z三个轴的加速度数据(AX、AY、AZ)、角速度数据(GX、GY、GZ)都在一组连续的寄存器中
对于加速度AX AY AZ:
可以直接读取连续地址 0x3B 到 0x40
对于角速度 GX GY GZ:
可以直接读取连续地址 0x43 到 0x48
代码部分(hal)
先前讲到mpu6050的地址为0x68。但是在发送AD + W的时候发送的内容并非为0x68
对于地址0x68,其为七位地址(110 1000,在左侧补零即为0110 1000),后跟随一位读写位组成一个数据帧,即:
当写入6050的时候,主机呼叫的地址为 1101 0000 转化为16进制则为 0xD0
当读入6050的时候,主机呼叫的地址为 1101 0001 转化为16进制则为 0xD1
在hal库当中只需要定义0x68并且左移一位即可,其余的读写更改操作hal库会帮忙完成
定义6050的地址
#define MPU6050_READ_ADD 0xD1
#define MPU6050_WRITE_ADD 0xD0
标签:膏手,MPU6050,我要,地址,RA,寄存器,设备,define
From: https://www.cnblogs.com/Stramazing/p/18541338