Jak odczytywać wartości enkodera za pomocą Arduino

D

Daniel Zhang

Ostatnia aktualizacja Jul 12, 2026

Sposób odczytu wartości enkodera zależy od jego typu. Poniżej opisano metody odczytu dla enkoderów inkrementalnych i absolutnych.

Enkoder inkrementalny

Enkodery inkrementalne udostępniają dwa kanały sygnału wyjściowego: kanał A i kanał B. Są to sygnały impulsowe przesunięte względem siebie o 90 stopni elektrycznych. Wykrywając zmiany stanu na kanale A i kanale B, można określić zarówno kierunek, jak i kąt obrotu. Poniżej przedstawiono podstawowe kroki odczytu enkodera inkrementalnego za pomocą Arduino.

  1. Podłącz kanał A i kanał B enkodera do pinów Arduino obsługujących przerwania (na przykład piny 2 i 3).
  2. Zdefiniuj zmienną globalną w kodzie Arduino do przechowywania zliczeń enkodera.
  3. Napisz procedurę obsługi przerwania (ISR) do obsługi zmian stanu na kanale A i kanale B. W tej procedurze określ kierunek obrotu, porównując bieżący stan jednego kanału z poprzednim stanem drugiego, a następnie odpowiednio zaktualizuj licznik enkodera.
volatile long encoderCount = 0;
int lastB = 0;

void encoderInterrupt() {
  int A = digitalRead(2);
  int B = digitalRead(3);
  // Proste dekodowanie kwadraturowe: porównaj bieżący A z poprzednim B
  if (A == lastB) {
    encoderCount++;
  } else {
    encoderCount--;
  }
  lastB = B;
}
  1. W funkcji setup() skonfiguruj tryby pinów i dołącz przerwania, tak aby procedura ISR była wywoływana przy każdej zmianie stanu kanału A lub kanału B.
void setup() {
  pinMode(2, INPUT);
  pinMode(3, INPUT);
  lastB = digitalRead(3);
  attachInterrupt(digitalPinToInterrupt(2), encoderInterrupt, CHANGE);
  attachInterrupt(digitalPinToInterrupt(3), encoderInterrupt, CHANGE);
}
  1. W głównej pętli loop() odczytuj zmienną encoderCount, aby uzyskać pozycję względną i kierunek obrotu wału silnika.

Uwaga: Powyższy przykład wykorzystuje uproszczone dekodowanie kwadraturowe. W przypadku enkoderów szybkoobrotowych lub o wysokiej rozdzielczości rozważ zastosowanie pełnego automatu stanów kwadraturowych lub dedykowanej biblioteki interfejsu enkodera, aby uniknąć pominiętych zliczeń spowodowanych drganiami sygnału lub odbiciami styków.

Enkoder absolutny

Enkodery absolutne generują sygnał cyfrowy reprezentujący pozycję absolutną wału silnika. Poniższy przykład dotyczy wyłącznie enkoderów absolutnych z wyjściem równoległym, w których każdy bit wartości pozycji jest prezentowany na osobnym przewodzie danych.

Uwaga: Większość przemysłowych enkoderów absolutnych korzysta z szeregowych interfejsów komunikacyjnych, takich jak SSI, SPI lub RS-485, zamiast wyjść równoległych. Te interfejsy wymagają innych metod odczytu, a w niektórych przypadkach dedykowanych bibliotek protokołów. Zawsze zapoznaj się z kartą katalogową enkodera, aby uzyskać prawidłowe informacje o interfejsie i podłączeniu.

  1. Podłącz każdy pin danych enkodera do cyfrowego pinu wejściowego Arduino.
  2. W funkcji setup() ustaw każdy pin danych w tryb wejścia.
void setup() {
  pinMode(dataPin1, INPUT);
  pinMode(dataPin2, INPUT);
  // ... Dodatkowe piny danych, w zależności od liczby bitów enkodera
}
  1. Napisz funkcję do odczytu wartości enkodera. W tej funkcji odczytaj stan każdego pinu danych za pomocą digitalRead() i połącz wyniki w jedną wartość całkowitą.
int readEncoder() {
  int value = 0;
  value |= digitalRead(dataPin1) << 0;
  value |= digitalRead(dataPin2) << 1;
  // ... Dodatkowe piny danych, w zależności od liczby bitów enkodera
  return value;
}
  1. W głównej pętli loop() wywołuj funkcję readEncoder(), aby uzyskać pozycję absolutną wału silnika.

Uwaga: Powyższe przykłady obejmują podstawowe typy enkoderów. Enkodery w rzeczywistych zastosowaniach mogą wymagać bardziej zaawansowanego przetwarzania, takiego jak implementacja eliminacji drgań styków lub użycie dedykowanego układu scalonego interfejsu enkodera. Zawsze zapoznaj się z kartą katalogową enkodera, aby zapewnić prawidłowe podłączenie i obsługę sygnałów.