clasa Encoder – decodor în cuadratură

Clasa Encoder încapsulează blocul hardware i.MX RT QENC configurat ca decodor în cuadratură. Aceasta urmărește un semnal în două faze (phase_a / phase_b) provenit de la un encoder rotativ, incrementează sau decrementează un numărător de poziție pe 32 de biți în funcție de relația dintre faze și poate fi combinată cu intrări opționale index / reset pentru referențiere absolută.

Disponibil numai pe OpenMV Cam RT1062 (portul mimxrt). Pe camerele OpenMV bazate pe STM32, folosiți în schimb pyb.Timer configurat pentru modul encoder (Timer.ENC_AB). Nu este expus pe OpenMV Cam AE3 (portul alif).

Exemplu de utilizare:

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

Constructori

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)

Construiește (sau obține instanța unică pentru) blocul encoder QENC identificat prin id. Aceleași argumente sunt acceptate și de init() pentru a reconfigura o instanță existentă.

phase_a / phase_b sunt cei doi pini de intrare în cuadratură.

phases (numai ca argument-cheie) selectează granularitatea decodării. QENC acceptă 1 (numără un front per pereche de impulsuri), 2 (ambele fronturi ale fazei A) sau 4 („decodare 4x” – se numără fiecare front al ambelor faze). Implicit 1.

filter_ns (numai ca argument-cheie) – timpul minim de stabilitate a intrării, în nanosecunde. Driverul folosește cel mai lung filtru hardware care este mai mic sau egal cu această valoare. 0 (valoarea implicită) dezactivează filtrarea.

max / min (numai ca argument-cheie) – intervalul modulo al numărătorului de poziție. Când numărătorul depășește max, acesta se readuce la min, iar numărătorul de cicluri se incrementează (se decrementează la deplasarea în sens invers). Transmiterea ambelor ca 0 dezactivează intervalul.

index (numai ca argument-cheie) – un Pin al cărui front crescător reîncarcă numărătorul de poziție la min și actualizează numărătorul de cicluri în funcție de direcție; o utilizare tipică este un reper de canal Z pe un encoder rotativ.

reset (numai ca argument-cheie) – un Pin al cărui front crescător reîncarcă numărătorul de poziție la valoarea de pornire (fără a modifica numărătorul de cicluri).

match (numai ca argument-cheie) – valoarea de poziție la care se declanșează o întrerupere IRQ_MATCH. Transmiteți None pentru a dezactiva.

match_pin (numai ca argument-cheie) – un Pin menținut la nivel ridicat cât timp numărătorul de poziție este egal cu match și la nivel jos în rest.

Metode

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

Reinițializează encoderul cu parametrii dați și resetează numărătoarele sale de poziție și de cicluri. Acceptă aceleași argumente-cheie ca și constructorul.

deinit() None

Oprește encoderul, dezactivează orice întreruperi în așteptare și eliberează resursele hardware QENC. O resetare ușoară (soft reset) dezinițializează automat toate instanțele Encoder.

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

Citește sau setează numărătorul de poziție cu semn.

Fără argument, returnează poziția curentă.

Cu un singur argument value, setează atomic numărătorul de poziție la value și returnează valoarea anterioară. Idiomul uzual enc.value(0) resetează numărătorul la începutul unei ferestre de măsurare.

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

Citește sau setează numărătorul de cicluri, un întreg cu semn pe 16 biți care urmărește de câte ori numărătorul de poziție a depășit max / min.

Fără argument, returnează valoarea curentă a numărătorului de cicluri.

Cu un singur argument value, setează numărătorul de cicluri la value (fără a atinge numărătorul de poziție) și returnează valoarea anterioară.

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

Înregistrează o funcție de retroapelare (callback) care va fi invocată când se declanșează unul dintre evenimentele QENC acceptate. Funcția de tratare primește obiectul Encoder ca singur argument; evenimentul specific poate fi identificat în interiorul funcției prin irq.flags().

trigger este o mască de biți alcătuită din una sau mai multe constante IRQ_*:

  • IRQ_RESET – pinul reset a fost activat.

  • IRQ_INDEX – pinul index a fost activat.

  • IRQ_MATCH – numărătorul de poziție a atins match. Potrivirea este de tip o singură declanșare și trebuie reactivată prin reinstalarea IRQ-ului.

  • IRQ_ROLL_OVER – numărătorul de poziție s-a readus de la max la min.

  • IRQ_ROLL_UNDER – numărătorul de poziție s-a readus de la min la max.

hard=True înregistrează o funcție de tratare a întreruperilor de tip hard (latență mai mică, dar funcția de tratare nu trebuie să aloce memorie). Valoarea implicită este o funcție de retroapelare programată. Transmiteți handler=None pentru a dezactiva întreruperea.

Constante

IRQ_RESET: int

Indicator de declanșare irq() pentru evenimentul pinului reset.

IRQ_INDEX: int

Indicator de declanșare irq() pentru evenimentul pinului index.

IRQ_MATCH: int

Indicator de declanșare irq() pentru evenimentul de potrivire a poziției.

IRQ_ROLL_OVER: int

Indicator de declanșare irq() pentru o readucere a numărătorului peste limită (max -> min).

IRQ_ROLL_UNDER: int

Indicator de declanșare irq() pentru o readucere a numărătorului sub limită (min -> max).