Как считывать значения энкодера с помощью Arduino

D

Daniel Zhang

Обновлено Jul 12, 2026

Способ считывания значения энкодера зависит от его типа. Ниже описаны методы считывания для инкрементальных и абсолютных энкодеров.

Инкрементальный энкодер

Инкрементальные энкодеры формируют два канала выходного сигнала: канал A и канал B. Это импульсные сигналы, сдвинутые друг относительно друга на 90 электрических градусов. Отслеживая изменения состояния каналов A и B, можно определить как направление, так и угол поворота. Ниже приведены основные шаги для считывания показаний инкрементального энкодера с помощью Arduino.

  1. Подключите каналы A и B энкодера к выводам Arduino, поддерживающим прерывания (например, выводы 2 и 3).
  2. Объявите глобальную переменную в коде Arduino для хранения счётчика энкодера.
  3. Напишите процедуру обработки прерывания (ISR) для отслеживания изменений состояния каналов A и B. В этой процедуре определяйте направление вращения, сравнивая текущее состояние одного канала с предыдущим состоянием другого, и соответствующим образом обновляйте счётчик энкодера.
volatile long encoderCount = 0;
int lastB = 0;

void encoderInterrupt() {
  int A = digitalRead(2);
  int B = digitalRead(3);
  // Простое декодирование квадратурного сигнала: сравнение текущего A с предыдущим B
  if (A == lastB) {
    encoderCount++;
  } else {
    encoderCount--;
  }
  lastB = B;
}
  1. В функции setup() настройте режимы выводов и подключите прерывания так, чтобы ISR вызывалась при каждом изменении состояния канала A или канала B.
void setup() {
  pinMode(2, INPUT);
  pinMode(3, INPUT);
  lastB = digitalRead(3);
  attachInterrupt(digitalPinToInterrupt(2), encoderInterrupt, CHANGE);
  attachInterrupt(digitalPinToInterrupt(3), encoderInterrupt, CHANGE);
}
  1. В основном цикле loop() считывайте переменную encoderCount для получения относительного положения и направления вращения вала двигателя.

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

Абсолютный энкодер

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

Примечание: Большинство промышленных абсолютных энкодеров используют последовательные интерфейсы связи, такие как SSI, SPI или RS-485, а не параллельные выходы. Эти интерфейсы требуют других методов считывания и, в некоторых случаях, специализированных библиотек протоколов. Всегда обращайтесь к техническому описанию энкодера для получения информации о правильном интерфейсе и схеме подключения.

  1. Подключите каждый информационный вывод энкодера к цифровому входному выводу Arduino.
  2. В функции setup() настройте каждый информационный вывод в режим входа.
void setup() {
  pinMode(dataPin1, INPUT);
  pinMode(dataPin2, INPUT);
  // ... Дополнительные информационные выводы в зависимости от разрядности энкодера
}
  1. Напишите функцию для считывания значения энкодера. В этой функции считывайте состояние каждого информационного вывода с помощью digitalRead() и объединяйте результаты в одно целочисленное значение.
int readEncoder() {
  int value = 0;
  value |= digitalRead(dataPin1) << 0;
  value |= digitalRead(dataPin2) << 1;
  // ... Дополнительные информационные выводы в зависимости от разрядности энкодера
  return value;
}
  1. В основном цикле loop() вызывайте функцию readEncoder() для получения абсолютного положения вала двигателя.

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