只读取加速度xyz一点问题没有,读取角速度xyz就无限重启。之前把读取xyz轴分成3个函数来完成也没问题,怎么解决?
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];
}
运行日志或者报错日志发过来
应该是直接死了,地址或者内存有问题。