Энкодер
Окно Encoder (меню → Options → Encoder) предназначено для настройки и чтения данных внешнего квадратурного энкодера через контроллер ESP32. Поддерживаются два независимых канала (ENC1, ENC2), каждый из которых подключён к GPIO-выводам ESP32 и обрабатывается аппаратным счётчиком импульсов (PCNT).
Принцип работы
ESP32 считывает сигналы квадратурного энкодера (A, B, Index) через встроенный периферийный модуль PCNT (Pulse Counter). Счётчик автоматически наращивает/уменьшает значение при каждом фронте сигналов A и B, обеспечивая аппаратное декодирование направления вращения. Сигнал Index (нулевая метка энкодера) подключён к GPIO-прерыванию: при нарастающем фронте ISR немедленно сбрасывает счётчик в ноль.
Энкодер ──► GPIO (A, B, Index) ──► ESP32 PCNT ──► UART ──► ПК (EncoderView)
│
Index ISR → счётчик = 0
Начальное состояние и сброс нуля
По умолчанию настройка идёт на 8-битный код угла (Coord_resolution = 10, что задаёт разрядность координаты 18 shl 10 = 28 бит, но Vel_resolution = 0 и Enc_presc = 0).
После включения энкодера (нажатие Start Reading) счётчик PCNT инициализируется нулём. Это начальное состояние не соответствует реальному положению датчика, пока датчик физически не пройдёт через точку нуля (сработает сигнал Index). Только после прохождения нулевой метки счётчик корректно привязывается к углу энкодера.
Если необходимо принудительно сбросить счётчик — выключите и включите энкодер (Stop Reading → Start Reading), после чего проведите датчик через нулевую точку.
Окно Encoder
Окно разделено на две части:
- Верхняя панель — текущие значения: угол ENC1, угол ENC2, координата C1 Coord, координата C2 Coord.
- Центральная панель — настройки двух каналов (C1 и C2) с одинаковым набором параметров.
Текущие значения
| Поле | Описание |
|---|---|
| ENC1 Angle | Текущее значение счётчика PCNT энкодера 1 (считывается из ESP32) |
| ENC2 Angle | Текущее значение счётчика PCNT энкодера 2 |
| C1 Coord | Координата контура 1 из регистра C1Coord микросхемы (SPI адрес 16) |
| C2 Coord | Координата контура 2 из регистра C2Coord микросхемы (SPI адрес 48) |
Настройки каналов
Каждый канал (C1, C2) содержит следующие параметры:
| Параметр | Регистр | Биты | По умолчанию | Описание |
|---|---|---|---|---|
| Enc_presc | ResCntrl | [14:12] | 0 | Делитель частоты сигналов энкодера. Определяет максимальную частоту переключения: 0 = FINT/2, 1 = FINT/3, ..., 7 = FINT/64 |
| Vel_res | ResCntrl | [8:5] | 0 | Разрешение скорости. Маскирует (обнуляет) младшие N бит значения скорости |
| Coord_res | ResCntrl | [3:0] | 10 | Разрешение координаты. Определяет разрядность: bits = 18 shl Coord_resolution |
| LBW | KonturStngs | [4:0] | 10 | Полоса пропускания контура отслеживания |
Включение и выключение
Start Reading
При нажатии Start Reading:
- Чтение текущих регистров — из микросхемы через ESP32 по SPI считываются регистры C1ResCntrl (адрес 14), C2ResCntrl (адрес 46), C1KonturStngs (адрес 13), C2KonturStngs (адрес 45).
- Применение настроек — значения полей с панели (Enc_presc, Vel_res, Coord_res, LBW) накладываются на считанные значения регистров. При этом устанавливается бит Enc_en (бит 15 регистра ResCntrl), включающий блок энкодера в микросхеме.
- Запись регистров — обновлённые значения записываются обратно в микросхему через SPI.
- Включение ESP32 PCNT — на ESP32 отправляется команда
ENC_ON(0x19), которая инициализирует аппаратные счётчики PCNT, подключает GPIO-прерывания для Index и запускает счёт. - Запуск опроса — запускается циклическое чтение с периодом 50 мс: счётчики ENC1/ENC2 из ESP32, координаты C1/C2 Coord из микросхемы.
Настройки с панели передаются в микросхему только при нажатии Start Reading. До этого момента изменённые значения хранятся только в интерфейсе.
Stop Reading
При нажатии Stop Reading:
- Останавливается циклический опрос.
- В регистры ResCntrl сбрасывается бит Enc_en (бит 15 = 0) — блок энкодера в микросхеме выключается.
- На ESP32 отправляется команда
ENC_OFF(0x1A) — аппаратные PCNT останавливаются.
Сохранение настроек
Введённые настройки (Enc_presc, Vel_res, Coord_res, LBW) автоматически сохраняются между сеансами работы приложения и восстанавливаются при следующем открытии окна Encoder.
GPIO-подключение
Назначение выводов энкодера на плате ESP32:
| Сигнал | ENC1 | ENC2 |
|---|---|---|
| A (квадратура) | GPIO 47 | GPIO 5 |
| B (квадратура) | GPIO 21 | GPIO 6 |
| Index (нулевая метка) | GPIO 14 | GPIO 4 |
Сигнал A — основной канал квадратуры, B — сдвинутый на 90°, Index — нулевая метка (один импульс за оборот). Для подавления дребезга используется аппаратный фильтр PCNT (glitch filter = 1000 нс).