При разработке электронных устройств порой надо подключить инкрементный энкодер. Инкрементные энкодеры окружат нас повсюду. Это могут быть устройства с регулированием громкости звука в автомобиле, яркости свечения, регулировка климат контроля, датчик оборотов одометра, регулировка напряжения в блоках питания, регулировка развертки на осциллографах, энкодер для ввода пароля на сейфе и прочее. У меня на столе сейчас 6 энкодеров.

В этом тексте я показал как может работать программный компонент драйвера для опроса инкрементного энкодера.

инкрементный энкодер - это датчик угла поворота. Он показывает не только угол поворота, но и его направление: по часовой стрелке CW или против часовой стрелки ССW. Сигнал энкодера представляет собой два PWM, которые смещены по фазе. Взаимное смещение является направлением вращения. Таким образом можно утверждать, что квадратурный энкодер является не просто датчиком скорости и пройденного пути, но и самым настоящим фазовым детектором!

Постановка задачи
Разработать программный компонент для считывания показаний с инкрементного энкодера. Датчик подключен к GPIO пинам микроконтроллера PE0 и PE1. Написать на Си программную реализацию обработки сигнала с инкрементного энкодера. В драйвер энкодера еще надо заложить ограничители. Чтобы не позволять увеличивать счетчик выше конкретного порога, и не позволять уменьшать счетчик ниже конкретного порога. Сами пороги прописывать в конфиг- файле. Драйвер должен позволять создавать множество экземпляров самого себя для подключения сразу N энкодеров.

Реализация

Опрос инкрементного энкодера это классический пример того как задача хорошо решается при помощи конечного автомата (КА). Как известно, любой конечный автомат возводится за семь шагов: перечислить входы, перечислить выходы, перечислить состояния, нарисовать граф автомата, заполнить таблицу переходов, заполнить таблицу выходов, написать код и провести испытания. Но обо всём по-порядку.

Перечисление входов:

  1. на пине A появился положительный перепад с 0V в 3.3V

  2. на пине B появился положительный перепад с 0V в 3.3V

  3. на пине A появился отрицательный перепад с 3.3V в 0V

  4. на пине B появился отрицательный перепад с 3.3V в 0V

Перечисление состояний
Состояние энкодера целиком и полностью определяется значениями напряжения на GPIO в каждый конкретный момент времени. Есть всего 4 состояния.

A

B

Пояснение

0

0

0

A-0V; B-0V

1

0

1

A-0V; B-3.3V

3

1

1

A-3.3V; B-3.3V

2

1

0

A-3.3V; B-0V

Определить выходы автомата

  1. Увеличить счётчки на 1

  2. Уменьшить счётчик на 1

  3. Сигнализировать об ошибке

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

Нарисовать граф переходов конечного автомата

Особенность конечного автомата энкодера в том, что он работает в кодах Грея. То есть каждые соседние состояния отличаются только на 1 значащий бит. При кручении вала против часовой стрелки CW состояния будут изменятся вот по такому маршруту: 0b00 --> 0b01 --> 0b11 --> 0b10.

Составим таблицу переходов

На основе графа переходов можно составить таблицу переходов.

Составление таблицы выходов.

На основе графа переходов можно составить таблицу выходов.

Программная часть

Исходный код драйвера энкодера размещен тут. Драйвер написан согласно методичке. Архитектура Хорошо Поддерживаемого Программного Компонента.

Инициализация состояния КА происходит внутри функции init путем считывания GPIO.

Для достижения максимальной производительности надо работать с внешними прерываниями. Основная идея драйвера в том, чтобы в прерываниях по GPIO определить исходное состояние датчика и считать входной сигнал. Далее поместить эти метаданные в очередь и выйти из прерывания по GPIO.

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

Отладка

Что ж, прошивка написана. Теперь надо проверить работу драйвера на каком-нибудь настоящем энкодере. Вот у меня есть энкодер американской компании Bourns. Модель ECW1J-C28-BC0024L.

У него 24 стопора. Каждый щелчок увеличивает счетчик драйвера на 4 значения. Получается датчик может выдать 24*4=96 отсчетов на один оборот своей трещетки.

Пин датчика

GPIO

Подтяжка

Ext Int Event

Channel A

PE1

Up

Both

Channel B

PE0

Up

Both

Тестировочный прототип выглядит вот так.

В тестировочной прошивке заложен UART1 shell и можно пронаблюдать за тем, как работает энкодер. Вот я сделал один щелчок по часовой стрелке и один щелчок против часовой стрелки. Как и ожидалось, энкодер вернулся в ноль. То что появляются ошибки - это дело рук дребезга контактов. Однако наш продуманный конечный автомат энкодера способен в значительной мере игнорировать дребезг контактов и обрабатывать только корректные события. В этом и заключается ключевое достоинство конечно автоматной методики разработки системного ПО.

Приложения драйвера энкодера

  1. Можно сделать фазовый детектор для SDR обработки сигналов. Если сигналы симфазные, то энкодер будет показывать ноль. Если A опережает по фазе B , то будет нарастать счетчик, если A отстает от B, то счетчик будет убывать.

  2. Регулировать громкость проигрывателей, яркость светильников.

  3. Оснащать обратной связью электрические моторы и сервоприводы.

  4. Одометры, датчики скорости оборотов или измерители поступательного движения.

Итоги

Как видите, теория конечных автоматов отлично пригождается в повседневной работе программиста микроконтроллеров. Удалось составить драйвер инкрементного энкодера на основе FSM. Драйвер позволяет измерять количество оборотов вала и регистрировать направление вращения.

Если есть предложения по улучшению механизма обработки сигнала с энкодера, то пишите в комментариях.

Также пишите примеры, где вы в эпоху сенсорных экранов по-прежнему встречаете квадратурные энкодеры.

Ссылки

Название

URL

Как начертить диск энкодера (или черчение кодом)

https://habr.com/ru/articles/743198/

В.Б. Топильский

Основы схемотехники измерительных преобразователей Часть 2 АЦП перемещений

Код драйвера энкодера

https://github.com/aabzel/trunk/tree/main/source/sensitivity/incremental_encoder

Поляризатор = датчик угла

https://habr.com/ru/articles/742358/

Подключение энкодера к Ардуино и полнофункциональный код обработки для него

https://habr.com/ru/articles/586576/

Архитектура Хорошо Поддерживаемого Программного Компонента

https://habr.com/ru/articles/683762/

Инкрементальный энкодер: подключение и обработка его с помощью AVR (ATmega8/16/32/168/328)

https://habr.com/ru/articles/729382/

Энкодер модель ECW1J-C28-BC0024L

https://www.chipdip.ru/product/ecw1j-c28-bc0024l-bourns-8065411857

Словарь

Сокращение

Расшифровка

CW

clockwise

FSM

Finite State Machine

КА

Конечный автомат

CCW

counter clockwise

Вопросы:

  1. Как в драйвере инкрементного энкодера определять текущее состояние энкодера: считывать из GPIO или вычислять на основе потока событий?

  2. Как определить, что два PWM сигнала симфазные?

Only registered users can participate in poll. Log in, please.
Вы работали с инкрементными энкодерами?
90.32%да28
9.68%нет3
31 users voted. 1 user abstained.
Only registered users can participate in poll. Log in, please.
На приборной панели вашего автомобиля есть энкодеры?
12.5%да1
87.5%нет7
8 users voted. Nobody abstained.