MPU9250 芯片概述
MPU9250芯片是一個9軸姿態傳感芯片,其中包含了3軸加速度傳感器、3軸角速度傳感器以及三軸磁力計。
其本質上是MPU6050芯片+AK8963。
可以獲取傳感芯片的加速度、角速度、以及磁力值。
角速度可以知芯片的轉動速度,加速度可以知道芯片運動的距離、速度情況,而磁力計可以知道物芯片的運動方向。
另外MPU9250芯片內置DMP姿態融合器,可以在不涉及算法的情況下,直接讀取出描述物體狀態的四元數,從而得出物體的三維角度--航向角、翻滾角、俯仰角。
驅動程序的設計
由于MPU9250芯片使用的是I2C接口,所以在這里,我首先需要I2C的驅動。
在我的驅動中,I2C使用GPIO口模擬的,因為這樣在以后移植時更加方便。
在完成IOI2C的驅動之后,就是對MPU9250的寄存器進行操作,來成功獲取傳感數據。
MPU9250的寄存器操作
操作MPU9250寄存器并且開啟DMP模式,獲取三維角度,其步驟如下:
- 復位,配置PWR_MGMT_1 0x80,延時一段時間
- 配置PWR_MGMT_1(一般為00,表示使用內部晶振20Mhz)
- 設置采樣頻率
- 設置量程(角速度、加速度量程)
- 外部中斷打開,并且配置成相應的工作方式
- 開啟DMP,以及FIFO
其中DMP的開啟需要密碼,而且具體的操作方法及寄存器在數據手冊上都無法找到,是本人在網站經過查找融合了多人的驅動調試出來的。
代碼調用
本人將調通之后的代碼整理之后,只需調用幾個API就可以實現參數的獲取了。
主要分為兩步:
- 初始化
IIC_Init();//模擬I2C驅動的初始化,一定要先初始化I2C接口才能操作MPU9250芯片
Init_MPU9250_With_DMP();//初始化MPU9250,配置并且開啟DMP,設置中斷方式為加速度方式
- 函數調用
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驅動
文章列表