Работа с энкодером. Простое использование

Датчик угла поворота (ДУП, или англ. encoder) — это электронно-механическое устройство, преобразующее поворот в цифровой или аналоговый сигнал. Такие устройства могут быть основаны на разных физических принципах, но концепция у них одна. В целом их можно поделить на две большие группы: абсолютные (значение которых известно относительно «нуля») и инкрементальные (или накопительные, т. е. их положение относительно, и можно говорить только о направлении и скорости вращения). В нашем устройстве присутствует датчик угла поворота второго типа. Некоторые из ДУП могут иметь встроенную в вал кнопку (как в нашем устройстве), механика которой ничем не отличается от обычной.

encoder signals

В начальном состоянии выводы подтянуты к высокому состоянию при помощи резистора. Когда вал начинают вращать по направлению часовой стрелки, сигнал A переходит в низкое состояние, а B делает это после небольшой задержки. Если крутить вал в противоположную стрелке сторону, то ситуация изменится на обратную – запаздывать будет сигнал A. Временные интервалы зависят от скорости вращения.

Как и любая механическая система, датчики угла поворота страдают так называемым «дребезгом» контактов. Однако внутри самого микроконтроллера уже имеются резисторы подтяжки порядка МОм, поэтому впаивать резисторы нет особой надобности (можно сэкономить), плюс сам МК позволяет отфильтровать дребезг.

В микроконтроллерах stm32 некоторые из таймеров имеют особый режим работы (англ. encoder mode), позволяющий реализовать работу с энкодером аппаратно.

Таймер позволяет отслеживать либо фронты A (TI1), либо фронты B (TI2), либо оба сразу. В зависимости от выбранного режима изменение счётчика будет меняться либо на 2, либо на 4 (по количеству фронтов, передних и задних).

Режима работы с энкодером описан в документе AN4013, а так же в Reference Manual, пункт «15.3.12 Encoder interface mode».

Приступим к реализации и для начала создадим прототипы функций, которые понадобятся для работы.

В целом логика настройки всегда остаётся примерно одной и той же: включаем тактирование порта и периферии; настраиваем ножки; настраиваем периферию; включаем периферию. Последовательность лучше не нарушать, в противном случае периферия скорее всего работать не будет.

Таймер настроен на режим работы с энкодером, теперь при при повороте состояние регистра CNT будет менсяться на 2 (так как мы отслеживаем только TI1) от 0 до 128. Допишем функцию возврата значения счётчика:

Для проверки работы можно запустить следующий код из главного цикла:

Светодиод будет мигать с разной задержкой, в зависимости от содержания регистра CNT. Код можно найти на github: CMSIS.

Перед переходом к следующему разделу подумайте, как и где вы будите использовать данные функции. Должен ли энкодер менять одну переменную или придётся менять несколько? Чем такая реализация плоха?


Назад | Оглавление | Дальше