klasa Encoder – kvadraturni dekoder

Klasa Encoder obavija i.MX RT QENC sklopovski blok konfiguriran kao kvadraturni dekoder. Prati dvofazni signal (phase_a / phase_b) koji dolazi iz rotacijskog enkodera, povećava ili smanjuje 32-bitni brojač položaja prema faznom odnosu, a može se kombinirati s opcionalnim ulazima index / reset za apsolutno referenciranje.

Dostupno samo na OpenMV Cam RT1062 (mimxrt port). Na OpenMV kamerama temeljenim na STM32 umjesto toga koristite pyb.Timer konfiguriran za enkoderski način rada (Timer.ENC_AB). Nije izloženo na OpenMV Cam AE3 (alif port).

Primjer upotrebe:

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

Konstruktori

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)

Konstruira (ili dohvaća jedinstvenu instancu za) QENC enkoderski blok određen s id. Iste argumente prihvaća i init() za ponovnu konfiguraciju postojeće instance.

phase_a / phase_b su dva kvadraturna ulazna pina.

phases (samo kao ključna riječ) odabire granularnost dekodiranja. QENC podržava 1 (broji jedan brid po paru impulsa), 2 (oba brida faze A) ili 4 („4x dekodiranje” – broji se svaki brid obiju faza). Zadano 1.

filter_ns (samo kao ključna riječ) – minimalno vrijeme stabilnosti ulaza u nanosekundama. Upravljački program koristi najduži sklopovski filtar koji je manji ili jednak ovoj vrijednosti. 0 (zadano) onemogućuje filtriranje.

max / min (samo kao ključna riječ) – modulo raspon brojača položaja. Kada brojač prijeđe max, omota se na min i brojač ciklusa se povećava (smanjuje pri kretanju u suprotnom smjeru). Prosljeđivanje oba kao 0 onemogućuje raspon.

index (samo kao ključna riječ) – Pin čiji rastući brid ponovno učitava brojač položaja na min i ažurira brojač ciklusa prema smjeru; tipična upotreba je oznaka Z-kanala na rotacijskom enkoderu.

reset (samo kao ključna riječ) – Pin čiji rastući brid ponovno učitava brojač položaja na početnu vrijednost (bez promjene brojača ciklusa).

match (samo kao ključna riječ) – vrijednost položaja pri kojoj se okida prekid IRQ_MATCH. Proslijedite None da onemogućite.

match_pin (samo kao ključna riječ) – Pin postavljen visoko dok je brojač položaja jednak match, a inače nisko.

Metode

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

Ponovno inicijalizira enkoder sa zadanim parametrima te resetira njegove brojače položaja i ciklusa. Prihvaća iste argumente s ključnom riječi kao i konstruktor.

deinit() None

Zaustavlja enkoder, onemogućuje sve neobrađene prekide i oslobađa QENC sklopovske resurse. Meko resetiranje (soft reset) automatski deinicijalizira sve Encoder instance.

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

Dohvaća ili postavlja predznakom označen brojač položaja.

Bez argumenta vraća trenutni položaj.

S jednim argumentom value atomarno postavlja brojač položaja na value i vraća prethodnu vrijednost brojanja. Uobičajeni idiom enc.value(0) resetira brojač na početku mjernog prozora.

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

Dohvaća ili postavlja brojač ciklusa, predznakom označen 16-bitni cijeli broj koji prati koliko je puta brojač položaja prešao max / min.

Bez argumenta vraća trenutnu vrijednost brojača ciklusa.

S jednim argumentom value postavlja brojač ciklusa na value (bez utjecaja na brojač položaja) i vraća prethodnu vrijednost.

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

Registrira povratni poziv koji se poziva kada se okine jedan od podržanih QENC događaja. Rukovatelj prima objekt Encoder kao svoj jedini argument; pojedini se događaj može identificirati unutar rukovatelja putem irq.flags().

trigger je bitovna maska jedne ili više IRQ_* konstanti:

  • IRQ_RESET – pin reset je aktiviran.

  • IRQ_INDEX – pin index je aktiviran.

  • IRQ_MATCH – brojač položaja je dosegao match. Podudaranje je jednokratno i mora se ponovno naoružati ponovnom instalacijom IRQ-a.

  • IRQ_ROLL_OVER – brojač položaja omotao se s max na min.

  • IRQ_ROLL_UNDER – brojač položaja omotao se s min na max.

hard=True registrira rukovatelja tvrdim prekidom (manje kašnjenje, ali rukovatelj ne smije alocirati memoriju). Zadano je raspoređeni povratni poziv. Proslijedite handler=None da onemogućite prekid.

Konstante

IRQ_RESET: int

Zastavica okidanja irq() za događaj pina reset.

IRQ_INDEX: int

Zastavica okidanja irq() za događaj pina index.

IRQ_MATCH: int

Zastavica okidanja irq() za događaj podudaranja položaja.

IRQ_ROLL_OVER: int

Zastavica okidanja irq() za prelijevanje brojača (max -> min).

IRQ_ROLL_UNDER: int

Zastavica okidanja irq() za podlijevanje brojača (min -> max).