esp32系列(10):mpu6050驱动

1 mpu6050 学习

1.1 概述

MPU-60X0:

  • 具有嵌入式3轴MEMS陀螺仪、3轴MEMS加速度计和数字运动处理器(Digital Motion Processor,DMP)硬件加速器引擎,带有辅助I2C端口。
  • 三个16位模数转换器(ADC),用于采样陀螺仪的输出。
  • 三个16位模数转换器(ADC),用于采样加速度计的输出。
  • 可编程陀螺仪满量程范围为±250、±500、±1000和±2000°/sec(dps),用户可编程加速计满量程范围为±2g、±4g、±8g和±16g。
  • 使用最高400kHz的I2C或1MHz的SPI(仅限MPU-6000)与设备的所有寄存器进行通信。
  • MPU-6000和MPU-6050完全相同,只是MPU-6050仅支持I2C串行接口,并且有一个单独的VLOGIC参考引脚。

1.2 引脚

在这里插入图片描述

在这里插入图片描述

AUX_DA和AUX_CL是一组辅助I2C接口,用于连接外部传感器。
SDA 和 SCL 是主I2C接口,用于我们读取数据。
AD0 为地址LSB选择引脚。
INT 为中断输出。

1.3 关于中断信号

中断功能通过中断配置寄存器进行配置。可配置的项目包括INT引脚配置、中断锁定和清除方法,以及中断触发器。可触发中断的项目包括

  • 1 锁定到新参考振荡器的时钟发生器(在切换时钟源时使用);
  • 2 可读取新数据(从FIFO和数据寄存器);
  • 3 加速计事件中断;
  • 4 MPU-60X0没有从辅助I2C总线上的辅助传感器接收到确认。中断状态可以从中断状态寄存器中读取。

中断源可以配置为:
在这里插入图片描述

1.4 I2C通信协议

在这里插入图片描述

器件地址: b110100(AD0)

2 mpu6050驱动

2.1 初始化配置

主要的寄存器:

  • 1 复位
    在这里插入图片描述
    配置 0x6B 为 0x80 ,复位后 DEVICE_RESET 自动清零。默认值为0x40。
    配置 0x6B 为 0x00 ,清除睡眠模式。
  • 2 配置参数
    设置满量程范围
    配置 0x1B 为 0x18 , 陀螺仪满量程配置为 ± 2000 °/s。
    配置 0x1C 为 0x00 , 陀螺仪满量程配置为 ± 2 g。
    在这里插入图片描述
    设置中断
    配置 0x38 为 0x00 , 禁用中断
    在这里插入图片描述
    设置AUX I2C接口
    配置 0x6A 为 0x00
    在这里插入图片描述
    设置FIFO
    配置 0x23 为 0x00
    在这里插入图片描述
    设置采样率 Sample Rate = Gyroscope Output Rate / (1 + SMPLRT_DIV)
    Gyroscope Output Rate = 8kHZ(reg26.DLPF_CFG=0或7),Gyroscope Output Rate = 1kHZ(reg26.DLPF使能),
    配置 0x19 为 0x63,Sample Rate = 1KHz / (1 + 99) = 100Hz
    在这里插入图片描述
    设置数字低通滤波器, 我们的采样率为100Hz,设置带宽为44Hz即可。
    配置 0x1A 为 0x13。
    在这里插入图片描述
    设置系统时钟源为X轴陀螺仪PLL参考时钟
    设置 0x6B 为 0x09
    在这里插入图片描述
    使能传感器
    设置 0x6C 为 0x00
    在这里插入图片描述

初始化函数:

// 初始化寄存器列表  
static const uint8_t mpu6050_init_cmd[11][2] = {
    {0x6B, 0x80}, // PWR_MGMT_1, DEVICE_RESET  
    // need wait 
    {0x6B, 0x00}, // cleat SLEEP
    {0x1B, 0x18}, // Gyroscope Full Scale Range = ± 2000 °/s
    {0x1C, 0x00}, // Accelerometer Full Scale Range = ± 2g 
    {0x38, 0x00}, // Interrupt Enable.disenable 
    {0x6A, 0x00}, // User Control.auxiliary I2C are logically driven by the primary I2C bus
    {0x23, 0x00}, // FIFO Enable.disenable  
    {0x19, 0x63}, // Sample Rate Divider.Sample Rate = 1KHz / (1 + 99)  
    {0x1A, 0x13}, // EXT_SYNC_SET = GYRO_XOUT_L[0]; Bandwidth = 3
    {0x6B, 0x01}, // Power Management 1.PLL with X axis gyroscope reference
    {0x6C, 0x00}  // Power Management 2
};

/**
* @brief 初始化 mpu6050
*/
esp_err_t mpu6050_init()
{
    esp_err_t esp_err;
    i2c_config_t conf = {
        .mode = I2C_MODE_MASTER,
        .sda_io_num = MPU6050_I2C_SDA,         // select GPIO specific to your project
        .sda_pullup_en = GPIO_PULLUP_ENABLE,
        .scl_io_num = MPU6050_I2C_SCL,         // select GPIO specific to your project
        .scl_pullup_en = GPIO_PULLUP_ENABLE,
        .master.clk_speed = MPU6050_I2C_FREQ,  // select frequency specific to your project
        // .clk_flags = 0,          /*!< Optional, you can use I2C_SCLK_SRC_FLAG_* flags to choose i2c source clock here. */
    };
    esp_err = i2c_param_config(MPU6050_I2C_PORT_NUM, &conf);
    printf("i2c_param_config: %d \n", esp_err);

    esp_err = i2c_driver_install(MPU6050_I2C_PORT_NUM, I2C_MODE_MASTER, 0, 0, 0);
    printf("i2c_driver_install: %d \n", esp_err);

    for (size_t i = 0; i < 11; i++)
    {
        esp_err = i2c_master_write_slave(MPU6050_I2C_PORT_NUM, mpu6050_init_cmd[i], 2);
        if (i == 0)
            vTaskDelay(500 / portTICK_RATE_MS);
    }
    printf("mpu6050_init_cmd: %d \n", esp_err);
    return esp_err;
}

2.2 获取数据

传感器相关的数据存储在地址位0x3B~0x48的寄存器中。

在这里插入图片描述

获取数据即读取相关寄存器然后完成数据转换即可:

/**
* @brief 读取加速度计、温度和陀螺仪数据
*/
measurement_out_t mpu6050_get_value()
{
    uint8_t *measurement_bytes_out = (uint8_t *)malloc(14);
    i2c_master_read_slave(MPU6050_I2C_PORT_NUM, 0x3B, measurement_bytes_out, 14);
    measurement_out_t measurement_out = {
        .accel_out.accel_xout = (int16_t)(measurement_bytes_out[0]<<8 | measurement_bytes_out[1]),
        .accel_out.accel_yout = (int16_t)(measurement_bytes_out[2]<<8 | measurement_bytes_out[3]),
        .accel_out.accel_zout = (int16_t)(measurement_bytes_out[4]<<8 | measurement_bytes_out[5]),
        .temp_out.temp_xout = (int16_t)(measurement_bytes_out[6]<<8 | measurement_bytes_out[7]),
        .gyro_out.gyro_xout = (int16_t)(measurement_bytes_out[8]<<8 | measurement_bytes_out[9]),
        .gyro_out.gyro_yout = (int16_t)(measurement_bytes_out[10]<<8 | measurement_bytes_out[11]),
        .gyro_out.gyro_zout = (int16_t)(measurement_bytes_out[12]<<8 | measurement_bytes_out[13]),
    };
    return measurement_out;
}

2.3 测试工程

https://github.com/luming-xyz/ESP32_IDF-MPU6050_register

有积分的可以5积分支持一下:

https://download.youkuaiyun.com/download/lum250/84540501

3 预告

学习MPU6050的数据产品手册的时候,可以看到芯片内部是有一个 内部数字运动处理器( Internal Digital Motion Processing ,DMP)支持3D运动处理和手势识别算法。可以直接输出芯片的姿态角(航向角、俯仰角和横滚角三个欧拉角)。代码已经移植完成,将在整理后上传。

### 使用 ESP32-S3 驱动 MPU6050 传感器 对于使用 ESP32-S3 来驱动 MPU6050 传感器,硬件连接方式遵循 I²C 协议标准配置[^2]。具体来说: - **电源连接**:VCC 引脚应与 ESP32-S3 模块的 3.3V 输出相接以提供电力支持;GND 引脚需同 ESP32-S3 地线相连确保电路稳定工作。 - **I²C 数据线连接**:SCL 和 SDA 是 MPU6050 上用于通信的主要引脚。这些应该分别对应到 ESP32-S3 开发板上的 GPIO 管脚,默认情况下分别是 GPIO 22 (SCL) 和 GPIO 21 (SDA)。 为了实现上述功能,在软件方面推荐采用 Arduino IDE 平台进行编程开发。下面给出一段简单的代码示例来初始化并读取来自 MPU6050 的数据: ```cpp #include <Wire.h> #include "I2Cdev.h" #include "MPU6050_6Axis_MotionApps20.h" // 设备地址定义 #define MPU6050_ADDRESS 0x68 MPU6050 mpu; void setup() { Serial.begin(115200); Wire.begin(); Wire.setClock(400000); // 初始化 MPU6050 mpu.initialize(); if (!mpu.testConnection()) { Serial.println("MPU6050 connection failed"); while (true) {} } else { Serial.println("MPU6050 connected successfully!"); } // 加载 DMP 设置 devStatus = mpu.dmpInitialize(); } void loop() { // 获取新的传感器数据包大小 int packetSize = mpu.dmpGetFIFOPacketSize(); // 如果有足够的 FIFO 缓冲区空间,则尝试获取新数据 if (fifoCount >= packetSize) { mpu.getFIFOBytes(fifoBuffer, packetSize); // 解析原始加速度计和陀螺仪数据 mpu.dmpGetQuaternion(&q, fifoBuffer); mpu.dmpGetGravity(&gravity, &q); mpu.dmpGetYawPitchRoll(ypr, &q, &gravity); // 打印角度信息 Serial.print("yaw: "); Serial.print(ypr[0] * 180/M_PI); Serial.print(", pitch: "); Serial.print(ypr[1] * 180/M_PI); Serial.print(", roll: "); Serial.println(ypr[2] * 180/M_PI); } } ``` 这段程序实现了基本的数据采集流程,包括设置串口通讯波特率、启动 IIC 总线以及完成 MPU6050 芯片初始化操作等步骤。之后进入主循环部分不断从设备中提取最新的姿态角信息并通过串行端口打印出来供进一步处理分析之用。 需要注意的是,尽管 ESP32-S3 提供了相对充裕的内部 SRAM 容量(约 512KB),但在运行复杂应用时仍可能面临资源紧张的情况,因此建议优化算法结构减少不必要的开销[^3]。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

lu-ming.xyz

觉得有用的话点个赞吧 :)

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值