Использована автоматическая генерация документации для файла MPU6000.md (2026.03.15)
MPU6000
Общая информация
MPU6000 --- это инерциальный измерительный модуль (IMU), содержащий:
- трёхосевой акселерометр
- трёхосевой гироскоп
Датчик широко применяется в:
- автопилотах
- дронах
- робототехнике
- системах стабилизации
- системах навигации
Основные особенности датчика:
- интерфейсы SPI и I2C
- высокая частота обновления данных
- встроенные цифровые фильтры
- аппаратная система самодиагностики (Self‑Test)
- возможность работы в условиях сильных вибраций
В данном драйвере используется SPI интерфейс и программная среда ESP‑IDF.
Типичный порядок работы с MPU6000:
- Проверка связи с устройством
- Инициализация датчика
- Самодиагностика
- Чтение данных акселерометра и гироскопа
Проверка связи с 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);
Алгоритм работы
Самодиагностика выполняется следующим образом:
- Чтение заводских значений Factory Trim
- Расчёт эталонных значений
- Считывание данных без режима Self‑Test
- Включение Self‑Test
- Повторное считывание данных
- Сравнение результатов
Допустимый диапазон отклонений:
[-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,"Сообщение об ошибке");
Логи позволяют контролировать:
- корректность работы драйвера
- результаты самодиагностики
- ошибки конфигурации