Введение
MPU-6050 - это популярный модуль, который содержит датчик температуры, акселерометр и гироскоп. Пользователь может прочитать информацию датчика через I2 C или SPI. Два документа общедоступны для чтения данных из регистров I C. Это:
Карта регистра и описания MPU-6000 и MPU-6050 Документ
Спецификации продукции MPU-6000 и MPU-6050
Контекст
Чтение отдельных регистров IMU по I2 C искажает выборки во времени, поскольку задержка автобусной связи. Следовательно, последовательное считывание регистров оси X, Y и Z датчика не синхронизировано. Для решения этой проблемы устройство предоставляет внутреннюю очередь FIFO длиной 1024 байта. Данные, настроенные для отправки в очередь, объединяются с частотой дискретизации. Следовательно, чтение FIFO дает синхронизированные данные.
См. (2), раздел 7.17 :
MPU-60X0 содержит 1024-байтовый регистр FIFO, который доступен через последовательный интерфейс. Регистр конфигурации FIFO определяет, какие данные записываются в FIFO. Возможные варианты включают данные гироскопа, данные акселерометра, показания температуры, показания вспомогательного датчика и вход FSYN C. Счетчик FIFO отслеживает, сколько байтов допустимых данных содержится в FIFO. Регистр FIFO поддерживает пакетное чтение. Функция прерывания может использоваться для определения доступности новых данных
Проблема
В таблицах данных указано, что для чтения из FIFO необходимо выполнить следующее:
- Включить FIFO (бит 6, регистр
0x6A
, Документ (1), раздел 4.29) - Сконфигурировать FIFO с тем, какую информацию с датчиков для pu sh (зарегистрировать
0x23
, Документ (1), Раздел 4.7). Я включаю XG_FIFO_EN
, YG_FIFO_EN
, ZG_FIFO_EN
и ACCEL_FIFO_EN
, устанавливая биты 6, 5, 4 и 3. соответственно.
Если вы выполнили эти шаги, то он утверждает (Документ (1), раздел 4.33), что:
Данные записываются в FIFO в порядке номера регистра (от самого низкого до самого высокого). Если все флаги включения FIFO (см. Ниже) включены и все регистры данных внешнего датчика (регистры с 73 по 96) связаны с ведомым устройством, содержимое регистров с 59 по 96 будет записано в порядке с частотой дискретизации. Содержимое регистров данных датчика (регистры 59–96) записываются в буфер FIFO, когда их соответствующие флаги включения FIFO установлены в 1 в FIFO_EN (регистр 35).
Однако я считаю, что это не так. Учитывая флаги, которые я включил в регистр конфигурации, я ожидаю, что следующая последовательность будет поступать из FIFO:
* ----------------------------------------------------------- *
* BYTE # | VALUE | Register (dec) *
* ----------------------------------------------------------- *
* 0 | ACCEL_XOUT[15:8] | 59 *
* 1 | ACCEL_XOUT[7:0] | 60 *
* ----------------------------------------------------------- *
* 2 | ACCEL_YOUT[15:8] | 61 *
* 3 | ACCEL_YOUT[7:0] | 62 *
* ----------------------------------------------------------- *
* 4 | ACCEL_ZOUT[15:8] | 63 *
* 5 | ACCEL_ZOUT[7:0] | 64 *
* ----------------------------------------------------------- *
* 6 | GYRO_XOUT[15:8] | 67 *
* 7 | GYRO_XOUT[7:0] | 68 *
* ----------------------------------------------------------- *
* 8 | GYRO_YOUT[15:8] | 69 *
* 9 | GYRO_YOUT[7:0] | 70 *
* ----------------------------------------------------------- *
* 10 | GYRO_ZOUT[15:8] | 71 *
* 11 | GYRO_ZOUT[7:0] | 72 *
* ----------------------------------------------------------- *
Тем не менее, чтение 12 байтов из FIFO не соответствует тем же данным при чтении отдельные регистры . Это также, кажется, не имеет особого смысла, когда я ускоряю IMU или поворачиваю его. Поэтому я не уверен, как именно читать FIFO. С этой проблемой я сталкиваюсь
Q & A
- Вы уверены, что правильно записываете в регистры? : Да, я могу установить различные такие конфигурации, как частота дискретизации, прерывания и т. д. c. Я уверен, что правильно могу читать из FIFO
- Вы уверены, что в FIFO есть что-то, что можно прочитать? : Да, я включил прерывания переполнения FIFO. В настоящее время я жду прерывания и затем читаю из регистра FIFO.
- Проверяете ли вы регистр длины FIFO перед чтением? Да, он содержит 1024 байта (максимальная емкость), когда FIFO происходит прерывание переполнения.
- Разве другие люди не делали этого раньше? : Ни у кого нет конкретного объяснения, как читать FIFO (например: этот похожий вопрос на другом форуме, который получает RTFM ). Большинство доступных для поиска вопросов, связанных с чтением FIFO: (а) без ответа, (б) велено использовать библиотеку generi c XYZ Arduino (я не могу ее использовать), (c) велено читать лист данных (у меня есть ).