classe Encoder – decodificador de quadratura

A classe Encoder encapsula o bloco de hardware QENC do i.MX RT configurado como um decodificador de quadratura. Ela rastreia um sinal de duas fases (phase_a / phase_b) proveniente de um codificador rotativo, incrementa ou decrementa um contador de posição de 32 bits de acordo com a relação de fase, e pode ser combinada com entradas opcionais index / reset para referenciamento absoluto.

Disponível apenas na OpenMV Cam RT1062 (porta mimxrt). Nas OpenMV cams baseadas em STM32, use pyb.Timer configurado para o modo de codificador (Timer.ENC_AB). Não exposto na OpenMV Cam AE3 (porta alif).

Exemplo de uso:

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 a instância singleton de) o bloco codificador QENC identificado por id. Os mesmos argumentos também são aceitos por init() para reconfigurar uma instância existente.

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

phases (somente por palavra-chave) seleciona a granularidade de decodificação. O QENC suporta 1 (conta uma borda por par de pulsos), 2 (ambas as bordas da fase A) ou 4 (“decodificação 4x” – toda borda de ambas as fases é contada). Padrão 1.

filter_ns (somente por palavra-chave) – tempo mínimo de estabilidade da entrada em nanossegundos. O driver usa o filtro de hardware mais longo que seja menor ou igual a esse valor. 0 (o padrão) desativa a filtragem.

max / min (somente por palavra-chave) – faixa de módulo do contador de posição. Quando o contador ultrapassa max ele retorna a min e o contador de ciclos é incrementado (decrementado ao mover-se na outra direção). Passar ambos como 0 desativa a faixa.

index (somente por palavra-chave) – um Pin cuja borda de subida recarrega o contador de posição para min e atualiza o contador de ciclos de acordo com a direção; o uso típico é uma marca de canal Z em um codificador rotativo.

reset (somente por palavra-chave) – um Pin cuja borda de subida recarrega o contador de posição para o valor inicial (sem alterar o contador de ciclos).

match (somente por palavra-chave) – valor de posição no qual uma interrupção IRQ_MATCH é disparada. Passe None para desativar.

match_pin (somente por palavra-chave) – um Pin mantido em nível alto enquanto o contador de posição é igual a match e em nível 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 codificador com os parâmetros fornecidos e zera seus contadores de posição e de ciclos. Aceita os mesmos argumentos por palavra-chave que o construtor.

deinit() None

Para o codificador, desativa quaisquer interrupções pendentes e libera os recursos de hardware QENC. Um soft reset 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, retorna a posição atual.

Com um único argumento value, define atomicamente o contador de posição como value e retorna a contagem anterior. O idioma comum enc.value(0) zera 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 rastreia quantas vezes o contador de posição ultrapassou max / min.

Sem argumento, retorna a contagem de ciclos atual.

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

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

Registra um callback a ser invocado quando um dos eventos QENC suportados é disparado. O handler recebe o objeto Encoder como seu único argumento; o evento específico pode ser identificado dentro do handler via irq.flags().

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

  • IRQ_RESET – o pino reset foi acionado.

  • IRQ_INDEX – o pino index foi acionado.

  • IRQ_MATCH – o contador de posição atingiu match. O match é de disparo único (one-shot) e deve ser rearmado reinstalando a IRQ.

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

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

hard=True registra um handler de interrupção em hardware (menor latência, mas o handler não pode alocar memória). O padrão é um callback agendado. Passe handler=None para desativar a interrupção.

Constantes

IRQ_RESET: int

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

IRQ_INDEX: int

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

IRQ_MATCH: int

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

IRQ_ROLL_OVER: int

Flag de disparo de irq() para um roll-over do contador (max -> min).

IRQ_ROLL_UNDER: int

Flag de disparo de irq() para um roll-under do contador (min -> max).