Импульсный счетчик на ESP32 с использованием ESP-IDF и поворотного энкодера


В этом уроке мы научимся использовать модуль счетчика импульсов (модуль PCNT - pulse counter) микроконтроллера ESP32 с помощью ESP-IDF и познакомимся с использованием поворотного энкодера. Мы кратко рассмотрим поворотные энкодеры и принцип их работы. Затем приведем вводный пример, предоставленный в ESP-IDF в разделе периферийных устройств для PCNT (счетчика импульсов). Это поможет вам понять, как считывать входные сигналы с восходящим и нисходящим фронтами от поворотного энкодера.

Введение в импульсный счетчик (PCNT) ESP32

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

Каждый сигнал счетчика импульсов может обнаруживать фронты или уровни сигналов, таких как положительные и отрицательные фронты, а также активные высокие и низкие уровни. Таким образом, мы можем запрограммировать каждый канал PCNT на срабатывание в зависимости от различных типов сигналов. Мы можем комбинировать эти типы для обнаружения как фронтов, так и уровней сигналов. Комбинирование обоих типов позволит каждому каналу работать как квадратурный декодер. Что наиболее важно, каждый модуль также имеет отдельный фильтр помех, который полезен для фильтрации шума из входных сигналов.

Введение в поворотные энкодеры

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

Поворотные энкодеры бывают двух типов. Их различают по типу выходного сигнала или по технологии измерения. На рисунке ниже показан модуль поворотного энкодера, широко распространенный на рынке. Это простой поворотный энкодер KY-040 с выходным сигналом.

Модуль поворотного энкодера KY-040

При вращении ручки поворотного энкодера происходит несколько небольших шагов, которые ощущаются как неровности. Обычно поворотные энкодеры имеют 12 шагов, но это не всегда так. Поворотный энкодер может иметь и 200 шагов. Интересной особенностью таких энкодеров является возможность их бесконечного вращения, поскольку у них нет начального или конечного положения.

Принцип работы поворотных энкодеров

При вращении ручки поворотного энкодера на выходе получаются сигналы A и B, состоящие из двух прямоугольных импульсов, сдвинутых по фазе на 90 градусов. Когда сигнал A переходит из положительного в нулевое значение, считывается значение импульса B. Вращение ручки по часовой стрелке приводит к положительному импульсу сигнала B, а вращение против часовой стрелки — к отрицательному импульсу сигнала B. Таким образом, направление вращения можно контролировать, сравнивая оба выходных сигнала через микроконтроллер, а также вычисляя общее количество импульсов. Общее количество импульсов за каждый оборот не остается неизменным и изменяется при каждом обороте. Кроме того, скорость также можно рассчитать, подсчитав количество импульсов в единицу времени (частоту). Таким образом, поворотные энкодеры оказываются более полезными благодаря своим особенностям.

На рисунке ниже показан формат выходного сигнала для часто используемых поворотных энкодеров. Вы можете увидеть, как направление вращения вала влияет на два выходных сигнала, согласно представленным графикам.

Графики выходных сигналов поворотного энкодера

Распиновка KY-040

На рисунке ниже показана распиновка широко распространенного поворотного энкодера KY-040.

Распиновка KY-040

Как вы могли заметить, этот модуль состоит из пяти контактов: CLK, DT, SW, + и GND.

Контакт Назначение
CLK На выводе CLK выдается выходной сигнал A, который является основным выходным импульсом. При перемещении поворотного энкодера на один шаг/щелчок выходной сигнал изменяется с высокого на низкий (один цикл). Этот вывод, наряду с выводом DT, определяет направление вращения.
DT На выводе DT выдается сигнал B, фаза которого сдвинута на 90 градусов относительно сигнала A. Он также играет роль в определении направления вращения.
SW Контакт SW — это переключатель. Он позволяет поворотному энкодеру работать как кнопка. На этом контакте выдается сигнал низкого уровня на кнопке. Это означает, что напряжение снижается при нажатии на ручку поворотного энкодера сверху (эффект кнопки).
+ Контакт + также известен как контакт VCC. Напряжение питания находится в диапазоне 3,3-5 В.
GND Это контакт заземления, который соединен с общим заземлением.

Примечание: выводы CLK и DT генерируют прямоугольные импульсы (выход A и выход B соответственно), сдвинутые по фазе на 90 градусов. Эти два сигнала используются для измерения направления вращения (по часовой стрелке/против часовой стрелки).

Подключение поворотного энкодера к ESP32 с помощью ESP-IDF

Рассмотрим пример скетча, предоставленный ESP-IDF, чтобы узнать, как настроить поворотный энкодер и использовать его для отображения значений энкодера при вращении ручки.

Создание примера проекта

Откройте VS Code и перейдите в меню View > Command Palette. Введите в строке поиска ESP-IDF: New Project и нажмите Enter.

Укажите название проекта и каталог. Мы назвали наш проект «ESP_IDF_PCNT_ROTARY_ENCODER». Для платы ESP-IDF мы выбрали опцию custom board («пользовательская плата»). В качестве целевой платформы для ESP-IDF мы выбрали модуль ESP32.

Нажмите кнопку ‘Choose Template’ («Выбрать шаблон»), чтобы продолжить.

Создание нового проекта с помощью ESP-IDF

В разделе Extension («Расширение») выберите опцию ESP-IDF:

Выбор опции ESP-IDF в разделе Extension («Расширение»)

В разделе Peripherals («Периферийные устройства») на вкладке «rotary_encoder» мы щелкнем по элементу «rotary_encoder». Затем нажмем ‘Create project using template rotary_encoder’ («Создать проект, используя шаблон rotary_encoder»).

Создание проекта с использованием шаблона rotary_encoder

Вы получите уведомление о создании проекта. Чтобы открыть проект в новом окне, нажмите «Да».

Это открывает наш проект ESP_IDF_PCNT_ROTARY_ENCODER, который мы создали на вкладке EXPLORER. Внутри папки проекта находится несколько папок. Это одинаково для всех проектов, которые вы создадите с помощью ESP-IDF Explorer. В основной  папке находится исходный код, то есть файл main.c будет находиться именно здесь.

Теперь перейдите в файл main > rotary_encoder_example_main.c  и откройте его.

Открытие файла rotary_encoder_example_main.c в VS Code

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

Как работает код?

Для начала мы подключим необходимые библиотеки, включая библиотеки FreeRTOS для генерации задержек, esp_log.h для записи информационных сообщений и rotary_encoder.h для обеспечения функциональности поворотного энкодера.

Этот код использует информационное логирование. Функция логирования принимает два аргумента. Первый аргумент — это тег, а второй — отформатированная строка. Поэтому эта глобальная переменная будет полезна при вызове функций ESP_LOGI(). Здесь «example» — это тег, который будет использоваться при логировании.

Внутри функции app_main() мы сначала создаём переменную с именем 'pcnt_unit' и присваиваем ей значение 0. В этом примере базовое устройство — поворотный энкодер — представлено этим блоком PCNT.

Далее мы создаём экземпляр поворотного энкодера с помощью функции rotary_encoder_new_ec11(). Эта функция принимает два параметра.

  • Первый параметр — это адрес уже инициализированной структуры конфигурации config , которая устанавливается в значение ROTARY_ENCODER_DEFAULT_CONFIG((rotary_encoder_dev_t)pcnt_unit, 14, 15), так что инициализация конфигурации происходит со значениями, указанными в качестве параметров. Она устанавливает GPIOA равным 14 для CLK и GPIOB равным 15 для DT. Здесь rotary_encoder_config_t — это структура, используемая для конфигурации поворотного энкодера.
  • Второй параметр — это адрес указателя на кодировщик, сохраненное значение которого равно NULL.

Затем отфильтровываем помехи (1 мкс) с помощью encoder->set_glitch_filter(encoder, 1). Здесь мы используем  оператор "->", потому что доступ к set_glitch_filter() осуществляется через указатель.

Наконец, запустите кодирование, используя команду encoder->start(encoder) .

Внутри цикла while значение кодировки выводится в терминал. Доступ к нему осуществляется каждую секунду с помощью функции encoder->get_counter_value(encoder) .

Компиляция скетча

Для прошивки микросхемы введите следующую команду в последовательном терминале. Не забудьте заменить COM-порт на тот, через который подключена ваша плата.

Компиляция скетча с помощью VS Code

После успешной прошивки кода подключите ESP32 к поворотному энкодеру. Используйте следующие соединения для подключения обоих устройств.

Поворотный энкодер ESP32
+ 3.3V
GND GND
CLK GPIO14
DT GPIO15

Схема подключения поворотного энкодера к плате ESP32

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

Тестирование работы проекта в терминале

(Проголосуй первым!)
Загрузка...
13 просмотров

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *