Найти в Дзене
Stepan.Burmistrov

⚙️Разберём 3 способа читать энкодеры на ESP32

⚙️Разберём 3 способа читать энкодеры на ESP32 Подойдёт для роботов, тележек, манипуляторов и всего, что крутится 🙂 1. Простой опрос порта Подходит для низких скоростей или когда точность не критична. Плюсы: просто Минусы: легко потерять импульсы на быстрых вращениях const int ENC_PIN = 4; int pulses = 0; int lastState = 0; void setup() { pinMode(ENC_PIN, INPUT); lastState = digitalRead(ENC_PIN); } void loop() { int s = digitalRead(ENC_PIN); if (s != lastState) { pulses++; lastState = s; } } 2. Прерывания (ISR) Уже хорошо для быстрых энкодеров. ESP32 умеет работать с прерываниями очень быстро. Плюсы: точнее, чем просто чтение Минусы: опасность дребезга, нужно писать ISR аккуратно const int ENC_PIN = 4; volatile long pulses = 0; void IRAM_ATTR encISR() { pulses++; } void setup() { pinMode(ENC_PIN, INPUT_PULLUP); attachInterrupt(ENC_PIN, encISR, CHANGE); // RISING/ FALLING / CHANGE } void loop() { long p = pulses; // читаем копию } 🔹 3. Аппаратный счётчик — PCNT (Pulse

⚙️Разберём 3 способа читать энкодеры на ESP32

Подойдёт для роботов, тележек, манипуляторов и всего, что крутится 🙂

1. Простой опрос порта

Подходит для низких скоростей или когда точность не критична.

Плюсы: просто

Минусы: легко потерять импульсы на быстрых вращениях

const int ENC_PIN = 4;

int pulses = 0;

int lastState = 0;

void setup() {

pinMode(ENC_PIN, INPUT);

lastState = digitalRead(ENC_PIN);

}

void loop() {

int s = digitalRead(ENC_PIN);

if (s != lastState) {

pulses++;

lastState = s;

}

}

2. Прерывания (ISR)

Уже хорошо для быстрых энкодеров.

ESP32 умеет работать с прерываниями очень быстро.

Плюсы: точнее, чем просто чтение

Минусы: опасность дребезга, нужно писать ISR аккуратно

const int ENC_PIN = 4;

volatile long pulses = 0;

void IRAM_ATTR encISR() {

pulses++;

}

void setup() {

pinMode(ENC_PIN, INPUT_PULLUP);

attachInterrupt(ENC_PIN, encISR, CHANGE); // RISING/ FALLING / CHANGE

}

void loop() {

long p = pulses; // читаем копию

}

🔹 3. Аппаратный счётчик — PCNT (Pulse Counter)

Лучший вариант для роботов:

ESP32 имеет аппаратные счётчики импульсов, которые считают даже когда процессор занят!

Плюсы: супер-точно, не пропускает перепады, минимальная нагрузка на CPU

Минусы: нужно настроить модуль PCNT

Одноканальный пример:

#include "driver/pcnt.h"

#define ENC_PIN 4

#define PCNT_UNIT PCNT_UNIT_0

void setup() {

pcnt_config_t cfg = {};

cfg.pulse_gpio_num = ENC_PIN;

cfg.ctrl_gpio_num = PCNT_PIN_NOT_USED;

cfg.unit = PCNT_UNIT;

cfg.channel = PCNT_CHANNEL_0;

cfg.pos_mode = PCNT_COUNT_INC; // считать на фронте

cfg.neg_mode = PCNT_COUNT_DIS; // не считать на спаде

cfg.lctrl_mode = PCNT_MODE_KEEP;

cfg.hctrl_mode = PCNT_MODE_KEEP;

cfg.counter_h_lim = 32767;

cfg.counter_l_lim = -32768;

pcnt_unit_config(&cfg);

pcnt_counter_pause(PCNT_UNIT);

pcnt_counter_clear(PCNT_UNIT);

pcnt_counter_resume(PCNT_UNIT);

}

void loop() {

int16_t cnt = 0;

pcnt_get_counter_value(PCNT_UNIT, &cnt);

// cnt — реальное число импульсов

}

В процессе подготовки полный материал по Pulse Counter!

А вы какой способ используете в роботах?