třída Encoder – kvadraturní dekodér

Třída Encoder obaluje hardwarový blok i.MX RT QENC nakonfigurovaný jako kvadraturní dekodér. Sleduje dvoufázový signál (phase_a / phase_b) přicházející z rotačního enkodéru, inkrementuje nebo dekrementuje 32bitový čítač pozice podle fázového vztahu a lze jej kombinovat s volitelnými vstupy index / reset pro absolutní referencování.

Dostupné pouze na OpenMV Cam RT1062 (port mimxrt). Na kamerách OpenMV založených na STM32 použijte místo toho pyb.Timer nakonfigurovaný pro režim enkodéru (Timer.ENC_AB). Není k dispozici na OpenMV Cam AE3 (port alif).

Příklad použití:

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

Konstruktory

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)

Vytvoří (nebo získá singleton pro) blok enkodéru QENC identifikovaný pomocí id. Stejné argumenty přijímá také init() pro rekonfiguraci existující instance.

phase_a / phase_b jsou dva kvadraturní vstupní piny.

phases (pouze jako klíčové slovo) vybírá granularitu dekódování. QENC podporuje 1 (počítat jednu hranu na pár pulzů), 2 (obě hrany fáze A) nebo 4 („4x dekódování“ – počítá se každá hrana obou fází). Výchozí 1.

filter_ns (pouze jako klíčové slovo) – minimální doba stability vstupu v nanosekundách. Ovladač použije nejdelší hardwarový filtr menší nebo roven této hodnotě. 0 (výchozí) filtrování vypne.

max / min (pouze jako klíčové slovo) – modulo rozsah čítače pozice. Když čítač překročí max, přetočí se na min a čítač cyklů se inkrementuje (při pohybu opačným směrem dekrementuje). Předání obou jako 0 rozsah vypne.

index (pouze jako klíčové slovo) – Pin, jehož náběžná hrana znovu načte čítač pozice na min a aktualizuje čítač cyklů podle směru; typickým použitím je značka Z-kanálu na rotačním enkodéru.

reset (pouze jako klíčové slovo) – Pin, jehož náběžná hrana znovu načte čítač pozice na počáteční hodnotu (bez změny čítače cyklů).

match (pouze jako klíčové slovo) – hodnota pozice, při níž se vyvolá přerušení IRQ_MATCH. Předáním None jej vypnete.

match_pin (pouze jako klíčové slovo) – Pin, který je nastaven na vysokou úroveň, dokud se čítač pozice rovná match, jinak na nízkou.

Metody

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

Znovu inicializuje enkodér se zadanými parametry a vynuluje jeho čítače pozice a cyklů. Přijímá stejné klíčové argumenty jako konstruktor.

deinit() None

Zastaví enkodér, vypne všechna čekající přerušení a uvolní hardwarové prostředky QENC. Soft reset automaticky deinicializuje všechny instance Encoder.

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

Získá nebo nastaví znaménkový čítač pozice.

Bez argumentu vrátí aktuální pozici.

S jediným argumentem value atomicky nastaví čítač pozice na value a vrátí předchozí počet. Běžný idiom enc.value(0) vynuluje čítač na začátku měřicího okna.

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

Získá nebo nastaví čítač cyklů, znaménkové 16bitové celé číslo, které sleduje, kolikrát čítač pozice překročil max / min.

Bez argumentu vrátí aktuální počet cyklů.

S jediným argumentem value nastaví čítač cyklů na value (bez ovlivnění čítače pozice) a vrátí předchozí počet.

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

Zaregistruje callback, který se vyvolá při výskytu jedné z podporovaných událostí QENC. Obsluha obdrží jako svůj jediný argument objekt Encoder; konkrétní událost lze uvnitř obsluhy zjistit pomocí irq.flags().

trigger je bitová maska jedné nebo více konstant IRQ_*:

  • IRQ_RESET – pin reset byl aktivován.

  • IRQ_INDEX – pin index byl aktivován.

  • IRQ_MATCH – čítač pozice dosáhl match. Match je jednorázový a musí být znovu aktivován opětovnou instalací IRQ.

  • IRQ_ROLL_OVER – čítač pozice se přetočil z max na min.

  • IRQ_ROLL_UNDER – čítač pozice se přetočil z min na max.

hard=True registruje obsluhu tvrdého přerušení (nižší latence, ale obsluha nesmí alokovat). Výchozí je naplánovaný callback. Předáním handler=None přerušení vypnete.

Konstanty

IRQ_RESET: int

Příznak triggeru irq() pro událost pinu reset.

IRQ_INDEX: int

Příznak triggeru irq() pro událost pinu index.

IRQ_MATCH: int

Příznak triggeru irq() pro událost shody pozice.

IRQ_ROLL_OVER: int

Příznak triggeru irq() pro přetočení čítače nahoru (max -> min).

IRQ_ROLL_UNDER: int

Příznak triggeru irq() pro přetočení čítače dolů (min -> max).