class Encoder – Quadraturdecoder

Die Klasse Encoder kapselt den i.MX RT QENC-Hardwareblock, der als Quadraturdecoder konfiguriert ist. Sie verfolgt ein Zweiphasensignal (phase_a / phase_b), das von einem Drehgeber kommt, erhöht oder verringert einen 32-Bit-Positionszähler entsprechend dem Phasenverhältnis und kann mit optionalen index / reset-Eingängen für eine absolute Referenzierung kombiniert werden.

Nur auf der OpenMV Cam RT1062 (mimxrt-Port) verfügbar. Verwenden Sie auf den STM32-basierten OpenMV Cams stattdessen pyb.Timer, der für den Encoder-Modus (Timer.ENC_AB) konfiguriert ist. Auf der OpenMV Cam AE3 (alif-Port) nicht verfügbar.

Anwendungsbeispiel:

from machine import Pin, Encoder

enc = Encoder(0, Pin("P0", Pin.IN), Pin("P1", Pin.IN), phases=4)
enc.value(0)
# ... rotate the encoder ...
print("position:", enc.value())

Konstruktoren

class machine.Encoder(id: int, phase_a: Pin | None = None, phase_b: Pin | None = None, *, phases: int = 1, filter_ns: int = 0, max: int | None = None, min: int = 0, index: Pin | None = None, reset: Pin | None = None, match: int | None = None, match_pin: Pin | None = None)

Konstruiert (oder ruft das Singleton ab für) den QENC-Encoderblock, der durch id identifiziert wird. Dieselben Argumente werden auch von init() akzeptiert, um eine bestehende Instanz neu zu konfigurieren.

phase_a / phase_b sind die beiden Quadratur-Eingangs-Pins.

phases (nur als Schlüsselwort) wählt die Decodierungsgranularität aus. Der QENC unterstützt 1 (zählt eine Flanke pro Impulspaar), 2 (beide Flanken von Phase A) oder 4 („4x-Decodierung“ – jede Flanke beider Phasen wird gezählt). Standard 1.

filter_ns (nur als Schlüsselwort) – minimale Eingangs-Stabilitätszeit in Nanosekunden. Der Treiber verwendet den längsten Hardwarefilter, der kleiner oder gleich diesem Wert ist. 0 (der Standardwert) deaktiviert die Filterung.

max / min (nur als Schlüsselwort) – Modulo-Bereich des Positionszählers. Wenn der Zähler über max hinausläuft, springt er auf min zurück und der Zyklenzähler wird erhöht (in der anderen Richtung verringert). Werden beide als 0 übergeben, wird der Bereich deaktiviert.

index (nur als Schlüsselwort) – ein Pin, dessen steigende Flanke den Positionszähler auf min zurücksetzt und den Zyklenzähler entsprechend der Richtung aktualisiert; typischer Einsatz ist eine Z-Kanal-Marke an einem Drehgeber.

reset (nur als Schlüsselwort) – ein Pin, dessen steigende Flanke den Positionszähler auf den Startwert zurücksetzt (ohne den Zyklenzähler zu verändern).

match (nur als Schlüsselwort) – Positionswert, bei dem ein IRQ_MATCH-Interrupt ausgelöst wird. Übergeben Sie None, um dies zu deaktivieren.

match_pin (nur als Schlüsselwort) – ein Pin, der auf high getrieben wird, solange der Positionszähler gleich match ist, und ansonsten auf low.

Methoden

init(phase_a: Pin | None = None, phase_b: Pin | None = None, *, phases: int = 1, filter_ns: int = 0, max: int | None = None, min: int = 0, index: Pin | None = None, reset: Pin | None = None, match: int | None = None, match_pin: Pin | None = None) None

Initialisiert den Encoder mit den angegebenen Parametern neu und setzt seinen Positions- und Zyklenzähler zurück. Akzeptiert dieselben Schlüsselwortargumente wie der Konstruktor.

deinit() None

Stoppt den Encoder, deaktiviert alle ausstehenden Interrupts und gibt die QENC-Hardwareressourcen frei. Ein Soft-Reset deinitialisiert automatisch alle Encoder-Instanzen.

value() int
value(value: int, /) int

Liest oder setzt den vorzeichenbehafteten Positionszähler.

Ohne Argument wird die aktuelle Position zurückgegeben.

Mit einem einzelnen Argument value wird der Positionszähler atomar auf value gesetzt und der vorherige Zählerstand zurückgegeben. Die übliche Redewendung enc.value(0) setzt den Zähler zu Beginn eines Messfensters zurück.

cycles() int
cycles(value: int, /) int

Liest oder setzt den Zyklenzähler, eine vorzeichenbehaftete 16-Bit-Ganzzahl, die nachverfolgt, wie oft der Positionszähler über max / min hinausgelaufen ist.

Ohne Argument wird der aktuelle Zyklenstand zurückgegeben.

Mit einem einzelnen Argument value wird der Zyklenzähler auf value gesetzt (ohne den Positionszähler zu verändern) und der vorherige Zählerstand zurückgegeben.

irq(handler: Callable[[Encoder], None] | None = None, trigger: int = 0, hard: bool = False) None

Registriert einen Callback, der aufgerufen wird, wenn eines der unterstützten QENC-Ereignisse ausgelöst wird. Der Handler erhält das Encoder-Objekt als einziges Argument; das konkrete Ereignis kann innerhalb des Handlers über irq.flags() identifiziert werden.

trigger ist eine Bitmaske aus einer oder mehreren IRQ_*-Konstanten:

  • IRQ_RESET – der reset-Pin wurde aktiviert.

  • IRQ_INDEX – der index-Pin wurde aktiviert.

  • IRQ_MATCH – der Positionszähler hat match erreicht. Match ist einmalig (One-Shot) und muss durch erneutes Installieren des IRQ wieder scharfgeschaltet werden.

  • IRQ_ROLL_OVER – der Positionszähler ist von max auf min übergesprungen.

  • IRQ_ROLL_UNDER – der Positionszähler ist von min auf max übergesprungen.

hard=True registriert einen Hard-Interrupt-Handler (geringere Latenz, aber der Handler darf nicht allokieren). Der Standard ist ein geplanter Callback. Übergeben Sie handler=None, um den Interrupt zu deaktivieren.

Konstanten

IRQ_RESET: int

irq()-Trigger-Flag für das Ereignis des reset-Pins.

IRQ_INDEX: int

irq()-Trigger-Flag für das Ereignis des index-Pins.

IRQ_MATCH: int

irq()-Trigger-Flag für das Positions-Match-Ereignis.

IRQ_ROLL_OVER: int

irq()-Trigger-Flag für einen Zähler-Überlauf (max -> min).

IRQ_ROLL_UNDER: int

irq()-Trigger-Flag für einen Zähler-Unterlauf (min -> max).