class Encoder – decodificatore in quadratura

La classe Encoder incapsula il blocco hardware QENC dell’i.MX RT configurato come decodificatore in quadratura. Tiene traccia di un segnale a due fasi (phase_a / phase_b) proveniente da un encoder rotativo, incrementa o decrementa un contatore di posizione a 32 bit in base alla relazione di fase e puo” essere combinato con ingressi opzionali index / reset per il riferimento assoluto.

Disponibile solo sulla OpenMV Cam RT1062 (porta mimxrt). Sulle OpenMV cam basate su STM32, usare pyb.Timer configurato in modalita” encoder (Timer.ENC_AB). Non esposto sulla OpenMV Cam AE3 (porta alif).

Esempio di utilizzo:

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

Costruttori

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)

Costruisce (o recupera il singleton per) il blocco encoder QENC identificato da id. Gli stessi argomenti sono accettati anche da init() per riconfigurare un’istanza esistente.

phase_a / phase_b sono i due pin di ingresso in quadratura.

phases (solo keyword) seleziona la granularita” di decodifica. Il QENC supporta 1 (conta un fronte per coppia di impulsi), 2 (entrambi i fronti della fase A) o 4 («decodifica 4x» – viene contato ogni fronte di entrambe le fasi). Predefinito 1.

filter_ns (solo keyword) – tempo minimo di stabilita” dell’ingresso in nanosecondi. 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 ci si muove nella direzione opposta). Passare entrambi a 0 disabilita l’intervallo.

index (solo keyword) – un Pin il cui fronte di salita ricarica il contatore di posizione a min e aggiorna il contatore di cicli in base alla direzione; l’uso tipico e” un marcatore del canale Z su un encoder rotativo.

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 di posizione 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(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

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

deinit() None

Ferma l’encoder, disabilita eventuali interrupt in sospeso e rilascia le risorse hardware QENC. Un soft reset deinizializza automaticamente tutte le istanze di Encoder.

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

Legge o imposta il contatore di posizione con segno.

Senza argomenti, restituisce la posizione corrente.

Con un singolo argomento value, imposta atomicamente il contatore di posizione a value e restituisce il conteggio precedente. L’idioma comune enc.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[[Encoder], 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 Encoder 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 – il pin index e” stato asserito.

  • IRQ_MATCH – il contatore di posizione ha raggiunto match. Il match e” a colpo singolo 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

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