RM新时代网站-首页

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內(nèi)不再提示

MPU6050簡介及rt-thread軟件包使用

RTThread物聯(lián)網(wǎng)操作系統(tǒng) ? 來源:小飛哥玩嵌入式 ? 作者:Embedded小飛哥 ? 2022-06-17 10:42 ? 次閱讀

小伙伴們大家好,好久不更新RT-Thread實戰(zhàn)筆記啦,今天來搞一搞MPU6050,話不多說,淦!

本章源碼獲取

歡迎在“小飛哥嵌入式”公眾號后臺回復“MPU6050”即可獲取本教程源碼

MPU6050簡介

某寶買的,吃灰許久了...59c8a9bc-ed64-11ec-ba43-dac502259ad0.png

有錢,不想受那鳥氣的,看這個,自己畫一個,對比價格,我勸你買個吧,知道自己行就行了...

典型用法:

59f8f928-ed64-11ec-ba43-dac502259ad0.png5a09f110-ed64-11ec-ba43-dac502259ad0.png

可在官網(wǎng)下載最新芯片手冊和寄存器映射和描述,參看:MPU6050 官網(wǎng)

5a1666ac-ed64-11ec-ba43-dac502259ad0.png

基本功能:

MPU-60X0是世界上第一款集成 6 軸MotionTracking設備。它集成了3軸MEMS陀螺儀,3軸MEMS加速度計,以及一個可擴展的數(shù)字運動處理器 DMP( DigitalMotion Processor),可用I2C接口連接一個第三方的數(shù)字傳感器,比如磁力計。擴展之后就可以通過其 I2C或SPI接口輸出一個9軸的信號( SPI接口僅在MPU-6000可用)。MPU-60X0也可以通過其I2C接口連接非慣性的數(shù)字傳感器,比如壓力傳感器

MPU-60X0對陀螺儀和加速度計分別用了三個16位的ADC,將其測量的模擬量轉(zhuǎn)化為可輸出的數(shù)字量。為了精確跟蹤快速和慢速的運動,傳感器的測量范圍都是用戶可控的,陀螺儀可測范圍為±250, ±500, ±1000, ±2000°/秒( dps),加速度計可測范圍為±2, ±4,±8, ±16g。

一個片上1024字節(jié)的FIFO,有助于降低系統(tǒng)功耗。和所有設備寄存器之間的通信采用 400kHz的 I2C接口或 1MHz的 SPI接口( SPI僅MPU-6000可用)。對于需要高速傳輸?shù)膽茫?對寄存器的讀取和中斷可用 20MHz的SPI。另外,片上還內(nèi)嵌了一個溫度傳感器和在工作環(huán)境下僅有±1%變動的振蕩器。芯片尺寸4×4×0.9mm,采用QFN封裝(無引線方形封裝),可承受最大 10000g的沖擊,并有可編程的低通濾波器。

關于電源, MPU-60X0可支持 VDD范圍 2.5V±5%, 3.0V±5%,或 3.3V±5%。另外MPU-6050還有一個 VLOGIC引腳,用來為 I2C輸出提供邏輯電平。VLOGIC電壓可取1.8±5%或者VDD。

5a289534-ed64-11ec-ba43-dac502259ad0.png

系統(tǒng)結(jié)構(gòu)圖:

5a3c018c-ed64-11ec-ba43-dac502259ad0.png

通信接口

MPU-60X0使用 SPI(僅MPU-6000)或 I2C 串行通信至系統(tǒng)處理器接口。與系統(tǒng)處理器通信時,MPU-60X0始終充當從屬設備。LSB的 I2C 從地址的地址由引腳9(AD0)設置(一般接地),本次采用的是IIC的通訊方式,順便學習一下rt-thread的IIC設備驅(qū)動。

六軸,代表的是它內(nèi)置了一個三軸 MEMS 陀螺儀、一個三軸 MEMS 加速度計,一個數(shù)字運動處理引擎(DMP)。它還有用于第三方的數(shù)字傳感器接口的輔助 I2C 串行接口,比如當輔助 I2C 串行接口連接到一個三軸磁力計,MPU6050 能提供一個完整的九軸融合輸出到其主 I2C 端口

下圖標明了傳感器的參考坐標系( XYZ組成右手系)以及 3個測量軸和旋轉(zhuǎn)方向。

旋轉(zhuǎn)的正向可用右手螺旋定則判斷

5a4bbece-ed64-11ec-ba43-dac502259ad0.png

數(shù)字運動處理器(DMP):

DMP就是MPU6050內(nèi)部的運動引擎,全稱Digital Motion Processor,直接輸出四元數(shù),可以減輕外圍微處理器的工作負擔且避免了繁瑣的濾波和數(shù)據(jù)融合。Motion Driver是Invensense針對其運動傳感器的軟件包,并非全部開源,核心的算法部分是針對ARM處理器和MSP430處理器編譯成了靜態(tài)鏈接庫,適用于MPU6050、MPU6500、MPU9150、MPU9250等傳感器。

FIFO

MPU-60X0包含一個可通過串行接口訪問的1024字節(jié)FIFO寄存器。FIFO配置寄存器決定哪個數(shù)據(jù)寫入FIFO??赡艿倪x擇包括陀螺儀數(shù)據(jù),加速計數(shù)據(jù),溫度讀數(shù),輔助傳感器讀數(shù)和 FSYNC 輸入。FIFO 計數(shù)器跟蹤 FIFO 中包含的有效數(shù)據(jù)字節(jié)數(shù)。FIFO寄存器支持突發(fā)讀取。中斷功能可用于確定新數(shù)據(jù)何時可用。

MPU6050的涉及的東西還是很多的,小飛哥也只是簡單了解了一些,小伙伴們可以查看手冊或者百度,很多優(yōu)秀的介紹,就不再啰嗦啦

rt-thread軟件包使用

硬件連接

小飛哥使用的是ART-PI及ART-PI擴展板(12月份即將開源發(fā)布)

5a59b4d4-ed64-11ec-ba43-dac502259ad0.png

使用到的引腳為:

MCU MPU6050
3.3V VCC
GND GND
PI2 SDA
PI1 SCL

小伙伴們可以還根據(jù)自己的MCU及使用到的引腳,模擬的IIC,自己看著選就可以啦5a754122-ed64-11ec-ba43-dac502259ad0.png

硬件連接OK

軟件編寫

介紹2兩種方式,一種是使用rt-thread平臺軟件包獲取MPU6050的數(shù)據(jù),自己解算,另一種就是移植DMP庫進行解算,小飛哥用的是移植的DMP庫來解算的。

  • rtt軟件包使用

選擇MPU6050軟件包5a8a2d26-ed64-11ec-ba43-dac502259ad0.png

5a989302-ed64-11ec-ba43-dac502259ad0.png然后選擇模擬IIC,可以使用IIC3,也可以使用其他的,和軟件包選用的統(tǒng)一就OK了

5aae4fa8-ed64-11ec-ba43-dac502259ad0.png

設置完成之后,ctrl+S保存即可,軟件包自動就下載添加進來了

5abf4f10-ed64-11ec-ba43-dac502259ad0.png

接下來編寫讀取函數(shù),直接調(diào)用已經(jīng)封裝好的接口即可

先注冊設備,初始化

i2c_bus=(structmpu6xxx_device*)mpu6xxx_init(MPU6050_I2C_BUS_NAME,MPU6050_ADDR);//初始化MPU6050,測量單位為角速度,加速度while(count++)

mpu6xxx_set_param(i2c_bus,MPU6XXX_ACCEL_RANGE,MPU6XXX_GYRO_RANGE_2000DPS);//陀螺儀范圍配置
mpu6xxx_set_param(i2c_bus,MPU6XXX_ACCEL_RANGE,MPU6XXX_ACCEL_RANGE_2G);//加速度計,一般設置為±2G
mpu6xxx_set_param(i2c_bus,MPU6XXX_SAMPLE_RATE,50);//采樣頻率
mpu6xxx_set_param(i2c_bus,MPU6XXX_DLPF_CONFIG,25);//數(shù)字低通濾波器設置,一般為1/2采樣率

然后調(diào)用接口:

mpu6xxx_get_gyro(i2c_bus,&gyro);
sprintf(str,"gyro.x=%d
",gyro.x);
rt_kprintf(str);

sprintf(str,"gyro.y=%d
",gyro.y);
rt_kprintf(str);

sprintf(str,"gyro.z=%d
",gyro.z);
rt_kprintf(str);


mpu6xxx_get_accel(i2c_bus,&accel);

sprintf(str,"accel.x=%d
",accel.x);
rt_kprintf(str);
sprintf(str,"accel.y=%d
",accel.y);
rt_kprintf(str);
sprintf(str,"accel.z=%d
",accel.z);
rt_kprintf(str);

運行結(jié)果:

5ada6b38-ed64-11ec-ba43-dac502259ad0.png

來看一下,這兩個函數(shù)的內(nèi)部封裝:

/**
*Thisfunctiongetsthedataofthegyroscope,unit:deg/10s
*Heredeg/10smeans10timeshigherprecisionthandeg/s.
*
*@paramdevthepointerofdevicedriverstructure
*@paramgyrothepointerof3axesstructureforreceivedata
*
*@returnthereadingstatus,RT_EOKreprensentsreadingthedatasuccessfully.
*/
rt_err_tmpu6xxx_get_gyro(structmpu6xxx_device*dev,structmpu6xxx_3axes*gyro)
{
structmpu6xxx_3axestmp;
rt_uint16_tsen;
rt_err_tres;

res=mpu6xxx_get_gyro_raw(dev,&tmp);
if(res!=RT_EOK)
{
returnres;
}

sen=MPU6XXX_GYRO_SEN>>dev->config.gyro_range;

gyro->x=(rt_int32_t)tmp.x*100/sen;
gyro->y=(rt_int32_t)tmp.y*100/sen;
gyro->z=(rt_int32_t)tmp.z*100/sen;

returnRT_EOK;
}
/**
*Thisfunctiongetsthedataoftheaccelerometer,unit:mg
*
*@paramdevthepointerofdevicedriverstructure
*@paramaccelthepointerof3axesstructureforreceivedata
*
*@returnthereadingstatus,RT_EOKreprensentsreadingthedatasuccessfully.
*/
rt_err_tmpu6xxx_get_accel(structmpu6xxx_device*dev,structmpu6xxx_3axes*accel)
{
structmpu6xxx_3axestmp;
rt_uint16_tsen;
rt_err_tres;

res=mpu6xxx_get_accel_raw(dev,&tmp);
if(res!=RT_EOK)
{
returnres;
}

sen=MPU6XXX_ACCEL_SEN>>dev->config.accel_range;

accel->x=(rt_int32_t)tmp.x*1000/sen;
accel->y=(rt_int32_t)tmp.y*1000/sen;
accel->z=(rt_int32_t)tmp.z*1000/sen;

returnRT_EOK;
}

還有獲取磁力計、溫度的接口,就不再一一列舉了,拿到的數(shù)據(jù)我們可以進行手動解算。

  • 移植DMP解算

使用DMP包的話跟rtt的MPU6050的軟件包就沒有很大關系了,只需要IIC接口就可以了

首先把DMP庫文件放到我們的工程中,包含路徑到我們的工程中

5aeddd94-ed64-11ec-ba43-dac502259ad0.png5aff43c2-ed64-11ec-ba43-dac502259ad0.png

然后就需要編寫與DMP庫對接的接口了,下面幾個是需要我們實現(xiàn)的

5b1a77dc-ed64-11ec-ba43-dac502259ad0.png
rt_uint8_tMPU_Write_Len(rt_uint8_taddr,rt_uint8_treg,rt_uint8_tlen,rt_uint8_t*databuf)
{
rt_int8_tres=0;
#ifdefRT_USING_I2C
structrt_i2c_msgmsgs;
rt_uint8_tbuf[50]={0};
#endif
buf[0]=reg;

for(inti=0;i1]=databuf[i];
}

if(i2c_bus->bus->type==RT_Device_Class_I2CBUS)
{
msgs.addr=i2c_bus->i2c_addr;/*slaveaddress*/
msgs.flags=RT_I2C_WR;/*writeflag*/
msgs.buf=buf;/*Senddatapointer*/
msgs.len=len+1;

if(rt_i2c_transfer((structrt_i2c_bus_device*)i2c_bus->bus,&msgs,1)==1)
{
res=RT_EOK;
}
else
{
res=-RT_ERROR;
}
}
}

;i++)>
rt_uint8_tMPU_Read_Len(rt_uint8_taddr,rt_uint8_treg,rt_uint8_tlen,rt_uint8_t*buf)
{
rt_int8_tres=0;
#ifdefRT_USING_I2C
structrt_i2c_msgmsgs[2];
#endif
#ifdefRT_USING_SPI
rt_uint8_ttmp;
#endif
if(i2c_bus->bus->type==RT_Device_Class_I2CBUS)
{
msgs[0].addr=i2c_bus->i2c_addr;/*Slaveaddress*/
msgs[0].flags=RT_I2C_WR;/*Writeflag*/
msgs[0].buf=?/*Slaveregisteraddress*/
msgs[0].len=1;/*Numberofbytessent*/

msgs[1].addr=i2c_bus->i2c_addr;/*Slaveaddress*/
msgs[1].flags=RT_I2C_RD;/*Readflag*/
msgs[1].buf=buf;/*Readdatapointer*/
msgs[1].len=len;/*Numberofbytesread*/

if(rt_i2c_transfer((structrt_i2c_bus_device*)i2c_bus->bus,msgs,2)==2)
{
res=RT_EOK;
}
else
{
res=-RT_ERROR;
}
}

returnres;
}

初始化部分我們改為下面這樣,只注冊IIC設備就行了,其他的配置在DMP中完成:

i2c_bus=(structmpu6xxx_device*)mpu6xxx_init(MPU6050_I2C_BUS_NAME,MPU6050_ADDR);//初始化MPU6050,測量單位為角速度,加速度while(count++)

/*
mpu6xxx_set_param(i2c_bus,MPU6XXX_ACCEL_RANGE,MPU6XXX_GYRO_RANGE_2000DPS);//陀螺儀范圍配置
mpu6xxx_set_param(i2c_bus,MPU6XXX_ACCEL_RANGE,MPU6XXX_ACCEL_RANGE_2G);//加速度計,一般設置為±2G
mpu6xxx_set_param(i2c_bus,MPU6XXX_SAMPLE_RATE,50);//采樣頻率
mpu6xxx_set_param(i2c_bus,MPU6XXX_DLPF_CONFIG,25);//數(shù)字低通濾波器設置,一般為1/2采樣率
*/

while(mpu_dmp_init())
{
rt_thread_mdelay(500);
rt_kprintf("
MPU6050Error
");
}
rt_kprintf("
MPU6050OK
");

DMP初始化成功

5b315588-ed64-11ec-ba43-dac502259ad0.png

獲取結(jié)算后的數(shù)據(jù):

floatpitch,roll,yaw;//歐拉角

if(mpu_dmp_get_data(&pitch,&roll,&yaw)==0)
{
sprintf(str,"pitch=%.1f
",pitch);
rt_kprintf(str);

sprintf(str,"roll=%.1f
",roll);
rt_kprintf(str);

sprintf(str,"yaw=%.1f
",yaw);
rt_kprintf(str);


/*
temp=MPU_Get_Temperature();//得到溫度值

sprintf(str,"temp=%.1f
",temp);
rt_kprintf(str);

MPU_Get_Accelerometer(&aacx,&aacy,&aacz);//得到加速度傳感器數(shù)據(jù)
MPU_Get_Gyroscope(&gyrox,&gyroy,&gyroz);//得到陀螺儀數(shù)據(jù)
*/
}
5b42a504-ed64-11ec-ba43-dac502259ad0.png

至此就結(jié)束了,使用庫的解算是挺方便的,自己解算其中涉及的計算還是挺麻煩的,本章就不再介紹啦,歡迎做過的小伙伴投稿給我哦!

原文標題:RT-Thread實戰(zhàn)筆記|MPU6050使用詳解及DMP姿態(tài)解算

文章出處:【微信公眾號:RTThread物聯(lián)網(wǎng)操作系統(tǒng)】歡迎添加關注!文章轉(zhuǎn)載請注明出處。

審核編輯:湯梓紅
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 處理器
    +關注

    關注

    68

    文章

    19259

    瀏覽量

    229650
  • 軟件包
    +關注

    關注

    0

    文章

    104

    瀏覽量

    11590
  • MPU6050
    +關注

    關注

    39

    文章

    307

    瀏覽量

    71362
  • RT-Thread
    +關注

    關注

    31

    文章

    1285

    瀏覽量

    40081

原文標題:RT-Thread實戰(zhàn)筆記|MPU6050使用詳解及DMP姿態(tài)解算

文章出處:【微信號:RTThread,微信公眾號:RTThread物聯(lián)網(wǎng)操作系統(tǒng)】歡迎添加關注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關推薦

    RT-Thread記錄(十八、SHT21與24C02軟件包

    本文學習測試一下幾款典型設備的 RT-Thread I2C軟件包
    的頭像 發(fā)表于 07-08 11:07 ?3396次閱讀
    <b class='flag-5'>RT-Thread</b>記錄(十八、SHT21與24C02<b class='flag-5'>軟件包</b>)

    介紹RT-Thread軟件包

    學習要點介紹 RT-Thread軟件包;簡介 nRF24L01 軟件包的使用,講解如何使用此軟件包將數(shù)據(jù)正確發(fā)送和接收;學習線程間的通信
    發(fā)表于 07-27 06:07

    STM32F103C8使用RT-Thread軟件包系統(tǒng)讀取MPU6050數(shù)據(jù)的方法

    STM32F103C8 使用RT-Thread軟件包系統(tǒng)讀取MPU6050??已經(jīng)使用了一段時間的RTT了,最近看到RTT的微信公眾號經(jīng)常推送軟件包的內(nèi)容,今天就試一下吧。
    發(fā)表于 02-10 06:15

    求解mpu6050軟件包搜索不到了

    請問一下mpu6050軟件包搜索不到了,有什么方法可以去解決嗎
    發(fā)表于 07-12 11:34

    RT-Thread 軟件包介紹

    RT-Thread 軟件包介紹軟件包的目的軟件包在高級語言中非常常見,很多高級語言都有對應的軟件包平臺,比如 Python 的 PyPi,R
    發(fā)表于 05-21 19:38 ?5552次閱讀

    RT-Thread軟件包定義和使用

    RT-Thread軟件包是運行于RT-Thread物聯(lián)網(wǎng)操作系統(tǒng)平臺上,面向不同應用領域的通用軟件組件 。RT-Thread 同時提供了開放
    的頭像 發(fā)表于 05-21 11:29 ?1w次閱讀
    <b class='flag-5'>RT-Thread</b><b class='flag-5'>軟件包</b>定義和使用

    RT-Thread社區(qū)上有哪些優(yōu)秀的軟件包?

    SX12XX 軟件包是基于 semtech 官網(wǎng) Firmware Drivers V2.1.0代碼庫的移植實現(xiàn),目前只支持 SX1278 LoRa設備。該軟件包在原代碼庫功能的基礎上,對接 RT-Thread SPI 設備驅(qū)動
    的頭像 發(fā)表于 04-03 15:35 ?7631次閱讀

    MPU6050簡介

    MPU6050簡介什么是MPU6050MPU6050的特點MPU6050框圖MPU6050初始化MPU6
    發(fā)表于 12-06 11:51 ?76次下載
    <b class='flag-5'>MPU6050</b><b class='flag-5'>簡介</b>

    STM32F103C8 使用RT-Thread軟件包系統(tǒng)讀取MPU6050

    STM32F103C8 使用RT-Thread軟件包系統(tǒng)讀取MPU6050??已經(jīng)使用了一段時間的RTT了,最近看到RTT的微信公眾號經(jīng)常推送軟件包的內(nèi)容,今天就試一下吧。
    發(fā)表于 12-06 14:36 ?12次下載
    STM32F103C8 使用<b class='flag-5'>RT-Thread</b><b class='flag-5'>軟件包</b>系統(tǒng)讀取<b class='flag-5'>MPU6050</b>

    2022 RT-Thread全球技術大會:RT-Thread軟件包

    RT-Thread在2022年上半年新增幾十個軟件包:rtt-rust、LuatOS、gui-guider-demo。
    的頭像 發(fā)表于 05-27 14:12 ?1052次閱讀
    2022 <b class='flag-5'>RT-Thread</b>全球技術大會:<b class='flag-5'>RT-Thread</b><b class='flag-5'>軟件包</b>

    RT-Thread全球技術大會:恩智浦新增100+軟件包

    RT-Thread全球技術大會:恩智浦新增100+軟件包,支持了很多有用的功能。 ? ? ? ? ? ? 審核編輯:彭靜
    的頭像 發(fā)表于 05-27 14:26 ?954次閱讀
    <b class='flag-5'>RT-Thread</b>全球技術大會:恩智浦新增100+<b class='flag-5'>軟件包</b>

    RT-Thread在線軟件包改為本地軟件包的方法

    RT-Thread軟件包,使用時需要手動通過 ENV 工具 更新到 本地的 packages 目錄,并且 packages 目錄默認不參與 Git 工程管理,軟件包多了,偶爾需要更改軟件包
    的頭像 發(fā)表于 08-11 15:02 ?1210次閱讀
    <b class='flag-5'>RT-Thread</b>在線<b class='flag-5'>軟件包</b>改為本地<b class='flag-5'>軟件包</b>的方法

    RT-Thread使用cjson軟件包發(fā)送64位長整型數(shù)據(jù)

    開發(fā)環(huán)境:野火的stm32f407,rt-thread studio版本是版本: 2.2.6,stm32f4的資源為0.2.2,rt-thread版本為4.1.1,cjson軟件包使
    的頭像 發(fā)表于 10-11 15:09 ?916次閱讀
    <b class='flag-5'>RT-Thread</b>使用cjson<b class='flag-5'>軟件包</b>發(fā)送64位長整型數(shù)據(jù)

    RT-Thread中Agile Modbus軟件包的使用方法

    開發(fā)環(huán)境:野火的stm32f407,rt-thread studio版本是版本: 2.2.6,stm32f4的資源為0.2.2,Agile Modbus軟件包版本為v1.1.2。工程使用上一篇
    的頭像 發(fā)表于 10-11 15:37 ?2668次閱讀
    <b class='flag-5'>RT-Thread</b>中Agile Modbus<b class='flag-5'>軟件包</b>的使用方法

    RT-Thread中mymqtt軟件包的使用方法

    在上一篇文章 RT-Thread中Lan8720和lwip協(xié)議棧的使用的工程基礎上添加mymqtt軟件包。 使能mqtt example和mqtt test,保存,等待下載更新軟件包。
    的頭像 發(fā)表于 10-13 10:44 ?974次閱讀
    <b class='flag-5'>RT-Thread</b>中mymqtt<b class='flag-5'>軟件包</b>的使用方法
    RM新时代网站-首页