关于mpu6050的几个很好的帖子

最近在研究6050,真是很磨人啊,这个小东西还挺复杂,一个读取程序竟然需要600多行。

 

这几天连查资料找到了几个很好的帖子,要是以后有人看到这篇帖子,可以避免误入歧途,也可以省去很多时间。

1、阿西莫夫电子论坛:神贴。。ahttp://www.amobbs.com/thread-5581033-1-1.html?_dsign=5c5b5cde

2、强大的百度出来的第七实验室:https://wenku.baidu.com/view/89db87ac7375a417876f8f6b.html

3、6050角度转换原理:http://blog.csdn.net/u010389437/article/details/38541561

 

说一下我对他的理解。其实也不是特别的复杂,6050就是一个i2c器件,就像一个微控制器,通过它你能知道你当钱的姿态,把他想象成一个黑箱,

要使用它,首先你得了解他的寄存器,知道如何初始化,读取,写入等等。都是套路其实,看着照葫芦画瓢就行,

重要的就是知道如何将输出的数据进行转化为你能需要并且能看懂的数据。而下面你得资料你绝对用得到。

6050的操作:

#include "mpu6050.h"
#include "bsp_usart1.h"
#include "bsp_i2c.h"



/**
  * @brief   写数据到MPU6050寄存器
  * @param   
  * @retval  
  */
void MPU6050_WriteReg(u8 reg_add,u8 reg_dat)
{
    i2c_Start();
    i2c_SendByte(MPU6050_SLAVE_ADDRESS);    //写从机地址,并配置成写模式
    i2c_WaitAck();
    i2c_SendByte(reg_add);     //写寄存器地址
    i2c_WaitAck();
    i2c_SendByte(reg_dat);     //写寄存器数据
    i2c_WaitAck();
    i2c_Stop();
}


/**
  * @brief   从MPU6050寄存器读取数据
  * @param   
  * @retval  
  */
void MPU6050_ReadData(u8 reg_add,unsigned char*Read,u8 num)
{
    unsigned char i;
    
    i2c_Start();
    i2c_SendByte(MPU6050_SLAVE_ADDRESS);
    i2c_WaitAck();
    i2c_SendByte(reg_add);
    i2c_WaitAck();
    
    i2c_Start();
    i2c_SendByte(MPU6050_SLAVE_ADDRESS+1);   //写从机地址,并配置成读模式
    i2c_WaitAck();
    
    for(i=0;i<(num-1);i++)
    {
        *Read=i2c_ReadByte(1);
        Read++;
    }
    *Read=i2c_ReadByte(0);
    i2c_Stop();
}

//**************至此mpu6050的读写操作函数都搞定了,下面只需要初始化就可以读取他的数据了


/**
  * @brief   初始化MPU6050芯片
  * @param   
  * @retval  
  */
void MPU6050_Init(void)
{
  int i=0,j=0;
  //在初始化之前要延时一段时间,若没有延时,则断电后再上电数据可能会出错
  for(i=0;i<1000;i++)
  {
    for(j=0;j<1000;j++)
    {
      ;
    }
  }
    MPU6050_WriteReg(MPU6050_RA_PWR_MGMT_1, 0x00);        //解除休眠状态
    MPU6050_WriteReg(MPU6050_RA_SMPLRT_DIV , 0x07);        //陀螺仪采样率,1KHz
    MPU6050_WriteReg(MPU6050_RA_CONFIG , 0x06);            //低通滤波器的设置,截止频率是1K,带宽是5K
    MPU6050_WriteReg(MPU6050_RA_ACCEL_CONFIG , 0x00);      //配置加速度传感器工作在2G模式,不自检
    MPU6050_WriteReg(MPU6050_RA_GYRO_CONFIG, 0x18);     //陀螺仪自检及测量范围,典型值:0x18(不自检,2000deg/s)
}

/**
  * @brief   读取MPU6050的ID
  * @param   
  * @retval  
  */
uint8_t MPU6050ReadID(void)
{
    unsigned char Re = 0;
    MPU6050_ReadData(MPU6050_RA_WHO_AM_I,&Re,1);    //读器件地址
    if(Re != 0x68)
    {
        printf("MPU6050 dectected error!\r\n检测不到MPU6050模块,请检查模块与开发板的接线");
        return 0;
    }
    else
    {
        printf("MPU6050 ID = %d\r\n",Re);
        return 1;
    }
        
}
/**
  * @brief   读取MPU6050的加速度数据
  * @param   
  * @retval  
  */
void MPU6050ReadAcc(short *accData)
{
    u8 buf[6];
    MPU6050_ReadData(MPU6050_ACC_OUT, buf, 6);
    accData[0] = (buf[0] << 8) | buf[1];
    accData[1] = (buf[2] << 8) | buf[3];
    accData[2] = (buf[4] << 8) | buf[5];
}

/**
  * @brief   读取MPU6050的角加速度数据
  * @param   
  * @retval  
  */
void MPU6050ReadGyro(short *gyroData)
{
    u8 buf[6];
    MPU6050_ReadData(MPU6050_GYRO_OUT,buf,6);
    gyroData[0] = (buf[0] << 8) | buf[1];
    gyroData[1] = (buf[2] << 8) | buf[3];
    gyroData[2] = (buf[4] << 8) | buf[5];
}


/**
  * @brief   读取MPU6050的原始温度数据
  * @param   
  * @retval  
  */
void MPU6050ReadTemp(short *tempData)
{
    u8 buf[2];
    MPU6050_ReadData(MPU6050_RA_TEMP_OUT_H,buf,2);     //读取温度值
    *tempData = (buf[0] << 8) | buf[1];
}


/**
  * @brief   读取MPU6050的温度数据,转化成摄氏度
  * @param   
  * @retval  
  */
void MPU6050_ReturnTemp(short*Temperature)
{
    short temp3;
    u8 buf[2];
    
    MPU6050_ReadData(MPU6050_RA_TEMP_OUT_H,buf,2);     //读取温度值
  temp3= (buf[0] << 8) | buf[1];
    *Temperature=(((double) (temp3 + 13200)) / 280)-13;
}

 

光知道6050怎么操作还是不行的,你的有一个桥梁到6050上面去,得有一个放大镜偷窥里面的数据。这是就需要i2c闪亮登场。

伪代码我就不说了,看我的其他博客。

有了这些你就无敌了。

 

posted @ 2017-03-01 22:09  Andrew_qian  阅读(12530)  评论(0编辑  收藏  举报