MPU6050简介

MPU6050

MPU6050简介

在这里插入图片描述

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

欧拉角就是飞机机身相对于初始3个轴的夹角

  • 飞机机头下倾或上仰,这个轴的夹角叫做俯仰,Pitch
  • 飞机机身左翻滚或者右翻滚,这个轴的夹角叫做滚转,Roll
  • 飞机机身保持水平,机头向左转向或者向右转向,这个轴的夹角叫做偏航,Yaw

欧拉角就表达了飞机此时的姿态,飞机是上仰还是下倾,向左倾斜还是向右倾斜,通过欧拉角都能清晰地表示出来。

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

水平的虚线是感应轴线,中间是一个具有一定质量、可以左右滑动的小滑块,然后左右各有一个弹簧顶着它,可以想象的到,如果我们把这个东西拿在手上,来回晃,中间这个小滑块就会左右移动,去压缩或拉伸两边的弹簧,当滑块移动时,就会带动上面的电位器滑动,电位器起始就是一个分压电阻, 然后我们测量电位器输出的电压,就能得到小滑块所受的加速度值了,这个加速度计,实际上就是一个弹簧测力计,根据牛顿第二定律,F=ma,我们像测量这个加速度a,就可以找一个单位质量的物体,测量它所受的力F,就行了。

在芯片中,XYZ3个轴,分别都有这样一个测力计。这里还可以这样理解,可以想象一下,这个芯片里面,有6个测力的秤,组成一个正方体,然后正方体内部,放置一个大小正好的单位质量小球,这个小球压在哪个秤面上,就会产生对应一个轴的数据输出,比如小球压Z轴方向的下面这个面,就是Z轴的正值,小球压Z轴方向的上面这个面,就是Z轴的负值。对向的两个面一组,一面为正值,一面为负值,那正方体6个面所测的力就是3个轴的加速度值。

比如你把芯片水平放在地球上,那就只有底面测力计收到小球的压力,所以此时数据输出就是XY轴输出为0,Z轴输出1个g的加速度值,,如果此时芯片正处于自由落体,那就是所有面都不受力,此时XYZ轴的数据输出都为0,如果芯片此时向左倾斜放置,那就是底面和左面都受力。

在这里插入图片描述

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

绕Z轴的角度,也就是偏航角,它的漂移无法通过加速度计进行修正。

在这里插入图片描述

加速度计、陀螺仪、磁力计,任何一种传感器都不能获得精确且稳定的欧拉角,要想获得精确且稳定的欧拉角,就必须进行数据融合,把这几种传感器的数据结合起来,综合多种传感器的数据,去长补短,这样才能获得精确且稳定的欧拉角,常见的数据融合算法,一般有互补滤波、卡尔曼滤波等。

如果在芯片里再集成一个3轴的磁场传感器,测量XYZ的磁场强度,那就叫做9轴姿态传感器,如果再集成一个气压传感器,测量气压大小,那就叫做10轴姿态传感器,一般气压值反映的是高度信息,海拔越高,气压越低,所以气压计是单独测量垂直地面的高度信息的。

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

9轴:3轴加速度、3轴角速度和3轴磁场强度

10轴:3轴加速度、3轴角速度、3轴磁场强度和1个气压强度

MPU6050参数

  • 16位ADC采集传感器的模拟信号,量化范围:-32768~32767(16位有符号数,会分为两个字节进行存储),对各个模拟参量进行量化。

  • 加速度计满量程选择:±2、±4、±8、±16(g 重力加速度)(16位AD值达到最大时,对应的物理量具体是多少,由满量程范围决定)

  • 陀螺仪满量程选择: ±250、±500、±1000、±2000(°/sec 角速度)

满量程选的越小,测量分辨率越高。

满量程选的越大,测量范围越大。

  • 可配置的数字低通滤波器(输出数据抖动太剧烈,就可以加一点低通滤波,使输出变得平缓一些)

  • 可配置的时钟源

  • 可配置的采样分频(时钟源通过分频器的分频,可以为AD转换和内部其他电路提供时钟,控制分频系数,就可以控制AD转换的快满了)

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

从机地址,在程序中用16进制表示的话,一般会有两种表示方式,以1101 000为例

  • 单纯把这7位二进制数转换为16进制 110 1000 -> 0x68,把0x68当作从机地址,在发送第一个字节时,要先把0x68左移1位,再按位或上读写位,读1写0
  • 把0x68左移1位后的数据,当作从机地址,0x68左移1位之后,是0xD0,把0xD0当作从机地址,这种表示方式,是把读写位也融入到从机地址里了,0xD0是写地址,0xD1是读地址

硬件电路

供电逻辑

  • MPU6050芯片的VDD供电是2.375~3.46V,属于3.3V供电的设备,不能直接接5V,所以为了扩大供电的范围,就加了个3.3V的稳压器,输入端电压VCC_5V可以在3.3V到5V之间,然后经过3.3V的稳压器,输出稳定的3.3V电压,给芯片端供电。
  • 只要3.3V有电,电源指示灯就会亮起。

在这里插入图片描述

引脚功能
VCC、GND电源
SCL、SDAI2C通信引脚
XCL、XDA主机I2C通信引脚
AD0从机地址最低位
INT中断信号输出

引脚定义

  • SCL和SDA,模块已经内置了两个4.7K的上拉电阻,所以直接把SCL和SDA接在GPIO口即可,不需要额外接上拉电阻。
  • XCL和XDA,对模块进行扩展,通常用于外接磁力计或者气压计,MPU6050的主机接口可以直接访问这些扩展芯片的数据,把这些扩展芯片的数据读取到MPU6050里面,在MPU6050中有DMP单元,进行数据融合和姿态解算。
  • AD0 从机地址最低位 (内置了一个下拉电阻,默认弱下拉到低电平)
    • 接低电平 7位从机地址就是 1101000 (引脚悬空的话就是电平)
    • 接高电平 7位从机地址就是 1101001 (可以将AD0直接引到VCC,强上拉至高电平)
  • INT 可以配置芯片内部的一些事件,来触发中断引脚的输出,比如数据准备完毕,I2C主机错误等。

内部框图

在这里插入图片描述

  • 经过ADC转换完成后,这些传感器的数据统一都放到数据寄存器中,我们读取数据寄存器就能得到传感器测量的值了,MPU6050内部的转换,都是全自动进行的。
  • 自测单元,用于检测芯片好坏。
  • 电荷泵,需要外接一个电容,升压电路。
  • Interrupt Status Register 中断状态寄存器。
  • FIFO 先入先出寄存器,可以对数据流进行缓存。
  • Config Registers 配置寄存器,可以对内部的各个电路进行配置。
  • Sensor Registers 传感器寄存器,也就是数据寄存器,存储了各个传感器的数据。
  • Digital Motion Processor(DMP)数字运动处理器,是芯片内部自带的一个姿态解算的硬件算法,配合官方的DMP库可以进行姿态解算。
  • FSYNC 帧同步。
  • Serial Interface Bypass Mux 接口旁路选择器,就是一个开关
    • 如果拨到上面,辅助的I2C引脚就和正常的I2C引脚接在一起,这样两路总线就合在一起了,STM32可以控制所有设备
    • 如果拨到下面,辅助的I2C引脚就由MPU6050控制,两条I2C总线独立分开,STM32控制MPU6050,MPU6050控制扩展设备
  • 6
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 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
发出的红包

打赏作者

YRr YRr

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值