STM32使用RTThread讀取MPU6050的值


  MPU6050:

  MPU6050是一個六軸的運動傳感器,其中三個軸為陀螺儀傳感器,讀取到的物理數值是角速度,方向分別為繞x軸,繞y軸,繞z軸。另外三個軸為加速度傳感器,方向為沿x,y,z軸。


 

  硬件連接:

  手上正好有片廉價貨色,來看看它的構造

  

  從圖中我們看到有8個接口,其中,會用到的接口有VCC(3.3V),GND,和I2C接口SCL,SDA。其他四個接口用於和其他I2C設備連接,地址和中斷,一般不使用。

  在本例中,將I2C接口SCL設置為PC7,將I2C接口SDA設置為PC8。


 

  RTThread實現快速開發

  在本次開發中,使用的開發環境為RTThread Studio(也可以使用RTThread的Env開發工具)。

  首先創立一個RTThread工程,並將時鍾改為HSE高速時鍾(此部分自主查看官方教程即可實現)。

  然后我們打開RTT Setting,看到如下界面:
  

  在圖中,可以看到,軟件包部分已經添加了mpu6xxx(第一次使用時,在Add選項中搜索,點擊添加保存即可。)驅動層添加了I2C驅動(第一次使用時,點擊圖標添加保存即可)

  

  添加好項目保存后,等待Studio添加完成,然后打開board.h頭文件,首先配置I2C驅動。

  在board.h中,有這樣一段代碼

/*-------------------------- I2C CONFIG BEGIN --------------------------*/

/** if you want to use i2c bus(soft simulate) you can use the following instructions.
 *
 * STEP 1, open i2c driver framework(soft simulate) support in the RT-Thread Settings file
 *
 * STEP 2, define macro related to the i2c bus
 *                 such as     #define BSP_USING_I2C1
 *
 * STEP 3, according to the corresponding pin of i2c port, modify the related i2c port and pin information
 *                 such as     #define BSP_I2C1_SCL_PIN    GET_PIN(port, pin)   ->   GET_PIN(C, 11)
 *                             #define BSP_I2C1_SDA_PIN    GET_PIN(port, pin)   ->   GET_PIN(C, 12)
 */

/*自主定義I2C SCL SDA 線接口*/
#define BSP_USING_I2C1
#ifdef BSP_USING_I2C1
#define BSP_I2C1_SCL_PIN    GET_PIN(C, 7)
#define BSP_I2C1_SDA_PIN    GET_PIN(C, 8)
#endif

/*#define BSP_USING_I2C2*/
#ifdef BSP_USING_I2C2
#define BSP_I2C2_SCL_PIN    GET_PIN(port, pin)
#define BSP_I2C2_SDA_PIN    GET_PIN(port, pin)
#endif

/*-------------------------- I2C CONFIG END --------------------------*/

  通過自主定義SCL,SDA接口,即可配置I2C。

 

  然后來配置MPU6xxx這個函數包,首先看下API接口說明,在函數包文件中,打開api.md。

  

  

  

  可以看到這個軟件包怎樣進行初始化和設定參數。現在來編寫main函數。

 

  首先是一些頭文件和宏定義

#include <rtthread.h>
#include <board.h>
#include <rtdevice.h>
#include "sensor_inven_mpu6xxx.h"

#define DBG_TAG "main"
#define DBG_LVL DBG_LOG
#include <rtdbg.h>

#define LED0_PIN  GET_PIN(A,8)  //led PIN定義
#define MPU6050_I2C_BUS_NAME          "i2c1"      //i2c總線設備名
#define MPU6050_ADDR                  0x68        //MPU6050地址,既定的
struct mpu6xxx_device *i2c_bus;     //6050控制句柄
struct mpu6xxx_3axes gyro1, accel1;     //陀螺儀,加速度結構體

  這里我們可以看到:

  設置了一個LED PIN,這個資源由自主根據開發板上的資源定義

  設置了i2c的總線設備名,一會初始化時會用到。設置MPU6050的地址,這是默認的。

  設置了兩個結構體,由剛才查看API手冊得知,每個結構體都有x,y,z三個成員

   

  然后是main函數:

int main(void)
{
    i2c_bus = (struct mpu6xxx_device *)mpu6xxx_init(MPU6050_I2C_BUS_NAME, MPU6050_ADDR);   //初始化MPU6050,測量單位為角速度,加速度

    mpu6xxx_set_param(i2c_bus, MPU6XXX_ACCEL_RANGE, MPU6XXX_GYRO_RANGE_250DPS);  //陀螺儀范圍配置
    mpu6xxx_set_param(i2c_bus, MPU6XXX_ACCEL_RANGE, MPU6XXX_ACCEL_RANGE_2G);     //加速度計
    mpu6xxx_set_param(i2c_bus, MPU6XXX_DLPF_CONFIG, MPU6XXX_DLPF_188HZ);     //低通濾波
    mpu6xxx_set_param(i2c_bus, MPU6XXX_SAMPLE_RATE, 500);                       //采樣頻率

    int count = 1;
    while (count++)
    {
        mpu6xxx_get_gyro(i2c_bus, &gyro1);
        mpu6xxx_get_accel(i2c_bus, &accel1);

        rt_pin_mode(LED0_PIN, count % 2);

        LOG_D("gyroX:%d",gyro1.x/10);

        LOG_D("accelX:%d",accel1.x);

        rt_thread_mdelay(500);
    }

    return RT_EOK;
}

  首先初始化,配置參數。然后開始循環,這里加了一個LED控制函數,運行時,LED閃爍代表正在發送信號,可以自主決定是否使用。

  然后串口輸出x軸的角速度和加速度,運行后,打開串口,就可以看到mpu6050讀取的參數了。

  簡單晃了一下得到的參數:

  

  (幾塊錢的6050一般都會存在一定漂移,需要手動修正,手中這塊每次上電都會隨機漂移一個值  ¯_¯ ,所以想要實際使用的話還是要買個上等貨色)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM