clase Encoder – decodificador de cuadratura

La clase Encoder envuelve el bloque de hardware QENC del i.MX RT configurado como decodificador de cuadratura. Rastrea una señal de dos fases (phase_a / phase_b) procedente de un codificador rotatorio, incrementa o decrementa un contador de posición de 32 bits según la relación de fase, y se puede combinar con entradas opcionales index / reset para el referenciado absoluto.

Disponible únicamente en la OpenMV Cam RT1062 (puerto mimxrt). En las OpenMV cams basadas en STM32, utilice pyb.Timer configurado para el modo codificador (Timer.ENC_AB) en su lugar. No está expuesto en la OpenMV Cam AE3 (puerto alif).

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

Constructores

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)

Construye (u obtiene el singleton para) el bloque codificador QENC identificado por id. Los mismos argumentos también son aceptados por init() para reconfigurar una instancia existente.

phase_a / phase_b son los dos pines de entrada de cuadratura.

phases (solo por palabra clave) selecciona la granularidad de la decodificación. El QENC admite 1 (cuenta un flanco por par de pulsos), 2 (ambos flancos de la fase A) o 4 («decodificación 4x» – se cuenta cada flanco de ambas fases). El valor predeterminado es 1.

filter_ns (solo por palabra clave) – tiempo mínimo de estabilidad de la entrada en nanosegundos. El controlador utiliza el filtro de hardware más largo que sea menor o igual a este valor. 0 (el valor predeterminado) deshabilita el filtrado.

max / min (solo por palabra clave) – rango de módulo del contador de posición. Cuando el contador supera max da la vuelta a min y el contador de ciclos se incrementa (se decrementa al moverse en el otro sentido). Pasar ambos como 0 deshabilita el rango.

index (solo por palabra clave) – un Pin cuyo flanco de subida recarga el contador de posición a min y actualiza el contador de ciclos según la dirección; su uso típico es una marca de canal Z en un codificador rotatorio.

reset (solo por palabra clave) – un Pin cuyo flanco de subida recarga el contador de posición al valor inicial (sin cambiar el contador de ciclos).

match (solo por palabra clave) – valor de posición en el que se dispara una interrupción IRQ_MATCH. Pase None para deshabilitarla.

match_pin (solo por palabra clave) – un Pin que se pone en alto mientras el contador de posición es igual a match y en bajo en caso contrario.

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 el codificador con los parámetros dados y restablece sus contadores de posición y de ciclos. Acepta los mismos argumentos por palabra clave que el constructor.

deinit() None

Detiene el codificador, deshabilita cualquier interrupción pendiente y libera los recursos de hardware QENC. Un reinicio por software desinicializa automáticamente todas las instancias de Encoder.

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

Obtiene o establece el contador de posición con signo.

Sin argumento, devuelve la posición actual.

Con un único argumento value, establece de forma atómica el contador de posición a value y devuelve el conteo anterior. El uso habitual enc.value(0) restablece el contador al inicio de una ventana de medición.

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

Obtiene o establece el contador de ciclos, un entero con signo de 16 bits que registra cuántas veces el contador de posición ha superado max / min.

Sin argumento, devuelve el conteo de ciclos actual.

Con un único argumento value, establece el contador de ciclos a value (sin tocar el contador de posición) y devuelve el conteo anterior.

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

Registra una función de retorno (callback) que se invocará cuando se dispare uno de los eventos QENC admitidos. El manejador recibe el objeto Encoder como su único argumento; el evento específico se puede identificar dentro del manejador mediante irq.flags().

trigger es una máscara de bits de una o más constantes IRQ_*:

  • IRQ_RESET – el pin reset se activó.

  • IRQ_INDEX – el pin index se activó.

  • IRQ_MATCH – el contador de posición alcanzó match. La coincidencia es de un solo disparo y debe rearmarse reinstalando la IRQ.

  • IRQ_ROLL_OVER – el contador de posición dio la vuelta de max a min.

  • IRQ_ROLL_UNDER – el contador de posición dio la vuelta de min a max.

hard=True registra un manejador de interrupción duro (menor latencia, pero el manejador no debe asignar memoria). El valor predeterminado es una función de retorno (callback) programada. Pase handler=None para deshabilitar la interrupción.

Constantes

IRQ_RESET: int

Indicador de disparo de irq() para el evento del pin reset.

IRQ_INDEX: int

Indicador de disparo de irq() para el evento del pin index.

IRQ_MATCH: int

Indicador de disparo de irq() para el evento de coincidencia de posición.

IRQ_ROLL_OVER: int

Indicador de disparo de irq() para un desbordamiento superior del contador (max -> min).

IRQ_ROLL_UNDER: int

Indicador de disparo de irq() para un desbordamiento inferior del contador (min -> max).