Страница 1 из 1

Энкодер для ESP32

Добавлено: 16 июл 2025, 20:59
Dryundel
Энкодер для ESP32
.
Параметры.jpg
Энкодер_для_ESP32_v1.0(b).ubi
.
Тест-проект EncESP32.jpg
Test Encoder ESP32 v1.0(b).flp
.
Блок EncESP32 стабильно работает на ESP32 Dev Module
Другие платформы не тестировались.
Написано в FLProg 9.4.0

Поддерживается до 8 энкодеров в одном проекте.
Если у вас самый дешевый и убитый энкодер без обвязки, то есть шанс что заработает. :)

Для работы необходимо установить библиотеку ESP32Encoder (Kevin Harrington)
Из Менеджера библиотек в Arduino IDE (Обновления рекомендуются)

Re: Энкодер для ESP32

Добавлено: 16 июл 2025, 21:00
Dryundel
Черновик описания.

Несмотря на обилие настроек и расширенный функционал, блок генерирует минимум кода. Неиспользуемые функции вырезаются. Библиотека ESP32Encoder (Kevin Harrington) так же показала себя скромно по ресурсозатратности. Однако работает она, на мой взгляд весьма эффективно. Кроме того есть возможности как улучшить качество считывания, так и облегчить работу процессора. Первое полезно в случае позиционирования чего то с помощью энкодера. Второе даёт возможность навесить достаточно много энкодеров на контроллер, без особого ущерба производительности.
Для этого предусмотрены все 3 режима считывания данных.
Информацию о том, как устроен инкрементный энкодер, вы легко найдёте в Интернете.

Кратко про считывание (требуется для понимания при настройке):
У энкодера 2 квадратурных канала. На каждом канале есть фронты и спады(задние фронты).
FullQuad (полный квадрат) выполняет инкремент счётчика по всем 4 фронтам с помощью прерываний.
HalfQuad (полуквадрат) — по нарастающему и спадающему фронтам одного канала.
SingleEdge (одиночный край) — только по нарастающему фронту канала A.

Соответственно у FullQuad самое высокое разрешение. Для обычного дешевого KY-040 это даёт 80 точек положения которые можно отследить. И если убрать трещётку, то легко можно сделать псевдо-абсолютный энкодер с шагом 4,5 градуса.

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

SingleEdge - самый лёгкий (программно) режим. Однако без помощи фильтра дребезга, KY-040 на нём будет глючить. Поставив на вскидку значение фильтра 500, я получил адекватную работу своего девайса. Но под рукой оказался не самый плохой. Такие энкодеры я бы рекомендовал к применению.
.
Фото энкодера.jpg
.
И хотя фильтры являются дополнительными ресурсозатратами, это гораздо меньшее "зло" чем 8 прерываний на один физический щелчок энкодера. Находите золотую середину и удача вам улыбнётся.

Теперь о подтяжке пинов.

Подтяжка энкодеру необходима. Но это не означает что её надо обязательно включать в настройках. Если у вас энкодер имеет нормальную RC обвязку, то подтяжка там уже выполнена физически и ничего добавлять не надо. Если же вы пытаетесь подключить "голый" энкодер то можно воспользоваться и внутренней (программной) подтяжкой. PULL_UP подтягивает к VCC, а PULL_DOWN - к GND. Куда подтягивать разницы нет. Главное оба пина одинаково. Это повлияет лишь на направление вращения, которое можно изменить поменяв пины местами.
Внимание! Эта настройка является общей для всех энкодеров проекта. При смене её в одном блоке, во всех остальных она изменится автоматически.
Важно помнить!
На ESP не все пины имеют внутреннюю подтяжку. И даже те, на которых она заявлена даташитом не всегда работают. Например пин D2 на ESP32 Dev Module занят пользовательским светодиодом тянущим его к GND. Поэтому PULL_UP на нём бесполезен, но сработает PULL_DOWN.
Всё же я бы рекомендовал использовать для подтяжки физические резисторы 1-10 кОм.

Фильтры дребезга.
Как и все механические девайсы, KY-040 страдает износом контактов, что создаёт дребезг. Избавиться от неадекватного поведения такого устройства помогают программные фильтры. Блок имеет такую настройку. Иногда она очень помогает. С помощью неё есть вероятность заставить работать даже убитый энкодер, который с другими блоками нормально запустить не удалось. Задав значение от 1 до 1023 можно экспериментально подобрать удовлетворительный режим. Если поставить "0", то фильтр будет отключён.

Стартовое значение.
Ну тут всё просто. Это значение будет на выходе Num всякий раз при включении или перезагрузке контроллера.

Вход предустановки Set.
С помощью этого входа значение на выходе Num принудительно становится равно значению на входе Num.

Вход Rst сбрасывает значение выхода Num в "0".

Лимиты энкодера.
Это те значения, которые будут максимумом и минимумом на выходе Num. Достигнув их счет остановится. Если же отключить лимиты, то счёт будет идти до условной бесконечности, а именно от -2 147 483 648 до 2 147 483 647. Даже если вы будете интенсивно крутить рукой свой девайс, без перерыва на еду и сон, до переполнения счетчика у вас уйдёт пара лет, и это только в одну сторону.

Импульсные (инкрементные) выходы Up и Dn.
На этих выходах возникает импульс длительностью в один цикл программы на каждую единицу счёта. Соответственно один в два цикла. Устроены они так, что ОБЯЗАТЕЛЬНО произойдёт столько импульсов, на сколько прибавилось или убавилось значение на выходе Num. И даже если ваша программа супер-тормозная, импульсы отсчитают своё, хоть это может происходить и с задержкой.
Выход на котором будут импульсы зависит от направления вращения ручки энкодера.


Внимание! Требуется помощь в тестировании.
Интересуют следующие моменты:
- Стабильность работы энкодеров и всей программы при максимальном количестве (до 8) устройств одновременно.
- Способность работать со старыми убитыми девайсами, в том числе и без обвязки с подбором режимов.

Результаты будут добавлены в данное описание.



.