[其他ST产品] STM32CubeMX驱动MPU6050模块

[复制链接]
1750|44
 楼主| 逢dududu必shu 发表于 2023-12-29 00:23 | 显示全部楼层
将oled.c和MPU6050.c文件复制到工程文件目录MPU6050_test\Core\Src中
71959658da0f1c1ecd.png
 楼主| 逢dududu必shu 发表于 2023-12-29 00:23 | 显示全部楼层
双击打开MPU6050_test\MDK-ARM目录中UVPROJX文件,按下图提示操作。
2438658da0fd36cb6.png
 楼主| 逢dududu必shu 发表于 2023-12-29 00:23 | 显示全部楼层
 楼主| 逢dududu必shu 发表于 2023-12-29 00:23 | 显示全部楼层
编译后oled.h和oledfont.h将被包含在oled.c目录下,MPU6050.h将被包含在MPU6050.c目录下。
48004658da111b13fe.png
 楼主| 逢dududu必shu 发表于 2023-12-29 00:24 | 显示全部楼层
83967658da117d845e.png
下面介绍驱动函数。

4. 驱动源码中函数介绍
函数的定义见MPU6050.c文件

4.1 内部函数
函数定义如下:
  1. /*
  2. [url=home.php?mod=space&uid=247401]@brief[/url] 写入MPU6050寄存器数据
  3. @param mpu6050: MPU6050设备结构体指针
  4. @param regAddr: 要写入的寄存器地址
  5. @param data: 要写入的数据
  6. @retval 返回HAL库操作状态
  7. */
  8. static HAL_StatusTypeDef MPU6050_WriteReg(MPU6050_t* mpu6050, uint8_t regAddr, uint8_t data)
  9. {
  10.     return HAL_I2C_Mem_Write(mpu6050->hi2c, mpu6050->devAddr, regAddr, I2C_MEMADD_SIZE_8BIT, &data, 1, 1000);
  11. }
  12. /*
  13. @brief 读取MPU6050寄存器数据
  14. @param mpu6050: MPU6050设备结构体指针
  15. @param regAddr: 要读取的寄存器地址
  16. @param pData: 存储读取数据的缓冲区指针
  17. @param size: 要读取的数据长度(字节)
  18. @retval 返回HAL库操作状态
  19. */
  20. static HAL_StatusTypeDef MPU6050_ReadReg(MPU6050_t* mpu6050, uint8_t regAddr, uint8_t* pData, uint16_t size)
  21. {
  22.     return HAL_I2C_Mem_Read(mpu6050->hi2c, mpu6050->devAddr, regAddr, I2C_MEMADD_SIZE_8BIT, pData, size, 1000);
  23. }
  24. /*
  25. @brief  初始化MPU6050设备

  26. @param  mpu6050: MPU6050设备结构体指针

  27. @param  hi2c: I2C句柄
  28. */
 楼主| 逢dududu必shu 发表于 2023-12-29 00:24 | 显示全部楼层
这两个函数的作用即向MPU6050写入/读取寄存器数据。

这两个函数实际上是调用了 HAL 库提供的 I2C 读写函数 HAL_I2C_Mem_Write(),HAL_I2C_Mem_Read() 进行 I2C 通信。其中,HAL_I2C_Mem_Write() 用于向 I2C设备的指定地址写入数据,HAL_I2C_Mem_Read() 用于从 I2C 设备的指定地址读取数据。

这两个函数一般在其它函数中嵌套使用。
 楼主| 逢dududu必shu 发表于 2023-12-29 00:24 | 显示全部楼层
4.2 初始化MPU6050
函数声明如下:
void MPU6050_Init(MPU6050_t* mpu6050, I2C_HandleTypeDef* hi2c);
 楼主| 逢dududu必shu 发表于 2023-12-29 00:24 | 显示全部楼层
MPU6050_t* mpu6050:MPU6050设备结构体指针,用来存储MPU6050设备的相关参数,包括设备I2C地址、采样率、滤波器截止频率、加速度计和陀螺仪灵敏度等(后续需要修改参数可以使用函数修改)。
I2C_HandleTypeDef* hi2c:用于指定I2C总线的相关信息,包括使用的I2C外设及其配置。在该函数的定义中,虽然没有显式的使用该参数,但是实际上这个参数在static HAL_StatusTypeDef MPU6050_WriteReg和static HAL_StatusTypeDef MPU6050_ReadReg都被使用到。
 楼主| 逢dududu必shu 发表于 2023-12-29 00:24 | 显示全部楼层
4.3 设置相关参数
4.3.1 设置数字低通滤波器截止频率
函数声明如下:void MPU6050_SetLPF(MPU6050_t* mpu6050, MPU6050_LPF_CUTOFF_FREQ_t lpf_cutoff_freq);
 楼主| 逢dududu必shu 发表于 2023-12-29 00:24 | 显示全部楼层
函数内部定义一个8位的变量data,使用switch-case语句,不同的lpf_cutoff_freq对应的data即为对应要写入寄存器CONFIG的数据,默认禁用外部同步信号。需要开启外部同步信号时参照芯片手册修改函数。

MPU6050_t* mpu6050:MPU6050设备结构体指针,表示要进行配置的设备。
MPU6050_LPF_CUTOFF_FREQ_t lpf_cutoff_freq:数字低通滤波器截止频率配置,类型为枚举类型,如下:
 楼主| 逢dududu必shu 发表于 2023-12-29 00:24 | 显示全部楼层
/* 数字低通滤波器截止频率配置 */
typedef enum {
    LPF_CUTOFF_FREQ_5HZ = 0,    //截止频率5HZ   初始采样率1KHZ
    LPF_CUTOFF_FREQ_10HZ,       //截止频率10HZ   初始采样率1KHZ
    LPF_CUTOFF_FREQ_21HZ,       //截止频率21HZ   初始采样率1KHZ
    LPF_CUTOFF_FREQ_44HZ,       //截止频率44HZ   初始采样率1KHZ
    LPF_CUTOFF_FREQ_94HZ,       //截止频率94HZ   初始采样率1KHZ
    LPF_CUTOFF_FREQ_184HZ,      //截止频率184HZ   初始采样率1KHZ
    LPF_CUTOFF_FREQ_260HZ,      //截止频率260HZ   初始采样率8KHZ
    LPF_CUTOFF_FREQ_3600HZ      //禁用低通滤波器   初始采样率8KHZ
} MPU6050_LPF_CUTOFF_FREQ_t;
 楼主| 逢dududu必shu 发表于 2023-12-29 00:25 | 显示全部楼层
4.3.2 设置采样率分频系数
函数声明如下:
void MPU6050_SetSampleRate(MPU6050_t* mpu6050, MPU6050_SAMPLE_RATE_t sample_rate);
 楼主| 逢dududu必shu 发表于 2023-12-29 00:25 | 显示全部楼层
函数内部定义一个8位的变量data,使用switch-case语句,不同的sample_rate对应的data即为对应要写入寄存器SMPRT_DIV的分频数据。

MPU6050_t* mpu6050:MPU6050设备结构体指针,表示要进行配置的设备。
 楼主| 逢dududu必shu 发表于 2023-12-29 00:25 | 显示全部楼层
MPU6050_SAMPLE_RATE_t sample_rate:采样率配置,类型为枚举类型,如下:
/* 采样率配置 */
typedef enum {
    SAMPLE_RATE_DIV0 = 0,       //0分频
    SAMPLE_RATE_DIV2,           //2分频
    SAMPLE_RATE_DIV4,           //4分频
    SAMPLE_RATE_DIV8,           //8分频
    SAMPLE_RATE_DIV16,          //16分频
    SAMPLE_RATE_DIV32,          //32分频
    SAMPLE_RATE_DIV64,          //64分频
    SAMPLE_RATE_DIV128          //128分频
} MPU6050_SAMPLE_RATE_t;
 楼主| 逢dududu必shu 发表于 2023-12-29 00:25 | 显示全部楼层
4.3.3 设置加速度计量程
函数声明如下:
void MPU6050_SetAccelFS(MPU6050_t* mpu6050, MPU6050_ACCEL_FS_SEL_t accel_fs_sel);
函数内部定义一个8位的变量data,使用switch-case语句,不同的accel_fs_sel对应的data即为对应要写入寄存器ACCEL_CONFIG的数据,默认关闭高通滤波器和自检,需要使用时参照芯片手册修改。

MPU6050_t* mpu6050:MPU6050设备结构体指针,表示要进行配置的设备。
 楼主| 逢dududu必shu 发表于 2023-12-29 00:26 | 显示全部楼层
MPU6050_ACCEL_FS_SEL_t accel_fs_sel:加速度计量程配置,类型为枚举类型,如下:
/* 加速度计灵敏度配置 */
/* 加速度计灵敏度配置 */
typedef enum {
    ACCEL_FS_SEL_2G = 0,    // ±2g
    ACCEL_FS_SEL_4G,        // ±4g
    ACCEL_FS_SEL_8G,        // ±8g
    ACCEL_FS_SEL_16G        // ±16g
} MPU6050_ACCEL_FS_SEL_t;
 楼主| 逢dududu必shu 发表于 2023-12-29 00:26 | 显示全部楼层
说明:量程越大,灵敏度相应越低。
 楼主| 逢dududu必shu 发表于 2023-12-29 00:26 | 显示全部楼层
4.3.4 设置角速度计量程
函数声明如下:
void MPU6050_SetGyroFS(MPU6050_t* mpu6050, MPU6050_GYRO_FS_SEL_t gyro_fs_sel);

函数内部定义一个8位的变量data,使用switch-case语句,不同的gyro_fs_sel对应的data即为对应要写入寄存器GYRO_CONFIG的数据,默认关闭自检,需要使用自检时参照芯片手册修改。
 楼主| 逢dududu必shu 发表于 2023-12-29 00:26 | 显示全部楼层
MPU6050_t* mpu6050:MPU6050设备结构体指针,表示要进行配置的设备。
MPU6050_GYRO_FS_SEL_t gyro_fs_sel:加速度计量程配置,类型为枚举类型,如下:
/* 陀螺仪灵敏度配置 */
typedef enum {
    GYRO_FS_SEL_250DPS = 0,  // ±250dps
    GYRO_FS_SEL_500DPS,      // ±500dps
    GYRO_FS_SEL_1000DPS,     // ±1000dps
    GYRO_FS_SEL_2000DPS      // ±2000dps
} MPU6050_GYRO_FS_SEL_t;
 楼主| 逢dududu必shu 发表于 2023-12-29 00:26 | 显示全部楼层
说明:量程越大,灵敏度相应越低。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 在线客服 返回列表 返回顶部