打印
[其他ST产品]

STM32CubeMX驱动MPU6050模块

[复制链接]
楼主: 逢dududu必shu
手机看帖
扫描二维码
随时随地手机跟帖
21
逢dududu必shu|  楼主 | 2023-12-29 00:23 | 只看该作者 |只看大图 回帖奖励 |倒序浏览
将oled.c和MPU6050.c文件复制到工程文件目录MPU6050_test\Core\Src中

使用特权

评论回复
22
逢dududu必shu|  楼主 | 2023-12-29 00:23 | 只看该作者
双击打开MPU6050_test\MDK-ARM目录中UVPROJX文件,按下图提示操作。

使用特权

评论回复
23
逢dududu必shu|  楼主 | 2023-12-29 00:23 | 只看该作者

使用特权

评论回复
24
逢dududu必shu|  楼主 | 2023-12-29 00:23 | 只看该作者
编译后oled.h和oledfont.h将被包含在oled.c目录下,MPU6050.h将被包含在MPU6050.c目录下。

使用特权

评论回复
25
逢dududu必shu|  楼主 | 2023-12-29 00:24 | 只看该作者

下面介绍驱动函数。

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

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

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

@param  hi2c: I2C句柄
*/

使用特权

评论回复
26
逢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 设备的指定地址读取数据。

这两个函数一般在其它函数中嵌套使用。

使用特权

评论回复
27
逢dududu必shu|  楼主 | 2023-12-29 00:24 | 只看该作者
4.2 初始化MPU6050
函数声明如下:
void MPU6050_Init(MPU6050_t* mpu6050, I2C_HandleTypeDef* hi2c);

使用特权

评论回复
28
逢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都被使用到。

使用特权

评论回复
29
逢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);

使用特权

评论回复
30
逢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:数字低通滤波器截止频率配置,类型为枚举类型,如下:

使用特权

评论回复
31
逢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;

使用特权

评论回复
32
逢dududu必shu|  楼主 | 2023-12-29 00:25 | 只看该作者
4.3.2 设置采样率分频系数
函数声明如下:
void MPU6050_SetSampleRate(MPU6050_t* mpu6050, MPU6050_SAMPLE_RATE_t sample_rate);

使用特权

评论回复
33
逢dududu必shu|  楼主 | 2023-12-29 00:25 | 只看该作者
函数内部定义一个8位的变量data,使用switch-case语句,不同的sample_rate对应的data即为对应要写入寄存器SMPRT_DIV的分频数据。

MPU6050_t* mpu6050:MPU6050设备结构体指针,表示要进行配置的设备。

使用特权

评论回复
34
逢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;

使用特权

评论回复
35
逢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设备结构体指针,表示要进行配置的设备。

使用特权

评论回复
36
逢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;

使用特权

评论回复
37
逢dududu必shu|  楼主 | 2023-12-29 00:26 | 只看该作者
说明:量程越大,灵敏度相应越低。

使用特权

评论回复
38
逢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的数据,默认关闭自检,需要使用自检时参照芯片手册修改。

使用特权

评论回复
39
逢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;

使用特权

评论回复
40
逢dududu必shu|  楼主 | 2023-12-29 00:26 | 只看该作者
说明:量程越大,灵敏度相应越低。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则