classe Encoder – décodeur en quadrature

La classe Encoder encapsule le bloc matériel QENC de l’i.MX RT configuré comme décodeur en quadrature. Elle suit un signal à deux phases (phase_a / phase_b) provenant d’un encodeur rotatif, incrémente ou décrémente un compteur de position sur 32 bits selon la relation de phase, et peut être combinée avec des entrées optionnelles index / reset pour un référencement absolu.

Disponible uniquement sur l’OpenMV Cam RT1062 (port mimxrt). Sur les OpenMV Cam basées sur STM32, utilisez plutôt pyb.Timer configuré en mode encodeur (Timer.ENC_AB). Non exposé sur l’OpenMV Cam AE3 (port alif).

Exemple d’utilisation

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

Constructeurs

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)

Construit (ou récupère l’instance unique du) bloc encodeur QENC identifié par id. Les mêmes arguments sont également acceptés par init() pour reconfigurer une instance existante.

phase_a / phase_b sont les deux broches d’entrée de quadrature.

phases (par mot-clé uniquement) sélectionne la granularité de décodage. Le QENC prend en charge 1 (compte un front par paire d’impulsions), 2 (les deux fronts de la phase A) ou 4 (« décodage 4x » – chaque front des deux phases est compté). Par défaut 1.

filter_ns (par mot-clé uniquement) – temps minimal de stabilité de l’entrée en nanosecondes. Le pilote utilise le filtre matériel le plus long inférieur ou égal à cette valeur. 0 (la valeur par défaut) désactive le filtrage.

max / min (par mot-clé uniquement) – plage modulo du compteur de position. Lorsque le compteur dépasse max, il revient à min et le compteur de cycles s’incrémente (se décrémente dans l’autre sens). Passer les deux à 0 désactive la plage.

index (par mot-clé uniquement) – une Pin dont le front montant recharge le compteur de position à min et met à jour le compteur de cycles selon la direction ; l’usage typique est un repère de canal Z sur un encodeur rotatif.

reset (par mot-clé uniquement) – une Pin dont le front montant recharge le compteur de position à la valeur de départ (sans modifier le compteur de cycles).

match (par mot-clé uniquement) – valeur de position à laquelle une interruption IRQ_MATCH se déclenche. Passez None pour désactiver.

match_pin (par mot-clé uniquement) – une Pin mise au niveau haut tant que le compteur de position est égal à match, et au niveau bas sinon.

Méthodes

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

Réinitialise l’encodeur avec les paramètres donnés et remet à zéro ses compteurs de position et de cycles. Accepte les mêmes arguments par mot-clé que le constructeur.

deinit() None

Arrête l’encodeur, désactive toute interruption en attente et libère les ressources matérielles du QENC. Une réinitialisation logicielle dé-initialise automatiquement toutes les instances Encoder.

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

Lit ou définit le compteur de position signé.

Sans argument, renvoie la position courante.

Avec un unique argument value, définit de manière atomique le compteur de position à value et renvoie le décompte précédent. L’idiome courant enc.value(0) remet le compteur à zéro au début d’une fenêtre de mesure.

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

Lit ou définit le compteur de cycles, un entier signé sur 16 bits qui suit le nombre de fois où le compteur de position a dépassé max / min.

Sans argument, renvoie le décompte de cycles courant.

Avec un unique argument value, définit le compteur de cycles à value (sans toucher au compteur de position) et renvoie le décompte précédent.

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

Enregistre une fonction de rappel à invoquer lorsqu’un des événements QENC pris en charge se déclenche. Le gestionnaire reçoit l’objet Encoder comme unique argument ; l’événement spécifique peut être identifié à l’intérieur du gestionnaire via irq.flags().

trigger est un masque de bits composé d’une ou plusieurs constantes IRQ_* :

  • IRQ_RESET – la broche reset a été activée.

  • IRQ_INDEX – la broche index a été activée.

  • IRQ_MATCH – le compteur de position a atteint match. Match est à déclenchement unique et doit être réarmé en réinstallant l’IRQ.

  • IRQ_ROLL_OVER – le compteur de position est passé de max à min.

  • IRQ_ROLL_UNDER – le compteur de position est passé de min à max.

hard=True enregistre un gestionnaire d’interruption matériel (latence plus faible, mais le gestionnaire ne doit pas allouer de mémoire). La valeur par défaut est une fonction de rappel planifiée. Passez handler=None pour désactiver l’interruption.

Constantes

IRQ_RESET: int

Indicateur de déclenchement de irq() pour l’événement de la broche reset.

IRQ_INDEX: int

Indicateur de déclenchement de irq() pour l’événement de la broche index.

IRQ_MATCH: int

Indicateur de déclenchement de irq() pour l’événement de correspondance de position.

IRQ_ROLL_OVER: int

Indicateur de déclenchement de irq() pour un débordement supérieur du compteur (max -> min).

IRQ_ROLL_UNDER: int

Indicateur de déclenchement de irq() pour un débordement inférieur du compteur (min -> max).