我要成为MPU6050膏手

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时钟 为低电平时进行,除了开始和结束标志

寄存器的写

image-20241102103203341

如果要写MPU-60X0寄存器,主设备除了发出开始标志(S)和地址位,还要加一个 R/W 位,0为写1为读。在第9个时钟周期(高电平时),MPU-60X0产生应答信号。然 后主设备开始传送寄存器地址(RA),接到应答后,开始传送寄存器数据,然后仍然要有应 答信号,依次类推

image-20241102103625405

单字节写入如上

image-20241102103635324

多字节写入如上

寄存器的读

如果要读取MPU-60X0寄存器的值,首先由主设备产生开始信号(S),然后发送从设备地址位和一个写数据位,然后发送寄存器地址,才能开始读寄存器。紧接着,收到应答信号后,主设备再发一个开始信号,然后发送从设备地址位和一个读数据位。然后,作为从设 备的MPU-60X0产生应答信号并开始发送寄存器数据。通信以主设备产生的拒绝应答信号 (NACK)和结束标志(P)结束。拒绝应答信号(NACK)产生定义为SDA数据在第9个 时钟周期一直为高

image-20241102104447148

实际上是否连续读写取决于主机给slave的应答为NACK还是ACK

怎么读寄存器的连续数据??

MPU6050的加速度计和陀螺仪数据寄存器的地址是连续的,因为每个轴的数据通常以16位(两个字节)的格式存储。具体来说,X、Y、Z三个轴的加速度数据(AX、AY、AZ)、角速度数据(GX、GY、GZ)都在一组连续的寄存器中

对于加速度AX AY AZ

可以直接读取连续地址 0x3B 到 0x40

对于角速度 GX GY GZ

可以直接读取连续地址 0x430x48

代码部分(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

posted on   Stramazzy  阅读(58)  评论(0编辑  收藏  举报

相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5
点击右上角即可分享
微信分享提示