Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Учебное пособие 2160.pdf
Скачиваний:
27
Добавлен:
30.04.2022
Размер:
9.07 Mб
Скачать

Таким образом, рассмотрен процесс измерения температуры и влажности воздуха роботизированным устройством. Описаны команды для взаимодействия с датчиком, а также формулы для пересчета показаний в реальные значения температуры и влажности.

3.10.Вычисление ориентации в пространстве

3.10.1.Получение измерений инерциального датчика

Инерциальный датчик подключается к микроконтроллеру посредством последовательного интерфейса передачи данных I2C1. К данному интерфейсу в силу его ограниченной пропускной способности и высоких требований к временным интервалам между считываниями информации другие устройства не подключаются.

Управление датчиком и получение результатов измерений происходит посредством обращения к соответствующим регистрам датчика. Для данных целей в программе микроконтроллера предусмотрены специализированные функции: writeRegister (), readRegisters (), writeAK8963Register () и readAK8963Registers (). Такое разнообразие функций необходимо вследствие того, что инерциальный датчик по сути представляет собой две микросхемы на одном кристалле: одна – акселерометр и гироскоп, другая – магнитометр

AK8963.

Функция writeRegister () используется для записи одного байта данных во внутренний регистр датчика. С помощью нее невозможно обратиться к регистрам магнитометра в силу специфических особенностей датчика. Кроме того, функция сразу же после записи производит чтение значения, хранящегося в регистре, и, если оно не совпадает с записываемым значением, возвращает ошибку. Процедура записи аналогична описанной в разделе 2.6. Вначале на шине формируется стартовая последовательность, затем отправляется адрес устройства, сдвинутый на один разряд влево, после чего в шину записывается адрес регистра, в который осуществляется запись и, собственно, данные регистра. Описанные манипуляции выполняет функция MyI2C_Write (), описанная ранее. После этого вызывается функция MyI2C_Read () и считывает записанные данные с последующим их сравнением.

Функция readRegisters () предоставляет возможность чтения данных из регистров датчика. С помощью нее также невозможно обращение к регистрам магнитометра. Процедура чтения данных аналогична описанной в разделе 2.6. Для того, чтобы прочитать значение какого-либо регистра датчика на шину выводится адрес устройства (0x26), затем адрес регистра для чтения при помощи MyI2C_Write (). После этого отдельной командой идет считывание данных функцией MyI2C_Read (). Все это уже было описано в разделе 2.6.

Функции writeAK8963Register () и readAK8963Registers () выполняют те же операции, что и функции writeRegister (), readRegisters (). Отличие наблюда-

67

ется только в адресе устройства, с которым осуществляется обмен (адрес акселерометра и гироскопа отличается от адреса магнитометра). Разделение функций сделано для удобства программирования.

Следует отметить, что датчик позволяет за один раз записывать и считывать сразу несколько значений регистров. Это возможно благодаря тому, что внутренний адрес регистра при каждой операции автоматически инкрементируется. Таким образом, не нужно для каждого байта использовать отдельную транзакцию, что позволяет увеличить скорость работы с датчиком.

У инерциального датчика имеется собственная отдельная шина I2C для подключения дополнительных внешних устройств. Шину управления и внешнюю шину можно объединить для более удобного взаимодействия. Так это упростит процесс получения данных из магнитометра, так как он хоть и находится на одном кристалле с акселерометром и гироскопом, но его интерфейс подключен именно к внешней шине. Такое объединение называется режимом «Bypass», его включение производится путем установки бита BYPASS_EN в регистре INT_PIN_CFG. Полное описание регистров не приводится, так как большинство из них для работы роботизированного устройства не требуются. Карта регистров начинается с адреса 0x00 и заканчивается адресом 0x7E. Каждый регистр имеет размерность восемь бит.

Рассмотрим процесс настройки датчика для проведения измерений. Этот процесс довольно сложный, но в программе микроконтроллера производятся минимально необходимые действия для запуска датчика. Основные операции обмена данными имеют поясняющие комментарии. Управление датчиком, а также всю обработку данных осуществляет задача с именем

«myMPU9250_Play».

Первым этапом производится включение режима «Bypass», чтобы иметь доступ к регистрам магнитометра. Затем происходит выбор источника тактирования для гироскопа путем записи регистра PWR_MGMNT_1. После этого инициируется сброс акселерометра, гироскопа и магнитометра, после завершения которого происходит чтение идентификаторов микросхемы. Таким образом микроконтроллера узнает что он работает именно с датчиком MPU9250.

Следующим этапом происходит настройка диапазонов измерений. Так, для акселерометра пределы измерений устанавливаются равными ±2g. Для роботизированного устройства этого вполне достаточно, учитывая его максимальную скорость передвижения и поворота, а также мощность привода. Кроме того, при использовании меньшего диапазона увеличивается чувствительность. Для гироскопа диапазон измерений устанавливается равным ±2000°/с. Учитывая максимальную скорость поворота роботизированного устройства, это значение взято с большим запасом, но при этом оно является минимально возмо ж- ным. Диапазон измерений магнитометра изменить не представляется возможным, он всегда равен значению из табл. 2.8.

68

Последним этапом является калибровка смещения нуля гироскопа. Подробно об этом написано в следующем разделе. Более наглядно процесс настройки инерциального датчика показан на рис. 3.6.

Рассмотрим процесс чтения результатов измерений датчика. Для этих целей применяется специализированная функция MPU9250_readSensor (). При вызове данной функции происходит чтение блока регистров датчика, отвечающих за результаты измерений (регистры 0x3B – 0x48). Полученные данные сохраняются в буфер, декодируются в соответствующие переменные путем соединения младшего и старшего байтов, а затем преобразуются в числа с плавающей точкой. Данные в буфере располагаются в следующем порядке: 6 байт

– результаты измерения акселерометра по трем осям, 2 байта – измерение температуры датчика, еще 6 байт – результаты измерения гироскопа по трем осям. Чтение результатов измерений магнитометра осуществляется отдельно функцией readAK8963Registers (). Более наглядно процедура чтения результатов измерений показана на рис. 3.7. На данном этапе чтение так называемых «сырых» измерений инерциального датчика окончено. Теперь данные необходимо обработать.

Рис. 3.6. Схема процесса настройки инерциального датчика

69

Рис. 3.7. Схема чтения результатов измерений инерциального датчика

Таким образом, рассмотрен процесс взаимодействия микроконтроллера с инерциальным датчиком, в состав которого входят трехосевые гироскоп, акселерометр и магнитометр. Рассмотрен процесс настройки датчика для осуществления измерений. Описана последовательность действий для считывания «сырых» показаний датчика.

70