classe Counter – contador de impulsos

A classe Counter encapsula o bloco de hardware i.MX RT QENC (codificador em quadratura / contador) configurado como contador de impulsos de entrada única. Cada flanco ascendente no pino de origem incrementa (ou decrementa) um contador de posição por hardware; é possível associar callbacks de software a eventos ROLL_OVER / ROLL_UNDER / RESET / INDEX / MATCH.

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

Exemplo de utilização:

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 o singleton de) o bloco de contador QENC identificado por id. O RT1062 possui múltiplos blocos QENC (id seleciona um); os mesmos argumentos são também aceites por init() para reconfigurar uma instância existente.

src – o pino de entrada cujos flancos ascendentes são contados.

direction (apenas por palavra-chave) – 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 (apenas por palavra-chave) – tempo mínimo de estabilidade do sinal de entrada em nanossegundos para que um impulso seja contado. 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 contar para baixo). Passar max e min ambos como 0 desativa o intervalo.

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 do contador 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(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 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 contador, desativa quaisquer interrupções pendentes e liberta os recursos de hardware QENC. Um reset por software 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, devolve a contagem atual.

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

UP: int

Passar a direction para contar flancos ascendentes como positivos.

DOWN: int

Passar a direction para contar flancos ascendentes como negativos.

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

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