PCNT — счётчик импульсов ESP32
Посчитать импульсы расходомера, оборота колеса или энкодера можно прерываниями, но на высоких частотах они съедают процессор. У ESP32 для этого есть счётчик импульсов PCNT: он сам считает фронты, учитывает направление по управляющему входу и прерывает программу только на заданных порогах.
Обновлено Редакция GAW
PCNT (pulse counter, счётчик импульсов) — периферия ESP32, которая аппаратно считает фронты входного сигнала. У ESP32 восемь независимых блоков; в каждом 16-битный счётчик со знаком и два канала, а у канала два входа: сигнальный, фронты которого считаются, и управляющий, уровень которого может менять направление счёта или запрещать его (ESP32 TRM, гл. 23). Наибольшая частота считаемых импульсов — 40 МГц.
Как задаётся счёт
Для каждого канала отдельно выбирают действие на нарастающем и спадающем фронте (POS_MODE и NEG_MODE): +1, −1 или ничего. Затем — как управляющий вход меняет это действие при своём низком и высоком уровне (LCTRL_MODE и HCTRL_MODE): оставить, инвертировать или запретить. Например, при POS_MODE = +1 и HCTRL_MODE = инверсия нарастающий фронт увеличивает счёт при низком управляющем уровне и уменьшает при высоком. Этого хватает, чтобы считать сигналы с направлением и квадратурный энкодер — двумя каналами одного блока; аналог у таймеров STM32 — режим энкодера.
Точки срабатывания
| Точка | Условие | Действие |
|---|---|---|
| Наибольшее значение | счёт ≥ H_LIM | прерывание, сброс в 0 |
| Наименьшее значение | счёт ≤ L_LIM | прерывание, сброс в 0 |
| Два порога | счёт = THRES0 или THRES1 | прерывание |
| Ноль | счёт = 0 | прерывание |
Пять точек делят одно прерывание и разрешаются по отдельности (ESP32 TRM, разд. 23.2.3). Счётчик можно остановить и сбросить программно.
Фильтр и ограничения
Каждый вход имеет фильтр: импульсы короче заданного числа тактов APB_CLK отбрасываются. Это защищает от помех и дребезга контактов механических датчиков. Оба входа канала подключаются к выводам чипа (разд. 23.2.1); как сигналы периферии попадают на ножки, описывает статья о матрице GPIO. PCNT есть у ESP32, S2, S3, C6 и H2, а у ESP32-C3 его нет (soc_caps.h ESP-IDF v6.1). Если нужно записать не число импульсов, а их длительности, подходит RMT. Обзор чипов — в разделе ESP32.
Частые вопросы
Как считать квадратурный энкодер через PCNT?
Двумя каналами одного блока: в первом сигнал A — счётный вход, B — управляющий, во втором наоборот. Действия на фронтах и инверсия по управляющему уровню (POS_MODE, NEG_MODE, LCTRL_MODE, HCTRL_MODE) задают, в какую сторону менять счёт (ESP32 TRM, разд. 23.2.2). Так счётчик растёт при вращении в одну сторону и уменьшается в другую; пример такой настройки есть в документации ESP-IDF для PCNT.
Что делать, если 16 бит счётчика мало?
Использовать точки срабатывания: при достижении наибольшего или наименьшего значения счётчик сбрасывается в 0 и выдаёт прерывание (ESP32 TRM, разд. 23.2.3). Наш вывод: в обработчике к программной старшей части прибавляют или вычитают предел, и полный счёт — это сумма программной части и текущего значения счётчика.
Какую частоту импульсов выдержит PCNT?
По ESP32 TRM — до 40 МГц. Входы опрашиваются по фронтам APB_CLK, поэтому импульсы короче одного периода APB_CLK могут пропасть даже без фильтра. Фильтр отбрасывает импульсы короче заданного числа тактов APB_CLK, что полезно против дребезга механических датчиков (разд. 23.2.2).
Источники
- Espressif. ESP32 Technical Reference Manual, Version 5.8 — гл. 23 — PCNT считает нарастающие и спадающие фронты; у блока 16-битный счётчик со знаком и два канала, каждый увеличивает или уменьшает счёт; у канала сигнальный и управляющий входы; восемь независимых блоков; наибольшая частота импульсов 40 МГц; 23.2.2 — POS_MODE и NEG_MODE: 1 — +1, 2 — −1; LCTRL_MODE и HCTRL_MODE при низком и высоком управляющем уровне: 0 — без изменений, 1 — инверсия, иначе — запрет; фильтр короче REG_FILTER_THRES тактов APB_CLK; пауза и сброс счётчика; 23.2.3 — пять точек срабатывания с общим прерыванием: наибольшее (сброс в 0), наименьшее (сброс в 0), два порога, ноль
- Espressif. ESP-IDF Programming Guide v6.1: Pulse Counter (PCNT) (ESP32) — драйвер PCNT: блоки, каналы, действия на фронтах и уровнях, фильтр помех, точки наблюдения (watch points); декодирование квадратурных сигналов в скорость и направление; пример peripherals/pcnt/rotary_encoder для энкодера EC11
- Espressif. ESP-IDF v6.1 soc_caps.h — SOC_PCNT_SUPPORTED у ESP32, S2, S3, C6, H2; у ESP32-C3 PCNT нет
Нашли ошибку?
Смотрите также
- Режим энкодера таймераАппаратный счёт сигналов A и B инкрементального энкодера
- RMT (импульсные последовательности ESP32)Периферия ESP32 для передачи и приёма последовательностей импульсов
- ESP32ESP32, S2, S3, C2, C3, C5, C6, H2, P4: ядра, радио, USB, GPIO — сравнение и выбор
- Дребезг контактовСерия переключений вместо одного при нажатии кнопки
- Матрица GPIOПрограммное соединение сигналов периферии ESP32 с любыми выводами