So lesen Sie Encoderwerte mit Arduino aus

D

Daniel Zhang

Zuletzt aktualisiert am Jul 12, 2026

Wie Sie einen Encoderwert auslesen, hängt vom Encodertyp ab. Die Leseverfahren für Inkremental- und Absolutencoder werden nachfolgend beschrieben.

Inkrementalencoder

Inkrementalencoder liefern zwei Ausgangssignalkanäle: Kanal A und Kanal B. Dabei handelt es sich um Impulssignale, die um 90 elektrische Grad zueinander phasenverschoben sind. Durch die Erfassung der Zustandsänderungen auf Kanal A und Kanal B können Sie sowohl die Drehrichtung als auch den Drehwinkel bestimmen. Nachfolgend finden Sie die grundlegenden Schritte zum Auslesen eines Inkrementalencoders mit einem Arduino.

  1. Verbinden Sie Kanal A und Kanal B des Encoders mit interruptfähigen Pins am Arduino (z. B. Pin 2 und Pin 3).
  2. Definieren Sie im Arduino-Code eine globale Variable zur Speicherung des Encoderzählerstands.
  3. Schreiben Sie eine Interrupt-Service-Routine (ISR) zur Verarbeitung der Zustandsänderungen auf Kanal A und Kanal B. Bestimmen Sie in dieser Routine die Drehrichtung, indem Sie den aktuellen Zustand eines Kanals mit dem vorherigen Zustand des anderen Kanals vergleichen, und aktualisieren Sie anschließend den Encoderzählerstand entsprechend.
volatile long encoderCount = 0;
int lastB = 0;

void encoderInterrupt() {
  int A = digitalRead(2);
  int B = digitalRead(3);
  // Einfache Quadratur-Decodierung: aktuelles A mit vorherigem B vergleichen
  if (A == lastB) {
    encoderCount++;
  } else {
    encoderCount--;
  }
  lastB = B;
}
  1. Konfigurieren Sie in der setup()-Funktion die Pin-Modi und binden Sie die Interrupts ein, sodass die ISR bei jeder Zustandsänderung von Kanal A oder Kanal B ausgelöst wird.
void setup() {
  pinMode(2, INPUT);
  pinMode(3, INPUT);
  lastB = digitalRead(3);
  attachInterrupt(digitalPinToInterrupt(2), encoderInterrupt, CHANGE);
  attachInterrupt(digitalPinToInterrupt(3), encoderInterrupt, CHANGE);
}
  1. Lesen Sie in der Haupt-loop()-Funktion die Variable encoderCount aus, um die relative Position und Drehrichtung der Motorwelle zu ermitteln.

Hinweis: Das obige Beispiel verwendet ein vereinfachtes Quadratur-Decodierungsverfahren. Für Hochgeschwindigkeits- oder hochauflösende Encoder sollten Sie einen vollständigen Quadratur-Zustandsautomaten oder eine dedizierte Encoder-Schnittstellenbibliothek verwenden, um Zählfehler durch Signaljitter oder Kontaktprellen zu vermeiden.

Absolutencoder

Absolutencoder geben ein digitales Signal aus, das die absolute Position der Motorwelle repräsentiert. Das folgende Beispiel bezieht sich speziell auf Absolutencoder mit Parallelausgang, bei denen jedes Bit des Positionswerts über eine separate Datenleitung ausgegeben wird.

Hinweis: Die meisten industriellen Absolutencoder verwenden serielle Kommunikationsschnittstellen wie SSI, SPI oder RS-485 anstelle von Parallelausgängen. Diese Schnittstellen erfordern andere Leseverfahren und teilweise dedizierte Protokollbibliotheken. Beachten Sie stets das Datenblatt Ihres Encoders für die korrekte Schnittstelle und Verdrahtung.

  1. Verbinden Sie jeden Datenpin des Encoders mit einem digitalen Eingangspin am Arduino.
  2. Setzen Sie in der setup()-Funktion jeden Datenpin in den Eingangsmodus.
void setup() {
  pinMode(dataPin1, INPUT);
  pinMode(dataPin2, INPUT);
  // ... Weitere Datenpins, abhängig von der Anzahl der Encoderbits
}
  1. Schreiben Sie eine Funktion zum Auslesen des Encoderwerts. Lesen Sie in dieser Funktion den Zustand jedes Datenpins mit digitalRead() aus und fügen Sie die Ergebnisse zu einem einzigen Ganzzahlwert zusammen.
int readEncoder() {
  int value = 0;
  value |= digitalRead(dataPin1) << 0;
  value |= digitalRead(dataPin2) << 1;
  // ... Weitere Datenpins, abhängig von der Anzahl der Encoderbits
  return value;
}
  1. Rufen Sie in der Haupt-loop()-Funktion die Funktion readEncoder() auf, um die absolute Position der Motorwelle zu ermitteln.

Hinweis: Diese Beispiele behandeln grundlegende Encodertypen. Encoder in realen Anwendungen können eine weitergehende Signalverarbeitung erfordern, wie z. B. die Implementierung einer Signalentprellung oder den Einsatz eines dedizierten Encoder-Schnittstellen-ICs. Beachten Sie stets das Datenblatt des Encoders, um eine korrekte Verdrahtung und Signalverarbeitung sicherzustellen.