文章出處

MPU9250 芯片概述

MPU9250芯片是一個9軸姿態傳感芯片,其中包含了3軸加速度傳感器、3軸角速度傳感器以及三軸磁力計。
其本質上是MPU6050芯片+AK8963。

可以獲取傳感芯片的加速度、角速度、以及磁力值。

角速度可以知芯片的轉動速度,加速度可以知道芯片運動的距離、速度情況,而磁力計可以知道物芯片的運動方向。

另外MPU9250芯片內置DMP姿態融合器,可以在不涉及算法的情況下,直接讀取出描述物體狀態的四元數,從而得出物體的三維角度--航向角、翻滾角、俯仰角。

驅動程序的設計

由于MPU9250芯片使用的是I2C接口,所以在這里,我首先需要I2C的驅動。

在我的驅動中,I2C使用GPIO口模擬的,因為這樣在以后移植時更加方便。

在完成IOI2C的驅動之后,就是對MPU9250的寄存器進行操作,來成功獲取傳感數據。

MPU9250的寄存器操作

操作MPU9250寄存器并且開啟DMP模式,獲取三維角度,其步驟如下:

  1. 復位,配置PWR_MGMT_1 0x80,延時一段時間
  2. 配置PWR_MGMT_1(一般為00,表示使用內部晶振20Mhz)
  3. 設置采樣頻率
  4. 設置量程(角速度、加速度量程)
  5. 外部中斷打開,并且配置成相應的工作方式
  6. 開啟DMP,以及FIFO

其中DMP的開啟需要密碼,而且具體的操作方法及寄存器在數據手冊上都無法找到,是本人在網站經過查找融合了多人的驅動調試出來的。

代碼調用

本人將調通之后的代碼整理之后,只需調用幾個API就可以實現參數的獲取了。

主要分為兩步:

  1. 初始化
    IIC_Init();//模擬I2C驅動的初始化,一定要先初始化I2C接口才能操作MPU9250芯片
    
    Init_MPU9250_With_DMP();//初始化MPU9250,配置并且開啟DMP,設置中斷方式為加速度方式
  1. 函數調用
while(1)
{       
    fifo_count = MPU9250_getFIFOCount();//讀取FIFO計數
    
    if(fifo_count >= 0x0200)//如果FIFO值>0x0200,此時DMP的結果錯誤,直接復位FIFO
    {
        MPU9250_resetFIFO();
    }
    else
    {
        
        if(fifo_count >= 0x2a)//如果FIFO值 > 0x2a,此時DMP轉換完成并且數值正常
        {               
            readdmp(); //首先要讀取DMP FIFO,讀取之后才能進行計算姿態的操作
            MPU9250_resetFIFO();                    
            getyawpitchroll();//計算并且獲取yaw、pitch、roll,結果保存在yprf[3]數組中

        }
    }       
}

NOTE:

  • 在判斷DMP是否完成時,應當從FIFO的計數中去判斷,當計數大于等于42,說明DMP轉換完成,也可以采用中斷的方式來作為標志。

  • 本例程中使用的I2C為GPIO模擬的I2C,主要是移植方便,但是在將此驅動移植到不同平臺時需要注意寄存器以及引腳的定義。

  • 注意芯片上電之后需要先復位,即設置PWR_MGMT_1為0x80,過一段時間之后再設置為0x00,否則有時芯片會工作異常

具體的程序在我的代碼庫中,如果大家發現其中的問題,歡迎E-mail給我。

代碼鏈接如下:
MPU9250-MPU6050驅動


文章列表


不含病毒。www.avast.com
arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()