classe Encoder – descodificador em quadratura

A classe Encoder encapsula o bloco de hardware i.MX RT QENC configurado como descodificador em quadratura. Rastreia um sinal de duas fases (phase_a / phase_b) proveniente de um encoder rotativo, incrementa ou decrementa um contador de posição de 32 bits de acordo com a relação de fase, e pode ser combinado com entradas opcionais index / reset para referenciação absoluta.

Disponível apenas na OpenMV Cam RT1062 (porta mimxrt). Nas câmaras OpenMV baseadas em STM32, utilize pyb.Timer configurado para modo de encoder (Timer.ENC_AB). Não está disponível na OpenMV Cam AE3 (porta alif).

Exemplo de utilização:

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

Construtores

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)

Constrói (ou obtém o singleton de) o bloco de encoder QENC identificado por id. Os mesmos argumentos são também aceites por init() para reconfigurar uma instância existente.

phase_a / phase_b são os dois pinos de entrada em quadratura.

phases (apenas por palavra-chave) seleciona a granularidade de descodificação. O QENC suporta 1 (conta uma aresta por par de impulsos), 2 (ambos os flancos da fase A) ou 4 («descodificação 4x» – cada aresta de ambas as fases é contada). Predefinição 1.

filter_ns (apenas por palavra-chave) – tempo mínimo de estabilidade do sinal de entrada em nanossegundos. O controlador utiliza o filtro de hardware mais longo que seja menor ou igual a este valor. 0 (o valor predefinido) desativa a filtragem.

max / min (apenas por palavra-chave) – intervalo módulo do contador de posição. Quando o contador ultrapassa max regressa a min e o contador de ciclos incrementa (decrementa ao mover-se na direção oposta). Passar ambos como 0 desativa o intervalo.

index (apenas por palavra-chave) – um Pin cujo flanco ascendente recarrega o contador de posição para min e atualiza o contador de ciclos de acordo com a direção; uso típico como marca de canal Z num encoder rotativo.

reset (apenas por palavra-chave) – um Pin cujo flanco ascendente recarrega o contador de posição para o valor inicial (sem alterar o contador de ciclos).

match (apenas por palavra-chave) – valor de posição em que é gerada uma interrupção IRQ_MATCH. Passe None para desativar.

match_pin (apenas por palavra-chave) – um Pin mantido a alto enquanto o contador de posição é igual a match e a baixo caso contrário.

Métodos

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

Reinicializa o encoder com os parâmetros indicados e repõe os contadores de posição e de ciclos. Aceita os mesmos argumentos por palavra-chave que o construtor.

deinit() None

Para o encoder, desativa quaisquer interrupções pendentes e liberta os recursos de hardware QENC. Um reset por software desinicializa automaticamente todas as instâncias de Encoder.

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

Obtém ou define o contador de posição com sinal.

Sem argumento, devolve a posição atual.

Com um único argumento value, define atomicamente o contador de posição para value e devolve a contagem anterior. O idioma comum enc.value(0) repõe o contador no início de uma janela de medição.

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

Obtém ou define o contador de ciclos, um inteiro de 16 bits com sinal que regista quantas vezes o contador de posição ultrapassou max / min.

Sem argumento, devolve a contagem de ciclos atual.

Com um único argumento value, define o contador de ciclos para value (sem alterar o contador de posição) e devolve a contagem anterior.

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

Regista um callback a invocar quando um dos eventos QENC suportados ocorre. O handler recebe o objeto Encoder como único argumento; o evento específico pode ser identificado dentro do handler através de irq.flags().

trigger é uma máscara de bits de uma ou mais constantes IRQ_*:

  • IRQ_RESET – o pino reset foi ativado.

  • IRQ_INDEX – o pino index foi ativado.

  • IRQ_MATCH – o contador de posição atingiu match. O Match é de disparo único e deve ser rearmado reinstalando o IRQ.

  • IRQ_ROLL_OVER – o contador de posição passou de max para min.

  • IRQ_ROLL_UNDER – o contador de posição passou de min para max.

hard=True regista um handler de interrupção por hardware (menor latência, mas o handler não deve alocar memória). A predefinição é um callback agendado. Passe handler=None para desativar a interrupção.

Constantes

IRQ_RESET: int

Indicador de disparo de irq() para o evento do pino reset.

IRQ_INDEX: int

Indicador de disparo de irq() para o evento do pino index.

IRQ_MATCH: int

Indicador de disparo de irq() para o evento de correspondência de posição.

IRQ_ROLL_OVER: int

Indicador de disparo de irq() para um overflow do contador (max -> min).

IRQ_ROLL_UNDER: int

Indicador de disparo de irq() para um underflow do contador (min -> max).