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 deinit()pentru a reconfigura o instanță existentă.phase_a/phase_bsunt 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) sau4(„decodare 4x” – se numără fiecare front al ambelor faze). Implicit1.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ștemax, acesta se readuce lamin, iar numărătorul de cicluri se incrementează (se decrementează la deplasarea în sens invers). Transmiterea ambelor ca0dezactivează intervalul.index(numai ca argument-cheie) – unPinal cărui front crescător reîncarcă numărătorul de poziție laminș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) – unPinal 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 întrerupereIRQ_MATCH. TransmitețiNonepentru a dezactiva.match_pin(numai ca argument-cheie) – unPinmenținut la nivel ridicat cât timp numărătorul de poziție este egal cumatchș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 lavalueși returnează valoarea anterioară. Idiomul uzualenc.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 lavalue(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
Encoderca singur argument; evenimentul specific poate fi identificat în interiorul funcției prinirq.flags().triggereste o mască de biți alcătuită din una sau mai multe constanteIRQ_*:IRQ_RESET– pinulreseta fost activat.IRQ_INDEX– pinulindexa fost activat.IRQ_MATCH– numărătorul de poziție a atinsmatch. 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 lamaxlamin.IRQ_ROLL_UNDER– numărătorul de poziție s-a readus de laminlamax.
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țihandler=Nonepentru a dezactiva întreruperea.
Constante¶