Tutorial · Einsteiger · 17 Min. Lesezeit
Quadratur-Encoder lesen für Distanz und Tempo
Quadratur-Encoder dekodieren, Zählwerte in Raddistanz und Geschwindigkeit umrechnen, Richtung und Überlauf behandeln und am echten Roboter kalibrieren.
Ein Radencoder macht aus Drehung digitale Pulse. Zähle diese Pulse, und du misst, wie weit ein Roboter fuhr; zähle sie über Zeit, und du schätzt Geschwindigkeit. Ein Quadratur-Encoder liefert zwei Puls kanäle, A und B, um eine Viertelperiode versetzt. Welcher Kanal zuerst wechselt, verrät die Richtung.
Encoder messen relative Bewegung, keine absolute Position. Der Zählwert wird erst nach dem Start oder einem gezielten Reset bedeutungsvoll — und erst nützlich, nachdem du genau definiert hast, wie viele Zählwerte einer Radumdrehung entsprechen.
Das Zweikanalmuster lesen
Die gültigen Quadraturzustände sind 00, 01, 11 und 10. In eine Richtung durchläufst du diese Folge, in die andere umgekehrt. Es sollte sich immer nur ein Bit auf einmal ändern. Ein Übergang wie 00 direkt nach 11 heißt, eine Flanke ging verloren oder Rauschen hat das Signal verdorben.
Es gibt drei gängige Zählmodi:
- 1×-Dekodierung: eine Flanke an Kanal A pro Periode zählen.
- 2×-Dekodierung: beide Flanken an Kanal A zählen.
- 4×-Dekodierung: jede Flanke beider Kanäle zählen.
Ein Datenblatt mit 12 Pulsen pro Umdrehung kann daher 12, 24 oder 48 Softwarezählwerte pro Encoderwellen-Umdrehung liefern. Addiere das Getriebeverhältnis, wenn der Encoder am Motor statt am Rad sitzt. Schreibe die komplette Konvention neben die Konstante; unerklärte Faktoren zwei und vier sind ein häufiger Odometrie-Bug.
Die Signale korrekt anschließen
Kläre, ob die Ausgänge Push-Pull, Open-Collector oder Open-Drain sind. Offene Ausgänge brauchen Pull-up-Widerstände — intern oder extern je nach Flankenrate und Verdrahtung. Prüfe, dass die Signalspannung für die Steuerung sicher ist — 5-V-Encoderausgang kann einen 3,3-V-Eingang beschädigen.
Halte das Kabel von Motorleitungen fern. Für längere Strecken folge der Kabel- und Abschlussempfehlung des Encoderherstellers. Eine saubere digitale Flanke ist mehr wert, als falsche Zählwerte in Software zu reparieren.
Drehe das Rad vor dem Motorlauf langsam von Hand. Beide Kanäle sollten zwischen gültigen Logikpegeln wechseln. Klemmt einer, fixe die Verdrahtung, bevor du Code debuggst.
Richtung dekodieren, ohne Zählwerte zu verlieren
Für moderate Drehzahlen löse bei jedem Wechsel an Kanal A einen Interrupt aus und taste B für die Richtung ab:
volatile long encoderCount = 0;
void onEncoderA() {
bool a = digitalRead(ENCODER_A);
bool b = digitalRead(ENCODER_B);
encoderCount += (a == b) ? 1 : -1;
}
Das Vorzeichen hängt von Kanalreihenfolge und mechanischem Einbau ab. Tausche A und B oder negiere das Ergebnis, sodass Radvorwärts einen positiven Zählwert gibt. Tue das einmal an der Hardwaregrenze statt Vorzeichenwechsel im Odometriecode zu verstreuen.
Bei hohen Flankenraten können wiederholte digitalRead()-Aufrufe zu langsam sein. Nutze eine Hardware-Quadraturperipherie, eine bewährte Plattform-Encoderbibliothek oder direkten Portzugriff passend zur Steuerung. Schätze vorher den schlimmsten Fall: Flanken pro Sekunde = Zählwerte pro Radumdrehung × maximale Radumdrehungen pro Sekunde.
Halte Interrupt-Arbeit kurz. Aktualisiere den Zählwert, dann zurück. Drucken, Gleitkommawandlungen und Regelberechnungen gehören in die Hauptschleife.
Zählwerte in Raddistanz umrechnen
Sei N die dekodierten Zählwerte pro Radumdrehung und D der wirksame Raddurchmesser. Der Radumfang ist πD, also:
Distanz = Zählwert × πD / N
Für ein 65-mm-Rad und 1.440 dekodierte Zählwerte pro Radumdrehung steht jeder Zählwert für etwa 0,142 mm. Diese mathematische Auflösung ist nicht dieselbe wie echte Genauigkeit: Reifenkompression, Radschlupf und Durchmesserfehler sind meist größer.
Lies einen mehrbytigen Zähler sicher. Auf einem kleinen Mikrocontroller kann ein Interrupt ihn mitten im Lesen der Hauptschleife aktualisieren. Sperre kurz Interrupts oder nutze die atomare Einrichtung der Plattform:
noInterrupts();
long snapshot = encoderCount;
interrupts();
float distanceM = snapshot * (PI * wheelDiameterM) / countsPerWheelRev;
Nutze einen ausreichend breiten vorzeichenbehafteten Zähler und rechne Differenzen zwischen Schnappschüssen. Vorzeichenlose Modulo-Subtraktion kann Überlauf behandeln, aber nur, wenn Typen und Abtastintervall bewusst gewählt sind.
Geschwindigkeit schätzen, ohne Rauschen zu verstärken
Bei festem Abtastintervall bilde die Zähldifferenz:
Geschwindigkeit = (neuerZählwert − alterZählwert) × DistanzProZählwert / verstricheneZeit
Kurze Intervalle reagieren schnell, quantisieren aber niedrige Geschwindigkeiten in Null- und Eins-Zählwert-Sprünge. Lange Intervalle sind glatter, fügen aber Verzug hinzu. Starte nahe der Regelkreis-Periode und mittle nur dann wenige Abtastungen, wenn der Regler es wirklich braucht.
Für sehr langsame Bewegung kann Zeitmessung zwischen Flanken besser sein als Flankenzählen im festen Fenster. Welche Methode auch: Nimm einen monotonen Zeitgeber und die gemessene verstrichene Zeit statt anzunehmen, jede Schleife liefe perfekt im Takt.
Am kompletten Antrieb kalibrieren
Markiere das Rad und drehe es exakt zehn Umdrehungen bei aufgezeichneten Zählwerten. Teilen durch zehn dämpft den Effekt des Anhaltens zwischen einzelnen Flanken. Lass den Roboter dann eine vermessene Gerade fahren, vergleiche Encoderdistanz mit Bodendistanz und passe den wirksamen Raddurchmesser an.
Kalibriere linkes und rechtes Rad getrennt. Meldet der Roboter gleiche Distanzen, fährt aber Kurven, unterscheiden sich die zwei wirksamen Durchmesser oder Antriebsverstärkungen. Behalte getrennte Skalfaktoren; echte Reifen und Getriebe brauchen diesen Abgleichknopf.
Wiederhole bei zweiter Geschwindigkeit. Eine große Änderung deutet auf Schlupf, lose Naben, verpasste Flanken oder ein Timingproblem statt simplen Durchmesserfehler.
Schlechte Messwerte diagnostizieren
- Zählwert ändert sich im Stand: elektrisches Rauschen oder schwebende Eingänge; Signale und Pull-ups prüfen.
- Betrag exakt 2× oder 4× falsch: Software-Dekodiermodus und Datenblatt-Pulsdefinition widersprechen sich.
- Richtung springt zufällig: ein Kanal verrauscht oder zu spät abgetastet; Flankenqualität und Dekodiermethode prüfen.
- Zählwerte frieren bei Tempo ein: die Steuerung schafft die Flankenrate nicht; Hardware-Dekodierung nutzen oder Interrupt-Overhead senken.
- Distanz wiederholbar, aber falsch: wirksamen Raddurchmesser und Getriebeverhältnis kalibrieren.
- Distanz je nach Boden anders: der Encoder misst Raddrehung, nicht Bodenwahrheit; Radschlupf ist echte Bewegungsunsicherheit.
Verlässliche Zählwerte sind die Eingabe für Differenzialantriebs-Odometrie, während Geschwindigkeitsrückführung die Motorschleife schließen kann, die der PID-Regler-Simulator erkundet. Diese Pose ist auch die Eingabe, die jeder Pfadfolger voraussetzt — weshalb sein Fehler zu deren Fehler wird.
Weiter
Zählen ist nur die Hälfte. Eine gemessene Drehzahl lohnt sich, weil du sie halten kannst — siehe Drehzahlregelung im geschlossenen Kreis, die aus PWM eine Drehzahl macht und verhindert, dass ein Roboter Kurven fährt, weil ein Motor müde ist. Auf einer holonomen Basis ist das keine Nettigkeit mehr: Die vier Raddrehzahl-Verhältnisse sind die Lenkung, und offen geregelt hat nichts, um sie zu halten.
Den Graphen erkunden
Teil dieser Bauprojekte
Projekte und Lernpfade, die dieses Tutorial enthalten.
- ProjektEinen Mecanum-Roboter bauen, der seitwärts fährt
- ProjektEinen Raumabdeckungsroboter bauen, der Böden kehrt
- ProjektEinen ROS-2-Roboter bauen, der sieht und zu einem Marker fährt
- ProjektGPS-Wegpunkt-Rover bauen: Fährt seine Route selbst
- ProjektMicromouse bauen: Labyrinth-Roboter mit Flood-Fill
- ProjektSelbstbalancierender Roboter: MPU6050 und PID
- LernpfadHolonomer Antrieb: Seitwärts fahren ohne Drehen
- LernpfadMotorsteuerung für Roboter: Ein Lernpfad
- LernpfadPfadfolge für Roboter: Ein Lernpfad
Weiterführende Literatur