class Counter – contatore di impulsi

La classe Counter incapsula il blocco hardware QENC (quadrature encoder / counter) dell’i.MX RT configurato come contatore di impulsi a ingresso singolo. Ogni fronte di salita sul pin sorgente incrementa (o decrementa) un contatore di posizione hardware; e” possibile associare callback software agli eventi ROLL_OVER / ROLL_UNDER / RESET / INDEX / MATCH.

Disponibile solo sulla OpenMV Cam RT1062 (porta mimxrt). Sulle OpenMV cam basate su STM32, usare pyb.Timer configurato per la cattura in ingresso (input-capture). Non esposto sulla OpenMV Cam AE3 (porta alif).

Esempio di utilizzo:

from machine import Pin, Counter

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

Costruttori

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)

Costruisce (o recupera il singleton per) il blocco contatore QENC identificato da id. L’RT1062 dispone di piu” blocchi QENC (id ne seleziona uno); gli stessi argomenti sono accettati anche da init() per riconfigurare un’istanza esistente.

src – il pin di ingresso i cui fronti di salita vengono contati.

direction (solo keyword) – puo” essere UP / DOWN per impostare una direzione fissa, oppure un Pin il cui livello logico seleziona la direzione a runtime (basso = conta in avanti, alto = conta all’indietro).

filter_ns (solo keyword) – tempo minimo di stabilita” dell’ingresso in nanosecondi affinche” un impulso venga contato. Il driver usa il filtro hardware piu” lungo che sia minore o uguale a questo valore. 0 (il valore predefinito) disabilita il filtraggio.

max / min (solo keyword) – intervallo modulo del contatore di posizione. Quando il contatore supera max torna a min e il contatore di cicli viene incrementato (decrementato quando si conta all’indietro). Passare sia max che min a 0 disabilita l’intervallo.

reset (solo keyword) – un Pin il cui fronte di salita ricarica il contatore di posizione al valore iniziale (senza modificare il contatore di cicli).

match (solo keyword) – valore del contatore in corrispondenza del quale scatta un interrupt IRQ_MATCH. Passare None per disabilitare.

match_pin (solo keyword) – un Pin portato a livello alto mentre il contatore di posizione e” uguale a match e basso altrimenti.

Metodi

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

Re-inizializza il contatore con i parametri indicati e azzera i suoi contatori di posizione e di cicli. Accetta gli stessi argomenti keyword del costruttore.

deinit() None

Ferma il contatore, disabilita eventuali interrupt in sospeso e rilascia le risorse hardware QENC. Un soft reset deinizializza automaticamente tutte le istanze di Counter.

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

Legge o imposta il contatore di posizione con segno.

Senza argomenti, restituisce il conteggio corrente.

Con un singolo argomento value, imposta atomicamente il contatore di posizione a value e restituisce il conteggio precedente. L’idioma comune counter.value(0) azzera il contatore all’inizio di una finestra di misura.

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

Legge o imposta il contatore di cicli, un intero con segno a 16 bit che tiene traccia di quante volte il contatore di posizione ha superato max / min.

Senza argomenti, restituisce il conteggio di cicli corrente.

Con un singolo argomento value, imposta il contatore di cicli a value (senza toccare il contatore di posizione) e restituisce il conteggio precedente.

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

Registra un callback da invocare quando si verifica uno degli eventi QENC supportati. L’handler riceve l’oggetto Counter come unico argomento; l’evento specifico puo” essere identificato all’interno dell’handler tramite irq.flags().

trigger e” una maschera di bit di una o piu” costanti IRQ_*:

  • IRQ_RESET – il pin reset e” stato asserito.

  • IRQ_INDEX – una transizione sulla linea index.

  • IRQ_MATCH – il contatore di posizione ha raggiunto match. Il match viene disabilitato automaticamente dopo lo scatto e deve essere riarmato reinstallando l’IRQ.

  • IRQ_ROLL_OVER – il contatore di posizione e” passato da max a min.

  • IRQ_ROLL_UNDER – il contatore di posizione e” passato da min a max.

hard=True registra un gestore di interrupt hardware (latenza inferiore, ma il gestore non deve allocare memoria). Il valore predefinito e” un callback schedulato. Passare handler=None per disabilitare l’interrupt.

Costanti

UP: int

Passare a direction per contare i fronti di salita come positivi.

DOWN: int

Passare a direction per contare i fronti di salita come negativi.

IRQ_RESET: int

Flag di trigger di irq() per l’evento del pin reset.

IRQ_INDEX: int

Flag di trigger di irq() per l’evento di ingresso index.

IRQ_MATCH: int

Flag di trigger di irq() per l’evento di corrispondenza di posizione.

IRQ_ROLL_OVER: int

Flag di trigger di irq() per un roll-over del contatore (max -> min).

IRQ_ROLL_UNDER: int

Flag di trigger di irq() per un roll-under del contatore (min -> max).