clasa Counter – numărător de impulsuri

Clasa Counter încapsulează blocul hardware i.MX RT QENC (encoder în cuadratură / numărător) configurat ca numărător de impulsuri cu o singură intrare. Fiecare front crescător de pe pinul sursă incrementează (sau decrementează) un numărător hardware de poziție; funcții de retroapelare (callback) software pot fi atașate evenimentelor ROLL_OVER / ROLL_UNDER / RESET / INDEX / MATCH.

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

Exemplu de utilizare:

from machine import Pin, Counter

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

Constructori

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)

Construiește (sau obține instanța unică pentru) blocul numărător QENC identificat prin id. RT1062 are mai multe blocuri QENC (id selectează unul); aceleași argumente sunt acceptate și de init() pentru a reconfigura o instanță existentă.

src – pinul de intrare ale cărui fronturi crescătoare sunt numărate.

direction (numai ca argument-cheie) – fie UP / DOWN pentru a stabili o direcție fixă, fie un Pin al cărui nivel logic selectează direcția în timpul execuției (nivel jos = numărare crescătoare, nivel ridicat = numărare descrescătoare).

filter_ns (numai ca argument-cheie) – timpul minim de stabilitate a intrării, în nanosecunde, necesar pentru ca un impuls să fie numărat. 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 numărarea descrescătoare). Transmiterea atât a max cât și a min ca 0 dezactivează intervalul.

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 numărătorului 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(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

Reinițializează numărătorul 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 numărătorul, dezactivează orice întreruperi în așteptare și eliberează resursele hardware QENC. O resetare ușoară (soft reset) dezinițializează automat toate instanțele Counter.

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

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

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

Cu un singur argument value, setează atomic numărătorul de poziție la value și returnează valoarea anterioară. Idiomul uzual counter.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[[Counter], 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 Counter 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 – o tranziție pe linia index.

  • IRQ_MATCH – numărătorul de poziție a atins match. Potrivirea este dezactivată automat după 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

UP: int

Transmiteți către direction pentru a număra fronturile crescătoare ca pozitive.

DOWN: int

Transmiteți către direction pentru a număra fronturile crescătoare ca negative.

IRQ_RESET: int

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

IRQ_INDEX: int

Indicator de declanșare irq() pentru evenimentul intrării de 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).