classe Counter – contador de pulsos

A classe Counter encapsula o bloco de hardware QENC (codificador de quadratura / contador) do i.MX RT configurado como um contador de pulsos de entrada única. Cada borda de subida no pino de origem incrementa (ou decrementa) um contador de posição em hardware; callbacks de software podem ser associados aos eventos ROLL_OVER / ROLL_UNDER / RESET / INDEX / MATCH.

Disponível apenas na OpenMV Cam RT1062 (porta mimxrt). Nas OpenMV cams baseadas em STM32, use pyb.Timer configurado para captura de entrada (input-capture). Não exposto na OpenMV Cam AE3 (porta alif).

Exemplo de uso:

from machine import Pin, Counter

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

Construtores

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)

Constrói (ou obtém a instância singleton de) o bloco contador QENC identificado por id. A RT1062 possui múltiplos blocos QENC (id seleciona um); os mesmos argumentos também são aceitos por init() para reconfigurar uma instância existente.

src – o pino de entrada cujas bordas de subida são contadas.

direction (somente por palavra-chave) – ou UP / DOWN para definir uma direção fixa, ou um Pin cujo nível lógico seleciona a direção em tempo de execução (baixo = contar para cima, alto = contar para baixo).

filter_ns (somente por palavra-chave) – tempo mínimo de estabilidade da entrada em nanossegundos para que um pulso seja contado. 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 contar para baixo). Passar tanto max quanto min como 0 desativa a faixa.

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 do contador 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(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

Reinicializa o contador 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 contador, desativa quaisquer interrupções pendentes e libera os recursos de hardware QENC. Um soft reset desinicializa automaticamente todas as instâncias de Counter.

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

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

Sem argumento, retorna a contagem atual.

Com um único argumento value, define atomicamente o contador de posição como value e retorna a contagem anterior. O idioma comum counter.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[[Counter], 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 Counter 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 – uma transição na linha index.

  • IRQ_MATCH – o contador de posição atingiu match. O match é desativado automaticamente após disparar 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

UP: int

Passe para direction para contar bordas de subida como positivas.

DOWN: int

Passe para direction para contar bordas de subida como negativas.

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 da entrada de índice.

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