MPU6050的初始化

传感器简介以及用法

  • MPU6050是运动处理传感器,它集成了3轴陀螺仪,3轴加速度计以及DMP,其中的DMP是一个可通过IIC接口扩展的数字运动处理器。
    MPU6050的初始化_第1张图片
  • 对于DMP可以用 InvenSense 公司提供的资料库,使MPU6050可以解算出姿态,通过IIC接口直接输出陀螺仪和加速度数据融合后的四元数,减轻了处理器的负荷,非常适合简单的开发应用。但是,使用DMP的这种硬件解算也存在问题,有时会无法读出数据,因此,在四轴的应用中通常都会采用软件解算,常见的姿态解算方法有:非线性互补滤波算法,卡尔曼滤波算法,Mahony互补滤波算法(可参见Crazypony的开源项目)。
  • MPU6050通过IIC协议与处理器进行通信。我使用STM32时通常采用软件模拟IIC的方式。

硬件接口

接着来了解一下MPU6050的引脚,通过一个芯片的硬件接口及定义,我们就可以大概的了解到芯片的主要功能,再去搜索芯片手册的时,就可以着重的按照这些信息去检索。

引脚 名称 说明
1 VCC 电源输入
2 GND 地线
3 IIC_SDA IIC通信数据线
4 IIC_SCL IIC通信时钟线
5 INT 中断输出
6 AD0 地址设置: ID:0x68(AD0=0)、 0x69(AD0=1)
  • 6050的供电电压支持2.5v、3.0v、3.3v,一般的模块都会加一个稳压芯片如:662K 使6050兼容5V以及3.3V供电
  • MPU6050有一个可编程的中断系统,可在INT中断引脚上产生中断信号。可编程的主要中断源有:自由落体中断,静止中断……

寄存器的查阅

  • MPU6050的所有寄存器都可以在官方文档“MPU-6000 and MPU-6050 Register Map and Descriptions”中找到,平时使用中最为重要的有以下几种:电源管理寄存器1和2、陀螺仪配置寄存器、陀螺仪采样率分频寄存器、加速度传感器配置寄存器、配置寄存器。

以电源管理寄存器为例:

MPU6050的初始化_第2张图片

  • 寄存器地址:0x6B(Hex)或107(十进制)。
  • 表格后面的几位Bit7~Bit0代表八位二进制,给该寄存器赋值就是改变这几位的值。各个位代表的意义可看表下方的说明:如DEVICE_RESET :When set to 1, this bit resets all internal registers to their default values.The bit automatically clears to 0 once the reset is done.表明DEVICE_RESET被置1时芯片就会将所有内部寄存器复位。
  • -

驱动程序

对MPU6050的初始化驱动就是通过IIC的协议,对MPU6050的寄存器进行初始化配置,我选择配置的有:

  • 设置电源管理寄存器1(0X6B),复位MPU6050 (下面举例)
  • 设置陀螺仪配置寄存器(0X1B),将量程设置为 2000dps
  • 设置加速度计配置寄存器(0X1C),将量程设置为 2g
  • 设置采样频率分频器(0X19),将采样率设置为50Hz
  • 设置中断使能寄存器(0X38),关闭中断
  • 设置电源管理寄存器2(0X6C),使加速度陀螺仪都工作
//以下函数通过IIC协议,修改MPU6050的电源管理寄存器,实现复位

//其中的(IIC_……)函数为IIC通信函数,可从名字中了解大致功能,具体应用可参见IIC通信协议的内容

char MPU_Reset()
{
    IIC_Start(); 
    IIC_Send_Byte((0x68<<1)|0);   //发送器件地址+写命令  
    if(IIC_Wait_Ack())
    {
        IIC_Stop();      
        return 1;       
    }
    IIC_Send_Byte(0x6B);   //写寄存器地址,选择电源管理寄存器1
    IIC_Wait_Ack(); 
    IIC_Send_Byte(0x80);   //发送数据(1000 0000)第七位为1,复位
    if(IIC_Wait_Ack())
    {
        IIC_Stop();  
        return 1;        
    }        
   IIC_Stop();   
    return 0;
}

按照相同的方法对其余的寄存器进行配置之后,MPU6050就可以正常工作了。接下来的任务就是不断读取它的数据,计算出芯片的姿态了。。。

读取原始数据

MPU6050的初始化_第3张图片
使用IIC协议读取以上寄存器的值,每个轴的值由16位二进制表示(0–65535),以X轴为例:ACCEL_XOUT[15:8]、ACCEL_XOUT[7:0]分别为X轴加速度的高八位和低八位,每次读取八位再将它们拼起来即可。

ax=( (unsigned int)buffer[0]<<8 ) | buffer[1];  

此时就获得了MPU6050输出的ADC值了,它是以LSB为单位的,而不是以实际值的 g 为单位,它对应的实际值与你在初始化的时候设置的量程有关。比如说我们设置的量程是+-2g,那对应的灵敏度=65536/4 LSB/g , 那么实际的加速度值=ADC的值LSB / 16384 LSB/g

通过这些我们就可以得到原始数据了,下面就是姿态解算的问题了。DMP的驱动官方有,网上也已经有人移植到了STM32上面,简单使用效果还差强人意,但是用到对稳定性要求较高的四轴上的时候就不够了,我们可不想四轴飞着飞着抽搐一下,那可怪吓人。所以,在四轴的姿态解算里,通常都是使用一些滤波算法和融合算法来对原始数据进行处理,,

                     ,.
                     (_|,.
                   ,' /, )_______   _
                __j o``-'        `.'-)'
               (")                 \'
                `-j                |
                  `-._(           /
                     | \  |--^.  /
                     /_]|_|  _)_/
>>  todo ....

你可能感兴趣的:(MPU6050,传感器,单片机,四轴飞行器)