MPU6050简介

MPU6050

MPU6050是一个6轴姿态传感器,可以测量芯片自身X、Y、Z轴的加速度、角速度参数,通过数据融合,可进一步得到姿态角,常应用于平衡车、飞行器等需要检测自身姿态的场景

3轴加速度计(Accelerometer):测量X、Y、Z轴的加速度

3轴陀螺仪传感器(Gyroscope):测量X、Y、Z轴的角速度

6轴:3轴加速度,3轴角加速度

9轴:3轴加速度,3轴角加速度,3轴磁场强度

10轴:  3轴加速度,3轴角加速度,3轴磁场强度,一个气压强度

加速度计测量的是加速度(可以看作测力计,根据牛顿第二定律F=ma可以计算加速度),加速度计具有静态稳定性,不具有动态稳定性

MPU6050的陀螺仪测量的是角速度,角度可以通过角速度积分得到,具有动态稳定性,不具有静态稳定性

  1. MPU6050参数:
  • 16位ADC采集传感器的模拟信号,量化范围:-32768~32767

  • 加速度计满量程选择:±2、±4、±8、±16(g|9.8m/s2)
  • 陀螺仪满量程选择: ±250、±500、±1000、±2000(°/sec)

  • 可配置的数字低通滤波器
  • 可配置的时钟源
  • 可配置的采样分频

  • I2C从机地址:1101000(AD0=0)     1101001(AD0=1)

若从中间拆开,110 1000十六进制就是0x68,

发送第一个字节时将(0x68<<1) | 0/1,  0xD0/0xD1;

所以I2C的从机地址有两种说法:

0x68是直接把7位地址转换16进制得到的

0xD0是 融入了读写位的从机地址     

  1. MPU6050硬件电路:

LDO:低压差线性稳压器

CON1:八针的排针

引脚:            

  1. VCC、GND      
  2. SCL、SDA
  3. XCL、XDA
  4. AD0
  5. INT

功能:

  1. 电源

  1. I2C通信引脚(内置了两个4.7K的电阻,已经为弱上拉模式,所以可直接接GPIO,不用添加电阻)
  2. 主机I2C通信引脚

通常可外接磁力计和气压计,弥补6轴功能不全的情况,同时MPU6050的主机接口可以直接访问这些拓展芯片的数据,在MPU6050里有DMP单元,会进行数据融合·和姿态解算

  1. 从机地址最低位

1101000 / 1101001

图中可以看到AD0接电阻默认下拉到低电平了,若引脚悬空,就是低电平。若想置高电平,就把AD0直接引到VCC,强上拉至高电平

  1. 中断信号输出

配置芯片内部的一些事件,来触发中断引脚的输出

LDO是电源供电的逻辑,MPU6050的芯片VDD供电是2.375~3.46V,属于3.3V供电的设备,不能直接接5V,所以接入了一个3.3V的稳压器,电源(5V)可在3.3V到5V之间给芯片端供电

LED是电源指示灯。

MPU6050的模块框图:

灰色部分是芯片内部的传感器,包括XYZ轴的加速度计和陀螺仪,还内置了一个温度传感器,每个传感器前面都有一个自测单元,是用来验证芯片好坏的

Charge Pump:是一个电荷泵,进行升压,因为陀螺仪内部是需要一个高电压支持的。

右边的部分是寄存器和通信接口部分了。

寄存器

Interrupt Status Register(中断状态寄存器):可控制内部的哪些事件到中断引脚的输出。

FIFo(先入先出寄存器):可对数据流进行缓存,

Config Register (配置寄存器):可以对内部的各个电路进行配置。

Sensor Register(传感器寄存器):也就是数据寄存器,存储了各个传感器的数据

Factory Calibration (工厂校准):内部的传感器都进行了校准

Digital Motion Processor(DMP):数字运动处理器,简称DMP,是芯片内部自带的一个姿态解算的硬件算法,配合官方的DMP库,可以进行姿态解算。

通信接口

上面的8,9,23,24是从机的I2C和SPI通信接口,用于和STM32通信;下面的6,7是主机的I2C和SPI接口,用于和MPU6050拓展的设备进行通信。

  1. 寄存器表格:

第一列:Register Adress (十六进制/HEX)

第二列:Register Adress(十进制)

第三列:Register Name(寄存器名称)

第四列:读写权限,RW代表可读可写,R代表可读,W可写

后面的是寄存器内每一位的名字。

以下是黄色标识寄存器的名字(十进制的排序):

每个寄存器都是八位。

  1. 采样频率分频器

八位为一个整体作为分频值,这个寄存器可以配置采样频率的分频系数,简单来说就是分频越小,内部AD转换就越快,数据寄存器刷新就越快

  1. 配置寄存器

内部有两部分:外部同步设置低通滤波器配置,配置滤波器的参数越大,输出数据抖动就越小,0是不使用滤波器,陀螺仪时钟为8KHz,使用了滤波器陀螺仪时钟为1KHz

  1. 陀螺仪寄存器

高三位是XYZ轴的自测使能位中间两位满量程选择位,后三位没用到

  1. 加速度计寄存器

   高三位是XYZ轴的自测使能位中间两位满量程选择位

   低三位是用来配置高通滤波器(内置小功能,运动检测用的对输出没用影响)

下面三行中 _L表示低八位,_H表示高八位

59~64. 加速度计的XYZ轴的数据寄存器

       想读取数据的话,就读取数据寄存器就行,这是一个16位的有符号数以二进制补码的方式存储,读出高八位和低八位,高位左移八次 或逻辑上 低位数据,最后在存在一个uint16_t的变量里,就能得到数据了

65~66. 温度传感器数据寄存器

       和加速度计一样操作方法

67~72. 陀螺仪XYZ轴的数据寄存器

       同上

107~108. 电源管理寄存器1、2

电源管理寄存器1:

第1位(最高位Bit7)设备复位,置1所有寄存器恢复到默认值

第2位 睡眠模式,置1,芯片睡眠/不工作,进入低功耗

第3位 循环模式,置1,设备进入低功耗,过一段时间启动一次

第4位 空

第5位 温度传感器失能,置1,禁用内部的温度传感器

最后三位 用来选择系统时钟来源

117. 器件的ID号(我是谁)

     只读,中间六位固定110100,最高位和最低位都是0,I2C地址0x68

  • 2
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
这段程序是用于初始化 MPU6050 传感器的函数。下面是对程序的逐行解释: 1. `u8 MPU6050_Init(void)`:定义了一个返回类型为 `u8` 的函数 `MPU6050_Init`,没有传入参数。 2. `u8 res;`:定义了一个变量 `res`,类型为 `u8`,用于存储返回值。 3. `IIC_Init();`:调用函数 `IIC_Init()`,用于初始化 IIC 总线。 4. `MPU6050_Write_Byte(MPU6050_PWR_MGMT1_REG,0X80);`:向 MPU6050 的控制寄存器 `MPU6050_PWR_MGMT1_REG` 写入数据 `0X80`,将传感器从休眠状态唤醒。 5. `delay_ms(100);`:延时 100 毫秒。 6. `MPU6050_Write_Byte(MPU6050_PWR_MGMT1_REG,0X00);`:向控制寄存器写入数据 `0X00`,将传感器设置为正常工作模式。 7. `MPU6050_Set_Gyro_Fsr(3);`:设置陀螺仪的量程为 2000°/s。 8. `MPU6050_Set_Accel_Fsr(0);`:设置加速度计的量程为 2g。 9. `MPU6050_Set_Rate(50);`:设置采样率为 50Hz。 10. `MPU6050_Write_Byte(MPU6050_INT_EN_REG,0X00);`:禁用 MPU6050 的中断功能。 11. `MPU6050_Write_Byte(MPU6050_USER_CTRL_REG,0X00);`:配置 MPU6050 的用户控制寄存器。 12. `MPU6050_Write_Byte(MPU6050_FIFO_EN_REG,0X00);`:禁用 MPU6050 的 FIFO 缓冲区。 13. `MPU6050_Write_Byte(MPU6050_INTBP_CFG_REG,0X80);`:配置 MPU6050 的中断/旁路寄存器。 14. `res=MPU6050_Read_Byte(MPU6050_DEVICE_ID_REG);`:从 MPU6050 设备 ID 寄存器中读取数据,并将其赋值给变量 `res`。 15. `if(res==MPU6050_ADDR)`:如果变量 `res` 的值等于 `MPU6050_ADDR`,执行下面的代码块。 16. `MPU6050_Write_Byte(MPU6050_PWR_MGMT1_REG,0X01);`:向控制寄存器写入数据 `0X01`,设置传感器为唤醒状态。 17. `MPU6050_Write_Byte(MPU6050_PWR_MGMT2_REG,0X00);`:配置传感器的电源管理 2 寄存器。 18. `MPU6050_Set_Rate(50);`:再次设置采样率为 50Hz。 19. `else return 1;`:如果变量 `res` 的值不等于 `MPU6050_ADDR`,返回值为 1,并结束函数。 20. `return 0;`:返回值为 0,表示初始化成功。 这个函数的作用是初始化 MPU6050 传感器,并返回一个状态值,0 表示初始化成功,1 表示初始化失败。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值