Использована автоматическая генерация документации для файла MPU6000.md (2026.03.15)

MPU6000

Общая информация

MPU6000 --- это инерциальный измерительный модуль (IMU), содержащий:

  • трёхосевой акселерометр
  • трёхосевой гироскоп

Датчик широко применяется в:

  • автопилотах
  • дронах
  • робототехнике
  • системах стабилизации
  • системах навигации

Основные особенности датчика:

  • интерфейсы SPI и I2C
  • высокая частота обновления данных
  • встроенные цифровые фильтры
  • аппаратная система самодиагностики (Self‑Test)
  • возможность работы в условиях сильных вибраций

В данном драйвере используется SPI интерфейс и программная среда ESP‑IDF.

Типичный порядок работы с MPU6000:

  1. Проверка связи с устройством
  2. Инициализация датчика
  3. Самодиагностика
  4. Чтение данных акселерометра и гироскопа

Проверка связи с MPU6000

Функция выполняет проверку корректности SPI‑соединения с датчиком.

Для этого читается регистр WHO_AM_I.\ Для MPU6000 корректное значение регистра --- 0x68.

Прототип функции

esp_err_t MPU6000_communication_check(spi_device_handle_t MPU_handle);

Пример реализации

esp_err_t MPU6000_communication_check(spi_device_handle_t MPU_handle) {

    esp_err_t err = ESP_FAIL;

    if ((SPI_read_byte (MPU_handle, 0, 0, 8, MPU6000_WHO_AM_I | MPU6000_READ_FLAG, 0)) == 0x68) 
    {
        ESP_LOGI(TAG_MPU6000,"Связь с MPU6000 установлена");
        err = ESP_OK;
    }
    else ESP_LOGE(TAG_MPU6000,"Связь с MPU6000 не установлена\n");

    return err;
}

Возвращаемые значения

Значение Описание


ESP_OK связь установлена ESP_FAIL устройство не отвечает


Самодиагностика MPU6000

MPU6000 содержит встроенный механизм Self‑Test, позволяющий проверить корректность работы акселерометра и гироскопа.

Прототип функции

esp_err_t MPU6000_self_test(spi_device_handle_t MPU_handle);

Алгоритм работы

Самодиагностика выполняется следующим образом:

  1. Чтение заводских значений Factory Trim
  2. Расчёт эталонных значений
  3. Считывание данных без режима Self‑Test
  4. Включение Self‑Test
  5. Повторное считывание данных
  6. Сравнение результатов

Допустимый диапазон отклонений:

[-0.14 ... 0.14]

Если значение выходит за пределы диапазона --- тест считается не пройденным.


Чтение Factory Trim значений

SPI_read_bytes(
    MPU_handle,
    0,
    0,
    8,
    MPU6000_SELF_TEST_X | MPU6000_READ_FLAG,
    0,
    buf,
    4
);

Полученные значения используются для расчёта эталонных параметров датчика.


Расчёт эталонных значений

Для акселерометра:

factory_trim_calculated_values_accel[i] =
4096.0 * 0.34 *
powf((0.92 / 0.34),
((float)(factory_trim_values_accel[i] - 1.0) / 30.0));

Для гироскопа:

factory_trim_calculated_values_gyro[i] =
25.0 * 131.0 *
powf(1.046,
(float)(factory_trim_values_gyro[i] - 1));

Чтение данных без Self‑Test

SPI_read_bytes(
    MPU_handle,
    0,
    0,
    8,
    MPU6000_ACCEL_XOUT_H | MPU6000_READ_FLAG,
    0,
    sensor_data,
    14
);

Данные преобразуются в значения:

  • ускорения по осям X, Y, Z
  • угловой скорости по осям X, Y, Z

Включение режима Self‑Test

SPI_write_byte (MPU_handle, 0, 0, 8, MPU6000_GYRO_CONFIG, 0, 0b11100000);
SPI_write_byte (MPU_handle, 0, 0, 8, MPU6000_ACCEL_CONFIG, 0, 0b11110000);

После включения режима выполняется повторное измерение.


Расчёт отклонений

final_value_accel[i] =
(str_accel[i] - factory_trim_calculated_values_accel[i]) /
factory_trim_calculated_values_accel[i];

Проверка результата:

if (fabs(final_value_accel[i]) > 0.14)
{
    ESP_LOGE(TAG_MPU6000,"Самодиагностика акселерометра не пройдена");
}

Аналогично выполняется проверка гироскопа.


Инициализация MPU6000

Функция выполняет настройку основных регистров датчика.

Прототип функции

esp_err_t MPU6000_init(spi_device_handle_t MPU_handle);

Конфигурация регистров

uint8_t MPU6000_configuration_data[9][2] =
{
{MPU6000_PWR_MGMT_1, 0x80},
{MPU6000_SIGNAL_PATH_RESET, 0x07},
{MPU6000_PWR_MGMT_1, 0x00},
{MPU6000_CONFIG, 0b00000110},
{MPU6000_SMPLRT_DIV, SMPL},
{MPU6000_GYRO_CONFIG, 0x00},
{MPU6000_ACCEL_CONFIG, 0x08},
{MPU6000_USER_CTRL, 0b00010000},
{MPU6000_INT_ENABLE, 0x01}
};

Назначение параметров:

Регистр Назначение


PWR_MGMT_1 управление питанием SIGNAL_PATH_RESET сброс трактов CONFIG цифровой фильтр SMPLRT_DIV частота выборки GYRO_CONFIG диапазон гироскопа ACCEL_CONFIG диапазон акселерометра USER_CTRL управление интерфейсом INT_ENABLE разрешение прерываний


Запись регистров

SPI_write_byte(
    MPU_handle,
    0,
    0,
    8,
    register,
    0,
    value
);

После записи выполняется задержка:

ets_delay_us(10000);

Проверка конфигурации

После записи значения регистров считываются обратно:

reg_value = SPI_read_byte(
MPU_handle,
0,
0,
8,
register | MPU6000_READ_FLAG,
0
);

Если значение отличается от ожидаемого --- возникает ошибка настройки.


Типичный порядок использования драйвера

MPU6000_communication_check(MPU_handle);
MPU6000_init(MPU_handle);
MPU6000_self_test(MPU_handle);

После успешного выполнения этих функций можно приступать к:

  • чтению данных акселерометра
  • чтению данных гироскопа
  • обработке данных IMU

Логирование

В коде используется система логирования ESP‑IDF.

ESP_LOGI(TAG_MPU6000,"Информационное сообщение");
ESP_LOGE(TAG_MPU6000,"Сообщение об ошибке");

Логи позволяют контролировать:

  • корректность работы драйвера
  • результаты самодиагностики
  • ошибки конфигурации