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