ESP32读取MPU6050原始数据角速度无限重启的问题

只读取加速度xyz一点问题没有,读取角速度xyz就无限重启。之前把读取xyz轴分成3个函数来完成也没问题,怎么解决?

img

img


附上代码:

main.cpp

#include <freertos/FreeRTOS.h>
#include <freertos/task.h>

#include "MPU6050.h"

extern "C" void app_main()
{
    MPU6050 mpu = MPU6050();
    mpu.Init();

    float acc[3];
    float gyro[3];
    while (true)
    {
        mpu.getAcc(acc);
        // mpu.getGyro(gyro);  加上就不行
        printf("AccX:%.2f    ", acc[0]);
        printf("AccY:%.2f    ", acc[1]);
        printf("AccZ:%.2f    ", acc[2]);
        // printf("GyroX:%.2f    ", gyro[0]);
        // printf("GyroY:%.2f    ", gyro[1]);
        // printf("GyroZ:%.2f    ", gyro[2]);
        printf("\n");
        vTaskDelay(100 / portTICK_RATE_MS);
    }
}

MPU6050.cpp

#include <freertos/FreeRTOS.h>
#include <freertos/task.h>
#include <esp_log.h>

#include "MPU6050.h"

// 默认构造函数.
MPU6050::MPU6050()
{
    // 初始化I2C
    i2c = I2Cdev();
    i2c.Init(SDA_PIN, SCL_PIN);
    devAddr = MPU6050_DEFAULT_ADDRESS;
}

// 初始化MPU
bool MPU6050::Init()
{
    ESP_LOGI("MPU6050", "MPU6050重置中...");
    i2c.writeByte(devAddr, PWR_MGMT_1, 0x80);
    vTaskDelay(100 / portTICK_RATE_MS);
    ESP_LOGI("MPU6050", "关闭睡眠模式...");
    i2c.writeBit(devAddr, PWR_MGMT_1, 6, 0x00);
    ESP_LOGI("MPU6050", "选择时钟源...");
    i2c.writeBits(devAddr, PWR_MGMT_1, 2, 3, 0x01);
    ESP_LOGI("MPU6050", "关闭XYZ轴待机模式...");
    i2c.writeBits(devAddr, PWR_MGMT_2, 5, 6, 0x00);
    ESP_LOGI("MPU6050", "陀螺仪采样率分频...");
    i2c.writeByte(devAddr, SMPLRT_DIV, 0x04);
    ESP_LOGI("MPU6050", "数字低通滤波器配置...");
    i2c.writeBits(devAddr, CONFIG, 2, 3, 0x01);
    ESP_LOGI("MPU6050", "设置陀螺仪满量程范围...");
    i2c.writeBits(devAddr, GYRO_CONFIG, 4, 2, 0x03);
    ESP_LOGI("MPU6050", "设置加速计满量程范围...");
    i2c.writeBits(devAddr, ACCEL_CONFIG, 4, 2, 0x00);
    ESP_LOGI("MPU6050", "校准MPU...");
    ESP_LOGI("MPU6050", "初始化成功!");
    return true;
}

// 获取ACC原始数据
bool MPU6050::getAcc(float *accArr)
{
    uint8_t r[2];
    i2c.readByte(devAddr, ACCEL_XOUT_H, 2, r);
    short accx = r[0] << 8 | r[1];
    i2c.readByte(devAddr, ACCEL_YOUT_H, 2, r);
    short accy = r[0] << 8 | r[1];
    i2c.readByte(devAddr, ACCEL_ZOUT_H, 2, r);
    short accz = r[0] << 8 | r[1];
    accArr[0] = (float)accx / 16383.75;
    accArr[1] = (float)accy / 16383.75;
    accArr[2] = (float)accz / 16383.75;
    return true;
}

// 获取GYRO原始数据
bool MPU6050::getGyro(float *gyroArr)
{
    uint8_t r[2];
    i2c.readByte(devAddr, GYRO_XOUT_H, 2, r);
    short gyrox = r[0] << 8 | r[1];
    i2c.readByte(devAddr, GYRO_YOUT_H, 2, r);
    short gyroy = r[0] << 8 | r[1];
    i2c.readByte(devAddr, GYRO_ZOUT_H, 2, r);
    short gyroz = r[0] << 8 | r[1];
    gyroArr[0] = (float)gyrox / 16.38;
    gyroArr[1] = (float)gyroy / 16.38;
    gyroArr[2] = (float)gyroz / 16.38;
    return true;
}

// 获取I2C地址
uint8_t MPU6050::getI2CADDR()
{
    uint8_t r[1];
    i2c.readByte(devAddr, WHO_AM_I, 1, r);
    return r[0];
}


运行日志或者报错日志发过来

应该是直接死了,地址或者内存有问题。