STM32F407硬件I2C实现MPU6050通讯(CUBEIDE)

news2024/11/15 17:40:57

STM32F407硬件I2C实现MPU6050通讯


文章目录

  • STM32F407硬件I2C实现MPU6050通讯
  • cubeide设置
  • 写操作与读操作函数实现
  • 复位,读取温度,角度等函数封装
    • mpu6050.c
    • mpu6050.h
    • 代码分析
  • DMP移植
    • 1.修改头文件路径为自己的头文件路径
    • 2.修改I2C读写函数为自己mcu平台的读写函数
    • 3.修改延时函数为自己平台的延时函数
    • 4.修改MPU6050的地址
  • 使用举例


工程代码
https://download.csdn.net/download/weixin_52849254/87886714

cubeide设置

在这里插入图片描述

I2C1通道可选择三种不同的通讯协议:I2C、SMBus-Alert-mode、SMBus-two-wire-Interface。
SMBus (System Management Bus,系统管理总线), 为系统和电源管理这样的任务提供了一条控制总线,SMBus与I2C总线之间在时序特性上存在一些差别
在这里插入图片描述

修改速度为50000
在这里插入图片描述

写操作与读操作函数实现

/**
  * @brief  Manages error callback by re-initializing I2C.
  * @param  Addr: I2C Address
  * @retval None
  */
static void I2Cx_Error(uint8_t Addr)
{
    /* 恢复I2C寄存器为默认值 */
    HAL_I2C_DeInit(&hi2c1);
    /* 重新初始化I2C外设 */
    MX_I2C1_Init();
}
/**
  * @brief  写寄存器,这是提供给上层的接口
    * @param  slave_addr: 从机地址
    * @param     reg_addr:寄存器地址
    * @param len:写入的长度
    *    @param data_ptr:指向要写入的数据
  * @retval 正常为0,不正常为非0
  */
int Sensors_I2C_WriteRegister(uint8_t slave_addr,
                                        uint8_t reg_addr,
                                        uint8_t len,
                                        uint8_t *data_ptr)
{
    HAL_StatusTypeDef status = HAL_OK;
    status = HAL_I2C_Mem_Write(&hi2c1, slave_addr, reg_addr, I2C_MEMADD_SIZE_8BIT,data_ptr, len,I2Cx_FLAG_TIMEOUT);
    /* 检查通讯状态 */
    if(status != HAL_OK)
    {
        /* 总线出错处理 */
        I2Cx_Error(slave_addr);
    }
    while (HAL_I2C_GetState(&hi2c1) != HAL_I2C_STATE_READY)
    {

    }
    /* 检查SENSOR是否就绪进行下一次读写操作 */
    while (HAL_I2C_IsDeviceReady(&hi2c1, slave_addr, I2Cx_FLAG_TIMEOUT, I2Cx_FLAG_TIMEOUT) == HAL_TIMEOUT);
    /* 等待传输结束 */
    while (HAL_I2C_GetState(&hi2c1) != HAL_I2C_STATE_READY)
    {

    }
    return status;
}

/**
  * @brief  读寄存器,这是提供给上层的接口
    * @param  slave_addr: 从机地址
    * @param     reg_addr:寄存器地址
    * @param len:要读取的长度
    *    @param data_ptr:指向要存储数据的指针
  * @retval 正常为0,不正常为非0
  */
int Sensors_I2C_ReadRegister(uint8_t slave_addr,
                                        uint8_t reg_addr,
                                        uint8_t len,
                                        uint8_t *data_ptr)
{
    HAL_StatusTypeDef status = HAL_OK;
    status =HAL_I2C_Mem_Read(&hi2c1,slave_addr,reg_addr,I2C_MEMADD_SIZE_8BIT,data_ptr,len,I2Cx_FLAG_TIMEOUT);
    /* 检查通讯状态 */
    if(status != HAL_OK)
    {
        /* 总线出错处理 */
        I2Cx_Error(slave_addr);
    }
    while (HAL_I2C_GetState(&hi2c1) != HAL_I2C_STATE_READY)
    {

    }
    /* 检查SENSOR是否就绪进行下一次读写操作 */
    while (HAL_I2C_IsDeviceReady(&hi2c1, slave_addr, I2Cx_FLAG_TIMEOUT, I2Cx_FLAG_TIMEOUT) == HAL_TIMEOUT);
    /* 等待传输结束 */
    while (HAL_I2C_GetState(&hi2c1) != HAL_I2C_STATE_READY)
    {

    }
    return status;
}

这段代码是关于使用I2C进行寄存器读写的函数实现。
首先,代码中定义了一个静态函数I2Cx_Error,用于处理I2C出错的情况。在函数中,首先通过调用HAL_I2C_DeInit函数将I2C寄存器恢复为默认值,然后调用MX_I2C1_Init函数重新初始化I2C外设。
接下来,代码包含了两个函数Sensors_I2C_WriteRegister和Sensors_I2C_ReadRegister,分别用于写寄存器和读寄存器操作。
Sensors_I2C_WriteRegister函数用于向从设备写入数据。它接受从设备地址(slave_addr)、寄存器地址(reg_addr)、要写入的数据长度(len)和指向要写入数据的指针(data_ptr)作为参数。在函数中,通过调用HAL_I2C_Mem_Write函数进行I2C的内存写操作。如果通信状态不正常,即status不等于HAL_OK,则调用I2Cx_Error函数进行错误处理。然后,通过循环等待I2C传输完成,并检查SENSOR是否就绪进行下一次读写操作。
Sensors_I2C_ReadRegister函数用于从从设备读取数据。它接受从设备地址(slave_addr)、寄存器地址(reg_addr)、要读取的数据长度(len)和指向存储数据的指针(data_ptr)作为参数。在函数中,通过调用HAL_I2C_Mem_Read函数进行I2C的内存读操作。如果通信状态不正常,即status不等于HAL_OK,则调用I2Cx_Error函数进行错误处理。然后,通过循环等待I2C传输完成,并检查SENSOR是否就绪进行下一次读写操作。
最后,函数返回status表示操作的状态。
综上所述,这段代码实现了使用I2C进行寄存器读写的功能,并在通信出错时进行了错误处理。

复位,读取温度,角度等函数封装

mpu6050.c

#include "mpu6050.h"
#include "usart.h"
#include "i2c.h"
#include "main.h"

#define MPU_ERROR         I2C_ERROR
#define MPU_INFO         I2C_INFO


/**
  * @brief   写数据到MPU6050寄存器
  * @param   reg_add:寄存器地址
    * @param     reg_data:要写入的数据
  * @retval  
  */
void MPU6050_WriteReg(uint8_t reg_add,uint8_t reg_dat)
{
    Sensors_I2C_WriteRegister(MPU6050_ADDRESS,reg_add,1,&reg_dat);
}

/**
  * @brief   从MPU6050寄存器读取数据
  * @param   reg_add:寄存器地址
    * @param     Read:存储数据的缓冲区
    * @param     num:要读取的数据量
  * @retval  
  */
void MPU6050_ReadData(uint8_t reg_add,unsigned char* Read,uint8_t num)
{
    Sensors_I2C_ReadRegister(MPU6050_ADDRESS,reg_add,num,Read);
}

/**
 * @brief       往MPU6050的指定寄存器写入一字节数据
 * @param       addr: MPU6050的IIC通讯地址
 *              reg : MPU6050寄存器地址
 *              dat : 写入的数据
 * @retval      MPU6050_EOK : 函数执行成功
 *              MPU6050_EACK: IIC通讯ACK错误,函数执行失败
 */
uint8_t mpu6050_write_byte(uint8_t addr, uint8_t reg, uint8_t dat)
{
    return Sensors_I2C_WriteRegister(addr, reg, 1, &dat);
}
/**
 * @brief       读取MPU6050指定寄存器的值
 * @param       addr: MPU6050的IIC通讯地址
 *              reg : MPU6050寄存器地址
 *              dat: 读取到的寄存器的值
 * @retval      MPU6050_EOK : 函数执行成功
 *              MPU6050_EACK: IIC通讯ACK错误,函数执行失败
 */
uint8_t mpu6050_read_byte(uint8_t addr, uint8_t reg, uint8_t *dat)
{
    return Sensors_I2C_ReadRegister(addr, reg, 1, dat);
}

/**
  * @brief   初始化MPU6050芯片
  * @param   
  * @retval  
  */
void MPU6050_Init(void)
{
    //在初始化之前要延时一段时间,若没有延时,则断电后再上电数据可能会出错
    Delay(100);
    MPU6050_WriteReg(MPU6050_RA_PWR_MGMT_1, 0x00);         //解除休眠状态
    MPU6050_WriteReg(MPU6050_RA_SMPLRT_DIV , 0x07);        //陀螺仪采样率
    MPU6050_WriteReg(MPU6050_RA_CONFIG , 0x06);    
    MPU6050_WriteReg(MPU6050_RA_ACCEL_CONFIG , 0x01);      //配置加速度传感器工作在4G模式
    MPU6050_WriteReg(MPU6050_RA_GYRO_CONFIG, 0x18);     //陀螺仪自检及测量范围,典型值:0x18(不自检,2000deg/s)
    Delay(200);
}

/**
  * @brief   读取MPU6050的ID
  * @param   
  * @retval  正常返回1,异常返回0
  */
uint8_t MPU6050ReadID(void)
{
    unsigned char Re = 0;
    MPU6050_ReadData(MPU6050_RA_WHO_AM_I,&Re,1);    //读器件地址
    printf("Re = %x\r\n",Re);
    if(Re != 0x68)
    {
        MPU_ERROR("MPU6050 dectected error!\r\n检测不到MPU6050模块,请检查模块与开发板的接线");
        return 0;
    }
    else
    {
        MPU_INFO("MPU6050 ID = %d\r\n",Re);
        return 1;
    }
        
}

/**
  * @brief   读取MPU6050的加速度数据
  * @param   
  * @retval  
  */
void MPU6050ReadAcc(short *accData)
{
    uint8_t buf[6];
    MPU6050_ReadData(MPU6050_ACC_OUT, buf, 6);
    accData[0] = (buf[0] << 8) | buf[1];
    accData[1] = (buf[2] << 8) | buf[3];
    accData[2] = (buf[4] << 8) | buf[5];
}

/**
  * @brief   读取MPU6050的角加速度数据
  * @param   
  * @retval  
  */
void MPU6050ReadGyro(short *gyroData)
{
    uint8_t buf[6];
    MPU6050_ReadData(MPU6050_GYRO_OUT,buf,6);
    gyroData[0] = (buf[0] << 8) | buf[1];
    gyroData[1] = (buf[2] << 8) | buf[3];
    gyroData[2] = (buf[4] << 8) | buf[5];
}

/**
  * @brief   读取MPU6050的原始温度数据
  * @param   
  * @retval  
  */
void MPU6050ReadTemp(short *tempData)
{
    uint8_t buf[2];
    MPU6050_ReadData(MPU6050_RA_GYRO_XOUT_H,buf,2);     //读取温度值
    *tempData = (buf[0] << 8) | buf[1];
}

/**
  * @brief   读取MPU6050的温度数据,转化成摄氏度
  * @param   
  * @retval  
  */
void MPU6050_ReturnTemp(float *Temperature)
{
    short temp3;
    uint8_t buf[2];
    
    MPU6050_ReadData(MPU6050_RA_GYRO_XOUT_H,buf,2);     //读取温度值
    temp3= (buf[0] << 8) | buf[1];    
    *Temperature=((double) temp3/340.0)+36.53;

}


/**
 * @brief       MPU6050软件复位
 * @param       无
 * @retval      无
 */
void mpu6050_sw_reset(void)
{
    mpu6050_write_byte(MPU6050_ADDRESS, MPU6050_RA_PWR_MGMT_1, 0x80);
    HAL_Delay(100);
    mpu6050_write_byte(MPU6050_ADDRESS, MPU6050_RA_PWR_MGMT_1, 0x00);
}

/**
 * @brief       MPU6050设置陀螺仪传感器量程范围
 * @param       frs: 0 --> ±250dps
 *                   1 --> ±500dps
 *                   2 --> ±1000dps
 *                   3 --> ±2000dps
 * @retval      MPU6050_EOK : 函数执行成功
 *              MPU6050_EACK: IIC通讯ACK错误,函数执行失败
 */
uint8_t mpu6050_set_gyro_fsr(uint8_t fsr)
{
    return mpu6050_write_byte(MPU6050_ADDRESS, MPU6050_RA_GYRO_CONFIG, fsr << 3);
}

/**
 * @brief       MPU6050设置加速度传感器量程范围
 * @param       frs: 0 --> ±2g
 *                   1 --> ±4g
 *                   2 --> ±8g
 *                   3 --> ±16g
 * @retval      MPU6050_EOK : 函数执行成功
 *              MPU6050_EACK: IIC通讯ACK错误,函数执行失败
 */
uint8_t mpu6050_set_accel_fsr(uint8_t fsr)
{
    return mpu6050_write_byte(MPU6050_ADDRESS, MPU6050_RA_ACCEL_CONFIG, fsr << 3);
}

/**
 * @brief       MPU6050设置数字低通滤波器频率
 * @param       lpf: 数字低通滤波器的频率(Hz)
 * @retval      MPU6050_EOK : 函数执行成功
 *              MPU6050_EACK: IIC通讯ACK错误,函数执行失败
 */
uint8_t mpu6050_set_lpf(uint16_t lpf)
{
    uint8_t dat;

    if (lpf >= 188)
    {
        dat = 1;
    }
    else if (lpf >= 98)
    {
        dat = 2;
    }
    else if (lpf >= 42)
    {
        dat = 3;
    }
    else if (lpf >= 20)
    {
        dat = 4;
    }
    else if (lpf >= 10)
    {
        dat = 5;
    }
    else
    {
        dat = 6;
    }

    return mpu6050_write_byte(MPU6050_ADDRESS, MPU6050_RA_CONFIG, dat);
}

/**
 * @brief       MPU6050设置采样率
 * @param       rate: 采样率(4~1000Hz)
 * @retval      MPU6050_EOK : 函数执行成功
 *              MPU6050_EACK: IIC通讯ACK错误,函数执行失败
 */
uint8_t mpu6050_set_rate(uint16_t rate)
{
    uint8_t ret;
    uint8_t dat;

    if (rate > 1000)
    {
        rate = 1000;
    }

    if (rate < 4)
    {
        rate = 4;
    }

    dat = 1000 / rate - 1;
    ret = mpu6050_write_byte(MPU6050_ADDRESS, MPU6050_RA_SMPLRT_DIV, dat);
    if (ret != MPU6050_EOK)
    {
        return ret;
    }

    ret = mpu6050_set_lpf(rate >> 1);
    if (ret != MPU6050_EOK)
    {
        return ret;
    }

    return MPU6050_EOK;
}

/**
 * @brief       MPU6050获取温度值
 * @param       temperature: 获取到的温度值(扩大了100倍)
 * @retval      MPU6050_EOK : 函数执行成功
 *              MPU6050_EACK: IIC通讯ACK错误,函数执行失败
 */
uint8_t mpu6050_get_temperature(int16_t *temp)
{
    uint8_t dat[2];
    uint8_t ret;
    int16_t raw = 0;

    ret = Sensors_I2C_ReadRegister(MPU6050_ADDRESS, MPU6050_RA_TEMP_OUT_H, 2, dat);
    if (ret == MPU6050_EOK)
    {
        raw = ((uint16_t)dat[0] << 8) | dat[1];
        *temp = (int16_t)((36.53f + ((float)raw / 340)) * 100);
    }

    return ret;
}

/**
 * @brief       MPU6050获取陀螺仪值
 * @param       gx,gy,gz: 陀螺仪x、y、z轴的原始度数(带符号)
 * @retval      MPU6050_EOK : 函数执行成功
 *              MPU6050_EACK: IIC通讯ACK错误,函数执行失败
 */
uint8_t mpu6050_get_gyroscope(int16_t *gx, int16_t *gy, int16_t *gz)
{
    uint8_t dat[6];
    uint8_t ret;

    ret =  Sensors_I2C_ReadRegister(MPU6050_ADDRESS, MPU6050_RA_GYRO_XOUT_H, 6, dat);
    if (ret == MPU6050_EOK)
    {
        *gx = ((uint16_t)dat[0] << 8) | dat[1];
        *gy = ((uint16_t)dat[2] << 8) | dat[3];
        *gz = ((uint16_t)dat[4] << 8) | dat[5];
    }

    return ret;
}

/**
 * @brief       MPU6050获取加速度值
 * @param       ax,ay,az: 加速度x、y、z轴的原始度数(带符号)
 * @retval      MPU6050_EOK : 函数执行成功
 *              MPU6050_EACK: IIC通讯ACK错误,函数执行失败
 */
uint8_t mpu6050_get_accelerometer(int16_t *ax, int16_t *ay, int16_t *az)
{
    uint8_t dat[6];
    uint8_t ret;

    ret =  Sensors_I2C_ReadRegister(MPU6050_ADDRESS, MPU6050_RA_ACCEL_XOUT_H, 6, dat);
    if (ret == MPU6050_EOK)
    {
        *ax = ((uint16_t)dat[0] << 8) | dat[1];
        *ay = ((uint16_t)dat[2] << 8) | dat[3];
        *az = ((uint16_t)dat[4] << 8) | dat[5];
    }

    return ret;
}

/**
 * @brief       MPU6050初始化
 * @param       无
 * @retval      MPU6050_EOK: 函数执行成功
 *              MPU6050_EID: 获取ID错误,函数执行失败
 */
uint8_t mpu6050_init(void)
{
    uint8_t id;

//    mpu6050_hw_init();                                                   /* MPU6050硬件初始化 */
//    mpu6050_iic_init();                                                  /* 初始化IIC接口 */
    mpu6050_sw_reset();                                                  /* MPU6050软件复位 */
    mpu6050_set_gyro_fsr(3);                                             /* 陀螺仪传感器,±2000dps */
    mpu6050_set_accel_fsr(0);                                            /* 加速度传感器,±2g */
    mpu6050_set_rate(50);                                                /* 采样率,50Hz */
    mpu6050_write_byte(MPU6050_ADDRESS, MPU6050_RA_INT_ENABLE, 0X00);       /* 关闭所有中断 */
    mpu6050_write_byte(MPU6050_ADDRESS, MPU6050_RA_USER_CTRL, 0X00);    /* 关闭IIC主模式 */
    mpu6050_write_byte(MPU6050_ADDRESS, MPU6050_RA_FIFO_EN, 0X00);      /* 关闭FIFO */
    mpu6050_write_byte(MPU6050_ADDRESS, MPU6050_RA_INT_PIN_CFG, 0X80);    /* INT引脚低电平有效 */
    mpu6050_read_byte(MPU6050_ADDRESS, MPU6050_WHO_AM_I, &id);      /* 读取设备ID */
    printf("id = %d\r\n",id);
    if (id != 0x68)
    {
        return MPU6050_EID;
    }
    mpu6050_write_byte(MPU6050_ADDRESS, MPU6050_RA_PWR_MGMT_1, 0x01);    /* 设置CLKSEL,PLL X轴为参考 */
    mpu6050_write_byte(MPU6050_ADDRESS, MPU6050_RA_PWR_MGMT_2, 0x00);    /* 加速度与陀螺仪都工作 */
    mpu6050_set_rate(50);                                                /* 采样率,50Hz */

    return MPU6050_EOK;
}

mpu6050.h

#ifndef __MPU6050_H
#define __MPU6050_H
#include "main.h"

// MPU6050, Standard address 0x68
#define MPU6050_ADDRESS         0xD0
//
#define MPU6050_WHO_AM_I        0x75
#define MPU6050_SMPLRT_DIV      0  //8000Hz
#define MPU6050_DLPF_CFG        0
#define MPU6050_GYRO_OUT        0x43     //MPU6050陀螺仪数据寄存器地址
#define MPU6050_ACC_OUT         0x3B     //MPU6050加速度数据寄存器地址


#define MPU6050_RA_XG_OFFS_TC       0x00 //[7] PWR_MODE, [6:1] XG_OFFS_TC, [0] OTP_BNK_VLD
#define MPU6050_RA_YG_OFFS_TC       0x01 //[7] PWR_MODE, [6:1] YG_OFFS_TC, [0] OTP_BNK_VLD
#define MPU6050_RA_ZG_OFFS_TC       0x02 //[7] PWR_MODE, [6:1] ZG_OFFS_TC, [0] OTP_BNK_VLD
#define MPU6050_RA_X_FINE_GAIN      0x03 //[7:0] X_FINE_GAIN
#define MPU6050_RA_Y_FINE_GAIN      0x04 //[7:0] Y_FINE_GAIN
#define MPU6050_RA_Z_FINE_GAIN      0x05 //[7:0] Z_FINE_GAIN
#define MPU6050_RA_XA_OFFS_H        0x06 //[15:0] XA_OFFS
#define MPU6050_RA_XA_OFFS_L_TC     0x07
#define MPU6050_RA_YA_OFFS_H        0x08 //[15:0] YA_OFFS
#define MPU6050_RA_YA_OFFS_L_TC     0x09
#define MPU6050_RA_ZA_OFFS_H        0x0A //[15:0] ZA_OFFS
#define MPU6050_RA_ZA_OFFS_L_TC     0x0B
#define MPU6050_RA_XG_OFFS_USRH     0x13 //[15:0] XG_OFFS_USR
#define MPU6050_RA_XG_OFFS_USRL     0x14
#define MPU6050_RA_YG_OFFS_USRH     0x15 //[15:0] YG_OFFS_USR
#define MPU6050_RA_YG_OFFS_USRL     0x16
#define MPU6050_RA_ZG_OFFS_USRH     0x17 //[15:0] ZG_OFFS_USR
#define MPU6050_RA_ZG_OFFS_USRL     0x18
#define MPU6050_RA_SMPLRT_DIV       0x19        // 采样频率分频器
#define MPU6050_RA_CONFIG           0x1A         // 配置寄存器
#define MPU6050_RA_GYRO_CONFIG      0x1B        // 陀螺仪配置寄存器
#define MPU6050_RA_ACCEL_CONFIG     0x1C        // 加速度计配置寄存器
#define MPU6050_RA_FF_THR           0x1D
#define MPU6050_RA_FF_DUR           0x1E
#define MPU6050_RA_MOT_THR          0x1F    // 运动检测阀值设置寄存器
#define MPU6050_RA_MOT_DUR          0x20
#define MPU6050_RA_ZRMOT_THR        0x21
#define MPU6050_RA_ZRMOT_DUR        0x22
#define MPU6050_RA_FIFO_EN          0x23    // FIFO使能寄存器
#define MPU6050_RA_I2C_MST_CTRL     0x24
#define MPU6050_RA_I2C_SLV0_ADDR    0x25
#define MPU6050_RA_I2C_SLV0_REG     0x26
#define MPU6050_RA_I2C_SLV0_CTRL    0x27
#define MPU6050_RA_I2C_SLV1_ADDR    0x28
#define MPU6050_RA_I2C_SLV1_REG     0x29
#define MPU6050_RA_I2C_SLV1_CTRL    0x2A
#define MPU6050_RA_I2C_SLV2_ADDR    0x2B
#define MPU6050_RA_I2C_SLV2_REG     0x2C
#define MPU6050_RA_I2C_SLV2_CTRL    0x2D
#define MPU6050_RA_I2C_SLV3_ADDR    0x2E
#define MPU6050_RA_I2C_SLV3_REG     0x2F
#define MPU6050_RA_I2C_SLV3_CTRL    0x30
#define MPU6050_RA_I2C_SLV4_ADDR    0x31
#define MPU6050_RA_I2C_SLV4_REG     0x32
#define MPU6050_RA_I2C_SLV4_DO      0x33
#define MPU6050_RA_I2C_SLV4_CTRL    0x34
#define MPU6050_RA_I2C_SLV4_DI      0x35
#define MPU6050_RA_I2C_MST_STATUS   0x36
#define MPU6050_RA_INT_PIN_CFG      0x37    // 中断/旁路设置寄存器
#define MPU6050_RA_INT_ENABLE       0x38    // 中断使能寄存器
#define MPU6050_RA_DMP_INT_STATUS   0x39
#define MPU6050_RA_INT_STATUS       0x3A
#define MPU6050_RA_ACCEL_XOUT_H     0x3B     // 加速度值,X轴高8位寄存器
#define MPU6050_RA_ACCEL_XOUT_L     0x3C
#define MPU6050_RA_ACCEL_YOUT_H     0x3D
#define MPU6050_RA_ACCEL_YOUT_L     0x3E
#define MPU6050_RA_ACCEL_ZOUT_H     0x3F
#define MPU6050_RA_ACCEL_ZOUT_L     0x40
#define MPU6050_RA_TEMP_OUT_H       0x41    // 温度值高八位寄存器
#define MPU6050_RA_TEMP_OUT_L       0x42
#define MPU6050_RA_GYRO_XOUT_H      0x43    // 陀螺仪值,X轴高8位寄存器
#define MPU6050_RA_GYRO_XOUT_L      0x44
#define MPU6050_RA_GYRO_YOUT_H      0x45
#define MPU6050_RA_GYRO_YOUT_L      0x46
#define MPU6050_RA_GYRO_ZOUT_H      0x47
#define MPU6050_RA_GYRO_ZOUT_L      0x48
#define MPU6050_RA_EXT_SENS_DATA_00 0x49
#define MPU6050_RA_EXT_SENS_DATA_01 0x4A
#define MPU6050_RA_EXT_SENS_DATA_02 0x4B
#define MPU6050_RA_EXT_SENS_DATA_03 0x4C
#define MPU6050_RA_EXT_SENS_DATA_04 0x4D
#define MPU6050_RA_EXT_SENS_DATA_05 0x4E
#define MPU6050_RA_EXT_SENS_DATA_06 0x4F
#define MPU6050_RA_EXT_SENS_DATA_07 0x50
#define MPU6050_RA_EXT_SENS_DATA_08 0x51
#define MPU6050_RA_EXT_SENS_DATA_09 0x52
#define MPU6050_RA_EXT_SENS_DATA_10 0x53
#define MPU6050_RA_EXT_SENS_DATA_11 0x54
#define MPU6050_RA_EXT_SENS_DATA_12 0x55
#define MPU6050_RA_EXT_SENS_DATA_13 0x56
#define MPU6050_RA_EXT_SENS_DATA_14 0x57
#define MPU6050_RA_EXT_SENS_DATA_15 0x58
#define MPU6050_RA_EXT_SENS_DATA_16 0x59
#define MPU6050_RA_EXT_SENS_DATA_17 0x5A
#define MPU6050_RA_EXT_SENS_DATA_18 0x5B
#define MPU6050_RA_EXT_SENS_DATA_19 0x5C
#define MPU6050_RA_EXT_SENS_DATA_20 0x5D
#define MPU6050_RA_EXT_SENS_DATA_21 0x5E
#define MPU6050_RA_EXT_SENS_DATA_22 0x5F
#define MPU6050_RA_EXT_SENS_DATA_23 0x60
#define MPU6050_RA_MOT_DETECT_STATUS    0x61
#define MPU6050_RA_I2C_SLV0_DO      0x63
#define MPU6050_RA_I2C_SLV1_DO      0x64
#define MPU6050_RA_I2C_SLV2_DO      0x65
#define MPU6050_RA_I2C_SLV3_DO      0x66
#define MPU6050_RA_I2C_MST_DELAY_CTRL   0x67
#define MPU6050_RA_SIGNAL_PATH_RESET    0x68
#define MPU6050_RA_MOT_DETECT_CTRL      0x69
#define MPU6050_RA_USER_CTRL        0x6A    // 用户控制寄存器
#define MPU6050_RA_PWR_MGMT_1       0x6B    // 电源管理寄存器1
#define MPU6050_RA_PWR_MGMT_2       0x6C    // 电源管理寄存器2
#define MPU6050_RA_BANK_SEL         0x6D
#define MPU6050_RA_MEM_START_ADDR   0x6E
#define MPU6050_RA_MEM_R_W          0x6F
#define MPU6050_RA_DMP_CFG_1        0x70
#define MPU6050_RA_DMP_CFG_2        0x71
#define MPU6050_RA_FIFO_COUNTH      0x72
#define MPU6050_RA_FIFO_COUNTL      0x73
#define MPU6050_RA_FIFO_R_W         0x74
#define MPU6050_RA_WHO_AM_I         0x75    // 器件ID寄存器

#define MPU6050_TC_PWR_MODE_BIT     7
#define MPU6050_TC_OFFSET_BIT       6
#define MPU6050_TC_OFFSET_LENGTH    6
#define MPU6050_TC_OTP_BNK_VLD_BIT  0

#define MPU6050_VDDIO_LEVEL_VLOGIC  0
#define MPU6050_VDDIO_LEVEL_VDD     1

#define MPU6050_CFG_EXT_SYNC_SET_BIT    5
#define MPU6050_CFG_EXT_SYNC_SET_LENGTH 3
#define MPU6050_CFG_DLPF_CFG_BIT    2
#define MPU6050_CFG_DLPF_CFG_LENGTH 3

#define MPU6050_EXT_SYNC_DISABLED       0x0
#define MPU6050_EXT_SYNC_TEMP_OUT_L     0x1
#define MPU6050_EXT_SYNC_GYRO_XOUT_L    0x2
#define MPU6050_EXT_SYNC_GYRO_YOUT_L    0x3
#define MPU6050_EXT_SYNC_GYRO_ZOUT_L    0x4
#define MPU6050_EXT_SYNC_ACCEL_XOUT_L   0x5
#define MPU6050_EXT_SYNC_ACCEL_YOUT_L   0x6
#define MPU6050_EXT_SYNC_ACCEL_ZOUT_L   0x7

#define MPU6050_DLPF_BW_256         0x00
#define MPU6050_DLPF_BW_188         0x01
#define MPU6050_DLPF_BW_98          0x02
#define MPU6050_DLPF_BW_42          0x03
#define MPU6050_DLPF_BW_20          0x04
#define MPU6050_DLPF_BW_10          0x05
#define MPU6050_DLPF_BW_5           0x06

#define MPU6050_GCONFIG_FS_SEL_BIT      4
#define MPU6050_GCONFIG_FS_SEL_LENGTH   2

#define MPU6050_GYRO_FS_250         0x00
#define MPU6050_GYRO_FS_500         0x01
#define MPU6050_GYRO_FS_1000        0x02
#define MPU6050_GYRO_FS_2000        0x03

#define MPU6050_ACONFIG_XA_ST_BIT           7
#define MPU6050_ACONFIG_YA_ST_BIT           6
#define MPU6050_ACONFIG_ZA_ST_BIT           5
#define MPU6050_ACONFIG_AFS_SEL_BIT         4
#define MPU6050_ACONFIG_AFS_SEL_LENGTH      2
#define MPU6050_ACONFIG_ACCEL_HPF_BIT       2
#define MPU6050_ACONFIG_ACCEL_HPF_LENGTH    3

#define MPU6050_ACCEL_FS_2          0x00
#define MPU6050_ACCEL_FS_4          0x01
#define MPU6050_ACCEL_FS_8          0x02
#define MPU6050_ACCEL_FS_16         0x03

#define MPU6050_DHPF_RESET          0x00
#define MPU6050_DHPF_5              0x01
#define MPU6050_DHPF_2P5            0x02
#define MPU6050_DHPF_1P25           0x03
#define MPU6050_DHPF_0P63           0x04
#define MPU6050_DHPF_HOLD           0x07

#define MPU6050_TEMP_FIFO_EN_BIT    7
#define MPU6050_XG_FIFO_EN_BIT      6
#define MPU6050_YG_FIFO_EN_BIT      5
#define MPU6050_ZG_FIFO_EN_BIT      4
#define MPU6050_ACCEL_FIFO_EN_BIT   3
#define MPU6050_SLV2_FIFO_EN_BIT    2
#define MPU6050_SLV1_FIFO_EN_BIT    1
#define MPU6050_SLV0_FIFO_EN_BIT    0

#define MPU6050_MULT_MST_EN_BIT     7
#define MPU6050_WAIT_FOR_ES_BIT     6
#define MPU6050_SLV_3_FIFO_EN_BIT   5
#define MPU6050_I2C_MST_P_NSR_BIT   4
#define MPU6050_I2C_MST_CLK_BIT     3
#define MPU6050_I2C_MST_CLK_LENGTH  4

#define MPU6050_CLOCK_DIV_348       0x0
#define MPU6050_CLOCK_DIV_333       0x1
#define MPU6050_CLOCK_DIV_320       0x2
#define MPU6050_CLOCK_DIV_308       0x3
#define MPU6050_CLOCK_DIV_296       0x4
#define MPU6050_CLOCK_DIV_286       0x5
#define MPU6050_CLOCK_DIV_276       0x6
#define MPU6050_CLOCK_DIV_267       0x7
#define MPU6050_CLOCK_DIV_258       0x8
#define MPU6050_CLOCK_DIV_500       0x9
#define MPU6050_CLOCK_DIV_471       0xA
#define MPU6050_CLOCK_DIV_444       0xB
#define MPU6050_CLOCK_DIV_421       0xC
#define MPU6050_CLOCK_DIV_400       0xD
#define MPU6050_CLOCK_DIV_381       0xE
#define MPU6050_CLOCK_DIV_364       0xF

#define MPU6050_I2C_SLV_RW_BIT      7
#define MPU6050_I2C_SLV_ADDR_BIT    6
#define MPU6050_I2C_SLV_ADDR_LENGTH 7
#define MPU6050_I2C_SLV_EN_BIT      7
#define MPU6050_I2C_SLV_BYTE_SW_BIT 6
#define MPU6050_I2C_SLV_REG_DIS_BIT 5
#define MPU6050_I2C_SLV_GRP_BIT     4
#define MPU6050_I2C_SLV_LEN_BIT     3
#define MPU6050_I2C_SLV_LEN_LENGTH  4

#define MPU6050_I2C_SLV4_RW_BIT         7
#define MPU6050_I2C_SLV4_ADDR_BIT       6
#define MPU6050_I2C_SLV4_ADDR_LENGTH    7
#define MPU6050_I2C_SLV4_EN_BIT         7
#define MPU6050_I2C_SLV4_INT_EN_BIT     6
#define MPU6050_I2C_SLV4_REG_DIS_BIT    5
#define MPU6050_I2C_SLV4_MST_DLY_BIT    4
#define MPU6050_I2C_SLV4_MST_DLY_LENGTH 5

#define MPU6050_MST_PASS_THROUGH_BIT    7
#define MPU6050_MST_I2C_SLV4_DONE_BIT   6
#define MPU6050_MST_I2C_LOST_ARB_BIT    5
#define MPU6050_MST_I2C_SLV4_NACK_BIT   4
#define MPU6050_MST_I2C_SLV3_NACK_BIT   3
#define MPU6050_MST_I2C_SLV2_NACK_BIT   2
#define MPU6050_MST_I2C_SLV1_NACK_BIT   1
#define MPU6050_MST_I2C_SLV0_NACK_BIT   0

#define MPU6050_INTCFG_INT_LEVEL_BIT        7
#define MPU6050_INTCFG_INT_OPEN_BIT         6
#define MPU6050_INTCFG_LATCH_INT_EN_BIT     5
#define MPU6050_INTCFG_INT_RD_CLEAR_BIT     4
#define MPU6050_INTCFG_FSYNC_INT_LEVEL_BIT  3
#define MPU6050_INTCFG_FSYNC_INT_EN_BIT     2
#define MPU6050_INTCFG_I2C_BYPASS_EN_BIT    1
#define MPU6050_INTCFG_CLKOUT_EN_BIT        0

#define MPU6050_INTMODE_ACTIVEHIGH  0x00
#define MPU6050_INTMODE_ACTIVELOW   0x01

#define MPU6050_INTDRV_PUSHPULL     0x00
#define MPU6050_INTDRV_OPENDRAIN    0x01

#define MPU6050_INTLATCH_50USPULSE  0x00
#define MPU6050_INTLATCH_WAITCLEAR  0x01

#define MPU6050_INTCLEAR_STATUSREAD 0x00
#define MPU6050_INTCLEAR_ANYREAD    0x01

#define MPU6050_INTERRUPT_FF_BIT            7
#define MPU6050_INTERRUPT_MOT_BIT           6
#define MPU6050_INTERRUPT_ZMOT_BIT          5
#define MPU6050_INTERRUPT_FIFO_OFLOW_BIT    4
#define MPU6050_INTERRUPT_I2C_MST_INT_BIT   3
#define MPU6050_INTERRUPT_PLL_RDY_INT_BIT   2
#define MPU6050_INTERRUPT_DMP_INT_BIT       1
#define MPU6050_INTERRUPT_DATA_RDY_BIT      0

// TODO: figure out what these actually do
// UMPL source code is not very obivous
#define MPU6050_DMPINT_5_BIT            5
#define MPU6050_DMPINT_4_BIT            4
#define MPU6050_DMPINT_3_BIT            3
#define MPU6050_DMPINT_2_BIT            2
#define MPU6050_DMPINT_1_BIT            1
#define MPU6050_DMPINT_0_BIT            0

#define MPU6050_MOTION_MOT_XNEG_BIT     7
#define MPU6050_MOTION_MOT_XPOS_BIT     6
#define MPU6050_MOTION_MOT_YNEG_BIT     5
#define MPU6050_MOTION_MOT_YPOS_BIT     4
#define MPU6050_MOTION_MOT_ZNEG_BIT     3
#define MPU6050_MOTION_MOT_ZPOS_BIT     2
#define MPU6050_MOTION_MOT_ZRMOT_BIT    0

#define MPU6050_DELAYCTRL_DELAY_ES_SHADOW_BIT   7
#define MPU6050_DELAYCTRL_I2C_SLV4_DLY_EN_BIT   4
#define MPU6050_DELAYCTRL_I2C_SLV3_DLY_EN_BIT   3
#define MPU6050_DELAYCTRL_I2C_SLV2_DLY_EN_BIT   2
#define MPU6050_DELAYCTRL_I2C_SLV1_DLY_EN_BIT   1
#define MPU6050_DELAYCTRL_I2C_SLV0_DLY_EN_BIT   0

#define MPU6050_PATHRESET_GYRO_RESET_BIT    2
#define MPU6050_PATHRESET_ACCEL_RESET_BIT   1
#define MPU6050_PATHRESET_TEMP_RESET_BIT    0

#define MPU6050_DETECT_ACCEL_ON_DELAY_BIT       5
#define MPU6050_DETECT_ACCEL_ON_DELAY_LENGTH    2
#define MPU6050_DETECT_FF_COUNT_BIT             3
#define MPU6050_DETECT_FF_COUNT_LENGTH          2
#define MPU6050_DETECT_MOT_COUNT_BIT            1
#define MPU6050_DETECT_MOT_COUNT_LENGTH         2

#define MPU6050_DETECT_DECREMENT_RESET  0x0
#define MPU6050_DETECT_DECREMENT_1      0x1
#define MPU6050_DETECT_DECREMENT_2      0x2
#define MPU6050_DETECT_DECREMENT_4      0x3

#define MPU6050_USERCTRL_DMP_EN_BIT             7
#define MPU6050_USERCTRL_FIFO_EN_BIT            6
#define MPU6050_USERCTRL_I2C_MST_EN_BIT         5
#define MPU6050_USERCTRL_I2C_IF_DIS_BIT         4
#define MPU6050_USERCTRL_DMP_RESET_BIT          3
#define MPU6050_USERCTRL_FIFO_RESET_BIT         2
#define MPU6050_USERCTRL_I2C_MST_RESET_BIT      1
#define MPU6050_USERCTRL_SIG_COND_RESET_BIT     0

#define MPU6050_PWR1_DEVICE_RESET_BIT   7
#define MPU6050_PWR1_SLEEP_BIT          6
#define MPU6050_PWR1_CYCLE_BIT          5
#define MPU6050_PWR1_TEMP_DIS_BIT       3
#define MPU6050_PWR1_CLKSEL_BIT         2
#define MPU6050_PWR1_CLKSEL_LENGTH      3

#define MPU6050_CLOCK_INTERNAL          0x00
#define MPU6050_CLOCK_PLL_XGYRO         0x01
#define MPU6050_CLOCK_PLL_YGYRO         0x02
#define MPU6050_CLOCK_PLL_ZGYRO         0x03
#define MPU6050_CLOCK_PLL_EXT32K        0x04
#define MPU6050_CLOCK_PLL_EXT19M        0x05
#define MPU6050_CLOCK_KEEP_RESET        0x07

#define MPU6050_PWR2_LP_WAKE_CTRL_BIT       7
#define MPU6050_PWR2_LP_WAKE_CTRL_LENGTH    2
#define MPU6050_PWR2_STBY_XA_BIT            5
#define MPU6050_PWR2_STBY_YA_BIT            4
#define MPU6050_PWR2_STBY_ZA_BIT            3
#define MPU6050_PWR2_STBY_XG_BIT            2
#define MPU6050_PWR2_STBY_YG_BIT            1
#define MPU6050_PWR2_STBY_ZG_BIT            0

#define MPU6050_WAKE_FREQ_1P25      0x0
#define MPU6050_WAKE_FREQ_2P5       0x1
#define MPU6050_WAKE_FREQ_5         0x2
#define MPU6050_WAKE_FREQ_10        0x3

#define MPU6050_BANKSEL_PRFTCH_EN_BIT       6
#define MPU6050_BANKSEL_CFG_USER_BANK_BIT   5
#define MPU6050_BANKSEL_MEM_SEL_BIT         4
#define MPU6050_BANKSEL_MEM_SEL_LENGTH      5

#define MPU6050_WHO_AM_I_BIT        6
#define MPU6050_WHO_AM_I_LENGTH     6

#define MPU6050_DMP_MEMORY_BANKS        8
#define MPU6050_DMP_MEMORY_BANK_SIZE    256
#define MPU6050_DMP_MEMORY_CHUNK_SIZE   16

void MPU6050ReadTemp(short *tempData);
void MPU6050ReadGyro(short *gyroData);
void MPU6050ReadAcc(short *accData);
void MPU6050_ReturnTemp(float*Temperature);
void MPU6050_Init(void);
uint8_t MPU6050ReadID(void);
void MPU6050_WriteReg(uint8_t reg_add,uint8_t reg_dat);
void MPU6050_ReadData(uint8_t reg_add,unsigned char* Read,uint8_t num);

void MPU6050_PWR_MGMT_1_INIT(void);


/* 操作函数 */
uint8_t mpu6050_write(uint8_t addr, uint8_t reg, uint8_t len, uint8_t *dat); /* 往ATK-MS6050的指定寄存器连续写入指定数据 */
uint8_t mpu6050_write_byte(uint8_t addr, uint8_t reg, uint8_t dat);          /* 往ATK-MS6050的指定寄存器写入一字节数据 */
uint8_t mpu6050_read(uint8_t addr, uint8_t reg, uint8_t len, uint8_t *dat);  /* 连续读取ATK-MS6050指定寄存器的值 */
uint8_t mpu6050_read_byte(uint8_t addr, uint8_t reg, uint8_t *dat);          /* 读取ATK-MS6050指定寄存器的值 */
void mpu6050_sw_reset(void);                                                 /* ATK-MS6050软件复位 */
uint8_t mpu6050_set_gyro_fsr(uint8_t fsr);                                   /* ATK-MS6050设置陀螺仪传感器量程范围 */
uint8_t mpu6050_set_accel_fsr(uint8_t fsr);                                  /* ATK-MS6050设置加速度传感器量程范围 */
uint8_t mpu6050_set_lpf(uint16_t lpf);                                       /* ATK-MS6050设置数字低通滤波器频率 */
uint8_t mpu6050_set_rate(uint16_t rate);                                     /* ATK-MS6050设置采样率 */
uint8_t mpu6050_get_temperature(int16_t *temp);                              /* ATK-MS6050获取温度值 */
uint8_t mpu6050_get_gyroscope(int16_t *gx, int16_t *gy, int16_t *gz);        /* ATK-MS6050获取陀螺仪值 */
uint8_t mpu6050_get_accelerometer(int16_t *ax, int16_t *ay, int16_t *az);    /* ATK-MS6050获取加速度值 */
uint8_t mpu6050_init(void);


/* 函数错误代码 */
#define MPU6050_EOK      0   /* 没有错误 */
#define MPU6050_EID      1   /* ID错误 */
#define MPU6050_EACK     2   /* IIC通讯ACK错误 */

#endif  /*__MPU6050*/

代码分析

主要涉及与MPU6050传感器通信和配置相关的函数。以下是对每个函数的简要说明:
MPU6050_WriteReg(uint8_t reg_add,uint8_t reg_dat): 将数据写入MPU6050寄存器的函数。
MPU6050_ReadData(uint8_t reg_add,unsigned char* Read,uint8_t num): 从MPU6050寄存器读取数据的函数。
mpu6050_write_byte(uint8_t addr, uint8_t reg, uint8_t dat): 向MPU6050指定寄存器写入一字节数据的函数。
mpu6050_read_byte(uint8_t addr, uint8_t reg, uint8_t *dat): 读取MPU6050指定寄存器的值的函数。
MPU6050_Init(void): 初始化MPU6050芯片的函数,包括解除休眠状态和配置传感器参数等。
MPU6050ReadID(void): 读取MPU6050的ID,并检查是否能够正确识别MPU6050模块。
MPU6050ReadAcc(short *accData): 读取MPU6050的加速度数据。
MPU6050ReadGyro(short *gyroData): 读取MPU6050的角加速度数据。
MPU6050ReadTemp(short *tempData): 读取MPU6050的原始温度数据。
MPU6050_ReturnTemp(float *Temperature): 将读取到的温度数据转化为摄氏度。
mpu6050_sw_reset(void): 执行MPU6050的软件复位操作。
mpu6050_set_gyro_fsr(uint8_t fsr): 设置MPU6050陀螺仪传感器的量程范围。
mpu6050_set_accel_fsr(uint8_t fsr): 设置MPU6050加速度传感器的量程范围。
mpu6050_set_lpf(uint16_t lpf): 设置MPU6050的数字低通滤波器频率。
mpu6050_set_rate(uint16_t rate): 设置MPU6050的采样率。
mpu6050_get_temperature(int16_t *temp): 获取MPU6050的温度值。
mpu6050_get_gyroscope(int16_t *gx, int16_t *gy, int16_t *gz): 获取MPU6050的陀螺仪值。
mpu6050_get_accelerometer(int16_t *ax, int16_t *ay, int16_t *az): 获取MPU6050的加速度值。
mpu6050_init(void): 对MPU6050进行初始化的函数。
这些函数可以用于控制和读取MPU6050传感器的数据。请确保正确连接MPU6050模块,并在代码中适当调用这些函数来实现您的应用逻

DMP移植

先获取到移植所需的文件,我使用的文件来自正点原子陀螺仪资料,见文件添加进工程,再进行自己mcu的适配修改
在这里插入图片描述

1.修改头文件路径为自己的头文件路径

inv_mpu.c
在这里插入图片描述

修改
在这里插入图片描述

inv_mpu_dmp_motion_driver.c

在这里插入图片描述

修改
在这里插入图片描述

2.修改I2C读写函数为自己mcu平台的读写函数

inv_mpu.c
在这里插入图片描述

修改为
在这里插入图片描述

3.修改延时函数为自己平台的延时函数

inv_mpu.c
在这里插入图片描述

修改为
在这里插入图片描述

inv_mpu_dmp_motion_driver.c
在这里插入图片描述

修改
在这里插入图片描述

4.修改MPU6050的地址

mpu6050.h
修改MPU6050地址为0XD0
在这里插入图片描述

inv_mpu.c
修改MPU6050地址为0XD0
在这里插入图片描述

软件I2C读取时不需要修改这个地址

使用举例

  /* 初始化MPU6050 */
    PRINT_LOG("<<File:%s  Line:%d  Function:%s>>\r\n ", __FILE__, __LINE__, __FUNCTION__);
       int ret = 0;
    float pit, rol, yaw;
    int16_t acc_x, acc_y, acc_z;
    int16_t gyr_x, gyr_y, gyr_z;
    int16_t temp;
    ret = 1;

    ret = mpu6050_init();

    if (ret != 0)
    {
        PRINT_LOG("<<File:%s  Line:%d  Function:%s>>\r\n ", __FILE__, __LINE__, __FUNCTION__);
        printf("MPU6050 init failed!\r\n");

    }

    ret = 1;
    while(ret){
    /* 初始化MPU6050 DMP */
    ret = mpu6050_dmp_init();
    if (ret != 0)
    {
        printf("MPU6050 DMP init failed!\r\n");

    }

    }
    while (1)
    {


        /* 获取MPU6050 DMP处理后的数据 */
        ret  = mpu6050_dmp_get_data(&pit, &rol, &yaw);
        /* 获取MPU6050加速度值 */
        ret += mpu6050_get_accelerometer(&acc_x, &acc_y, &acc_z);
        /* 获取MPU6050陀螺仪值 */
        ret += mpu6050_get_gyroscope(&gyr_x, &gyr_y, &gyr_z);
        /* 获取MPU6050温度值 */
        ret += mpu6050_get_temperature(&temp);

                /* 上传相关数据信息至串口调试助手 */
                printf("pit: %.2f, rol: %.2f, yaw: %.2f,\r\n ", pit, rol, yaw);
                printf("acc_x: %d, acc_y: %d, acc_z: %d, \r\n", acc_x, acc_y, acc_z);
                printf("gyr_x: %d, gyr_y: %d, gyr_z: %d, \r\n", gyr_x, gyr_y, gyr_z);
                printf("temp: %d\r\n", temp);
                ret  = mpu6050_dmp_get_data(&pit, &rol, &yaw);
                printf("pit: %.2f, rol: %.2f, yaw: %.2f,\r\n ", pit, rol, yaw);

            HAL_Delay(5000);
//            mpu6050_init();
//            mpu6050_dmp_init();

    }

这段代码初始化了MPU6050传感器,并使用DMP(数字运动处理)模块获取传感器的姿态数据(俯仰、横滚和偏航),加速度数据,陀螺仪数据和温度数据。然后,它通过串口调试助手打印这些数据。在主循环中,代码等待5秒钟后重复获取和打印数据。
请注意,上述代码可能需要根据您的具体硬件配置和要求进行修改和适应。确保正确连接MPU6050模块,并根据您的需求进行必要的初始化和配置。

如果文章对您有帮助,点赞支持👍,感谢🤝

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/637971.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

6.12黄金何时走出区间震荡?后市如何布局

近期有哪些消息面影响黄金走势&#xff1f;下周黄金多空该如何研判&#xff1f; ​黄金消息面解析&#xff1a;周一(6月12日)亚市盘中&#xff0c;现货黄金维持震荡&#xff0c;金价现报1960美元/盎司。本周黄金交易员将迎来美国CPI数据以及美联储利率决议&#xff0c;预计将对…

vue3+ts+vite实现pinia

本篇文章主要从事3部分 单个store下的文件进行使用模块下进行使用(pinia不像vuex那样使用模块化了 直接在store下定义ts文件即可)pinia持久化使用 安装pinia : cnpm install pinia 安装持久化 cnpm install pinia-plugin-persistedstate 1.单文件: index.ts (先不要管user.ts)…

详细讲解!如何模拟后台API调用场景

目录 简介 Postman 迁移至 ApiFox ApiFox 导入 Postman ApiFox 展示 API 调用场景 增加断言验证 API 使用测试执行场景 API 序列 总结 简介 在进行Web性能测试时&#xff0c;我们不仅需要测试前端页面的性能&#xff0c;还需要测试与后台API的交互性能&#xff0c;以及…

Spring Cloud常用组件介绍(Netflix、Alibaba)

Spring Cloud常用组件介绍 文章目录 **Spring Cloud常用组件介绍**一、说明**1.1.什么是Spring Cloud**1.2.Spring Cloud的组件选型 **二、组件介绍****2.1.服务注册与发现****2.1.1.Netflix Eureka****1&#xff09;分布式模型****2&#xff09;主要组件****3&#xff09;工作…

骑行陡坡村,潇潇洒洒出品

2023年6月10日群峰环抱小村庄盘山陡坡蜜桃香唇干舌燥咬一口甘甜香沁嘴边淌久旱叶枯悯农急乌云密布盼雷响但得雷神甘露下雨中狂奔又何妨

高效搞定文件重命名和归类!使用文件批量改名高手轻松实现

文件夹管理是计算机使用中非常重要的一项任务&#xff0c;对于个人电脑用户或企业机构来说&#xff0c;都需要对文件夹进行有效管理归类和重命名。 第一步&#xff0c;打开文件批量改名高手&#xff0c;进入文件批量重命名板块并点击添加文件&#xff0c;选择需要重命名的文件…

IOS应用跳转URL scheme和Universal Links

简介 IOS常见的跳转方式有URL scheme和Universal Links。这两个均可以实现App之间的跳转&#xff0c;以及通过网页实现跳转到对应的App内。通过本文章可以了解到两者的区别和具体的使用方法&#xff0c;以及参数的传递。应对常见的几种跳转需求。 URL scheme:需要配置URL sch…

增值税高不再是难事,只需一招即可解决!

《税筹顾问》专注于园区招商&#xff0c;您的贴身节税小能手&#xff0c;合理合规节税&#xff01; 任何一家企业&#xff0c;都逃脱不了一种税费的缴纳&#xff0c;那就是增值税。但其实小规模纳税人增值税缴纳&#xff0c;是可以享受到一些税收优惠照顾的&#xff0c;未达到月…

看完阿里大牛的LeetCode算法刷题手册后,成功在四面字节斩获offer

最近有看到很多朋友想进大厂&#xff0c;四面竟然都考了算法&#xff0c;很多同学面对算法的问题都很头大&#xff0c;因为自己做项目很难用到&#xff0c;但是但凡高薪的职位面试都会问到。最近我整理了一份刷题宝典&#xff0c;这份刷题宝典&#xff0c;也让我进了心仪的大厂…

MyBatis Plus 解决大数据量查询慢问题

常规查询 流式查询 游标查询 大数据量操作的场景大致如下&#xff1a; 数据迁移 数据导出 批量处理数据 在实际工作中当指定查询数据过大时&#xff0c;我们一般使用分页查询的方式一页一页的将数据放到内存处理。但有些情况不需要分页的方式查询数据或分很大一页查询数…

实用工具指南:2个提升效率的互联网利器

工具一&#xff1a; 字体酷站是全球最大的字体网址导航网站&#xff0c;收录了大量优质的字体素材和字体设计资源。该网站拥有丰富多样的字体分类和标签&#xff0c;用户可以根据需求选择不同类型、不同风格的字体&#xff0c;如商务字体、手写字体、卡通字体等。同时&#xf…

B+树单表超过2500万行的性能影响

&#xff08;有许多人是用青春的幸福作成功的代价的。——莫扎特&#xff09; B树 关于B树的原理请查看这篇文章 分析 MySQL采用了索引组织表的形式组织数据&#xff0c;叶子节点存储数据&#xff0c;非叶子节点存储主键与页面号的映射关系。若用户的主键长度是8字节时&…

基于MATLAB涡度通量数据处理

查看原文>>>基于MATLAB涡度通量数据处理实践技术应用 【内容简述】&#xff1a; 基于MATLAB语言、以实践案例为主&#xff0c;提供代码、原理与操作结合1、以涡度通量塔的高频观测数据为例&#xff1a;基于MATLAB上机操作2、涡度通量观测基本概况&#xff1a;观测技术…

用友 畅捷通T+ DownloadProxy.aspx 任意文件读取漏洞

1. 漏洞描述 用友 畅捷通T DownloadProxy.aspx文件存在任意文件读取漏洞&#xff0c;攻击者通过漏洞可以获取服务器上的敏感文件. 2.FOFA app"畅捷通-TPlus" 3.漏洞复现 登录页面 验证POC /tplus/SM/DTS/DownloadProxy.aspx?preload1&Path../../Web.Confi…

2.3 逻辑代数的基本公式和常用公式

博主介绍&#xff1a;一个爱打游戏的计算机专业学生 博主主页&#xff1a;夏驰和徐策 所属专栏&#xff1a;程序猿之数字电路 学习目标&#xff1a; 1. 学习基本概念&#xff1a;首先&#xff0c;了解逻辑代数的基本概念和术语&#xff0c;如命题、逻辑运算符&#xff08;与…

探索上位机编程的挑战与乐趣

上位机编程的难度取决于多个因素&#xff0c;包括您的编程经验、所使用的编程语言和开发工具、应用程序的复杂程度等等。 如果您具备一定的编程经验并且熟悉所选的编程语言和开发工具&#xff0c;那么上位机编程可能相对容易上手。上位机编程通常涉及与外部设备&#xff08;如…

Unity入门1——窗口布局

文章目录 一、Hierarchy 窗口 二、Scene 窗口 三、工具栏 四、Game 窗口 五、Project 工程窗口 六、Inspector 窗口 七、Console 窗口 一、Hierarchy 窗口 ​ 在这里创建对象、操作对象。 ​ 快捷键&#xff1a;F2&#xff1a;对象改名 ​ CtrlC&#xff1a;复制 ​ CtrlV&…

avue curd 中的配置项插槽使用

效果图&#xff1a;&#xff08;新增时候的步骤条&#xff0c;以为是设置透明度是0-1中的小数 avue中步骤是整数 于是使用到插槽用element-ui&#xff09; html&#xff1a; <template slot"opacityForm"><el-row class"row"><el-slider v-…

ABAP:后台执行JOB报错问题

错误&#xff1a;CL_GUI_CUSTOM_CONTAINERCP生成容器错误&#xff0c;主要在OOALV中运用到 原因&#xff1a;是由于我们在JOB后台执行的时候无法打开GUI端而报错的 此时&#xff0c;我们就需要在程序中去规避后台执行这一段逻辑&#xff0c;可以通过SY-BATCH解决&#xff0c;当…

今天终于知道了,阿里巴巴 P8、P9 及以上到底是什么水平?

做人做事不能万事向钱看&#xff0c;但是钱这个东西很多时候都反映了事物的价值以及一个人的能力水平。 比如阿里P8、P9 这些拿着高薪的程序员他们的技术水平就一直是大家好奇的。 今天在逛某乎的时候就恰好看见了一个几百万人关注的问题&#xff1a; 阿里的高p们动辄百万以上…