EdigE
← ЛЕНТА

IMU ADIS16575 отдаёт по SPI готовое приращение угла

Гироскоп обычно сообщает мгновенную угловую скорость: дальше процессор должен вспомнить время между двумя выборками, умножить скорость на dt и накопить угол. У ADIS16575, ADIS16576 и ADIS16577 есть другой поток данных. В burst-кадре можно запросить delta-angle — поворот, который MEMS уже накопила за интервал между обновлениями. При внутренней частоте 4 кГц этот интервал может составлять 250 мкс.

Датчик сам отсчитывает движение между выборками

Такой формат меняет смысл SPI-чтения. Хост получает инкремент движения, пригодный для непосредственного внесения в навигационное состояние, а не только материал для собственной численной интеграции. Аналогично delta-velocity содержит интеграл ускорения, то есть приращение линейной скорости за интервал. Если чтение датчика иногда задержал IRQ, DMA или планировщик ОС, временная сетка на стороне CPU уже не обязана совпадать с сеткой измерений внутри IMU.

В документации семейства этот выбор реализован битом OUT_SEL регистра MSG_CTRL. Он переключает burst между обычными gyro/accel и delta-angle/delta-velocity; разрядность задаётся отдельно, 16 или 32 бита. В кадре также присутствуют FIFO_CNT, DIAG_STAT и checksum. FIFO глубиной 512 выборок позволяет забрать накопленные измерения пачкой, а счётчик помогает понять, насколько далеко поток успел уйти от хоста. При фильтрации или децимации ADI рекомендует 32-битный формат: накопленный инкремент особенно чувствителен к потере младших разрядов.

Один burst-поток — одна физическая интерпретация

Analog Devices

Именно здесь обнаруживается интересный компромисс драйвера. Текущий upstream Linux IIO уже знает это семейство и экспортирует каналы delta-angle и delta-velocity. По scan mask он переключает OUT_SEL и запрещает совместный buffered capture обычных gyro/accel с delta-каналами: один burst-поток должен иметь единую интерпретацию. Для ADIS16575/576/577 в драйвере включены 32-битный burst, FIFO, 32-битная временная метка и частота SPI до 8 МГц.

18 сентября в EngineerZone появился запрос добавить delta-значения в Linux-поддержку. Сам запрос реален и относится ко всему семейству, однако его автор не указал версию ядра, BSP или commit конкретной ветки. Превращать эту запись в вывод «Linux-драйвер пока не умеет» было бы ошибкой: актуальный upstream уже содержит нужную механику. Вероятнее, речь идёт о старом LTS-ядре, vendor tree либо локальной ветке, куда изменения ещё не попали.

Запрос в поддержку оказался вопросом версии

История полезна шире одной микросхемы. Между «датчик выдаёт скорость» и «датчик выдаёт движение за интервал» лежит важное архитектурное решение. Первый вариант переносит тайминг, интегрирование и обработку пропусков на CPU. Второй делает IMU участником навигационного контура и требует внимательно выбрать формат burst, разрядность, режим FIFO и способ синхронизации. В хорошо собранной системе это сокращает работу хоста и делает происхождение каждого инкремента движения гораздо яснее.