class Counter – Impulszähler

Die Klasse Counter kapselt den i.MX RT QENC-Hardwareblock (Quadraturencoder/Zähler), der als Impulszähler mit einem einzigen Eingang konfiguriert ist. Jede steigende Flanke am Quell-Pin erhöht (oder verringert) einen Hardware-Positionszähler; Software-Callbacks können an die Ereignisse ROLL_OVER / ROLL_UNDER / RESET / INDEX / MATCH angehängt 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 Input-Capture konfiguriert ist. Auf der OpenMV Cam AE3 (alif-Port) nicht verfügbar.

Anwendungsbeispiel:

from machine import Pin, Counter

counter = Counter(0, Pin("P0", Pin.IN))
counter.value(0)
# ... wait some time ...
print("pulses:", counter.value())

Konstruktoren

class machine.Counter(id: int, src: Pin | None = None, *, direction: int | Pin = UP, filter_ns: int = 0, max: int | None = None, min: int = 0, reset: Pin | None = None, match: int | None = None, match_pin: Pin | None = None)

Konstruiert (oder ruft das Singleton ab für) den QENC-Zählerblock, der durch id identifiziert wird. Der RT1062 verfügt über mehrere QENC-Blöcke (id wählt einen aus); dieselben Argumente werden auch von init() akzeptiert, um eine bestehende Instanz neu zu konfigurieren.

src – der Eingangs-Pin, dessen steigende Flanken gezählt werden.

direction (nur als Schlüsselwort) – entweder UP / DOWN, um eine feste Richtung festzulegen, oder ein Pin, dessen Logikpegel die Richtung zur Laufzeit auswählt (low = aufwärts zählen, high = abwärts zählen).

filter_ns (nur als Schlüsselwort) – minimale Eingangs-Stabilitätszeit in Nanosekunden, damit ein Impuls gezählt wird. 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 (beim Abwärtszählen verringert). Werden sowohl max als auch min als 0 übergeben, wird der Bereich deaktiviert.

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) – Zählerwert, 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(src: Pin | None = None, *, direction: int | Pin = UP, filter_ns: int = 0, max: int | None = None, min: int = 0, reset: Pin | None = None, match: int | None = None, match_pin: Pin | None = None) None

Initialisiert den Zähler 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 Zähler, deaktiviert alle ausstehenden Interrupts und gibt die QENC-Hardwareressourcen frei. Ein Soft-Reset deinitialisiert automatisch alle Counter-Instanzen.

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

Liest oder setzt den vorzeichenbehafteten Positionszähler.

Ohne Argument wird der aktuelle Zählerstand 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 counter.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[[Counter], 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 Counter-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 – ein Übergang auf der index-Leitung.

  • IRQ_MATCH – der Positionszähler hat match erreicht. Match wird nach dem Auslösen automatisch deaktiviert 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

UP: int

An direction übergeben, um steigende Flanken als positiv zu zählen.

DOWN: int

An direction übergeben, um steigende Flanken als negativ zu zählen.

IRQ_RESET: int

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

IRQ_INDEX: int

irq()-Trigger-Flag für das Index-Eingangsereignis.

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).