class Encoder – 직교 디코더

Encoder 클래스는 직교 디코더로 구성된 i.MX RT QENC 하드웨어 블록을 래핑합니다. 로터리 인코더에서 들어오는 2상 신호(phase_a / phase_b)를 추적하고, 위상 관계에 따라 32비트 위치 카운터를 증가 또는 감소시키며, 절대 기준점을 위해 선택적 index / reset 입력과 결합할 수 있습니다.

OpenMV Cam RT1062(mimxrt 포트)에서만 사용할 수 있습니다. STM32 기반 OpenMV 카메라에서는 대신 인코더 모드(Timer.ENC_AB)로 구성된 pyb.Timer를 사용하세요. OpenMV Cam AE3(alif 포트)에서는 제공되지 않습니다.

사용 예:

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

생성자

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)

id로 식별되는 QENC 인코더 블록을 생성합니다(또는 해당 싱글톤을 가져옵니다). 기존 인스턴스를 다시 구성하기 위해 init()도 동일한 인수를 받습니다.

phase_a / phase_b는 두 개의 직교 입력 핀입니다.

phases (키워드 전용) – 디코딩 세분성을 선택합니다. QENC는 1(펄스 쌍당 한 에지 카운트), 2(phase A의 양쪽 에지) 또는 4(“4배 디코딩” – 두 위상의 모든 에지를 카운트)를 지원합니다. 기본값은 1입니다.

filter_ns (키워드 전용) – 최소 입력 안정 시간(나노초 단위)입니다. 드라이버는 이 값보다 작거나 같은 가장 긴 하드웨어 필터를 사용합니다. 0(기본값)은 필터링을 비활성화합니다.

max / min (키워드 전용) – 위치 카운터의 모듈로 범위입니다. 카운터가 max를 넘어가면 min으로 래핑되고 사이클 카운터가 증가합니다(반대 방향으로 이동하면 감소). 둘 다 0으로 전달하면 범위가 비활성화됩니다.

index (키워드 전용) – 상승 에지에서 위치 카운터를 min으로 다시 로드하고 방향에 따라 사이클 카운터를 업데이트하는 Pin입니다. 일반적인 용도는 로터리 인코더의 Z-채널 마크입니다.

reset (키워드 전용) – 상승 에지에서 위치 카운터를 시작 값으로 다시 로드하는 Pin입니다(사이클 카운터는 변경하지 않음).

match (키워드 전용) – IRQ_MATCH 인터럽트가 발생하는 위치 값입니다. 비활성화하려면 None을 전달하세요.

match_pin (키워드 전용) – 위치 카운터가 match와 같을 때 high로 구동되고 그 외에는 low로 구동되는 Pin입니다.

메서드

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

주어진 매개변수로 인코더를 다시 초기화하고 위치 및 사이클 카운터를 재설정합니다. 생성자와 동일한 키워드 인수를 받습니다.

deinit() None

인코더를 중지하고 대기 중인 인터럽트를 비활성화하며 QENC 하드웨어 리소스를 해제합니다. 소프트 리셋은 모든 Encoder 인스턴스를 자동으로 해제(deinitialise)합니다.

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

부호 있는 위치 카운터를 가져오거나 설정합니다.

인수가 없으면 현재 위치를 반환합니다.

단일 value 인수가 있으면 위치 카운터를 value로 원자적으로 설정하고 이전 카운트를 반환합니다. 일반적인 관용구 enc.value(0)은 측정 창 시작 시 카운터를 재설정합니다.

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

위치 카운터가 max / min을 몇 번 넘어갔는지 추적하는 부호 있는 16비트 정수인 사이클 카운터를 가져오거나 설정합니다.

인수가 없으면 현재 사이클 카운트를 반환합니다.

단일 value 인수가 있으면 사이클 카운터를 value로 설정하고(위치 카운터는 건드리지 않음) 이전 카운트를 반환합니다.

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

지원되는 QENC 이벤트 중 하나가 발생할 때 호출할 콜백을 등록합니다. 핸들러는 유일한 인수로 Encoder 객체를 받으며, 핸들러 내부에서 irq.flags()를 통해 특정 이벤트를 식별할 수 있습니다.

trigger는 하나 이상의 IRQ_* 상수로 구성된 비트마스크입니다:

  • IRQ_RESETreset 핀이 어서트되었습니다.

  • IRQ_INDEXindex 핀이 어서트되었습니다.

  • IRQ_MATCH – 위치 카운터가 match에 도달했습니다. Match는 일회성이며 IRQ를 다시 설치하여 재무장해야 합니다.

  • IRQ_ROLL_OVER – 위치 카운터가 max에서 min으로 래핑되었습니다.

  • IRQ_ROLL_UNDER – 위치 카운터가 min에서 max로 래핑되었습니다.

hard=True는 하드 인터럽트 핸들러를 등록합니다(지연 시간이 더 짧지만 핸들러는 메모리를 할당하면 안 됨). 기본값은 스케줄된 콜백입니다. 인터럽트를 비활성화하려면 handler=None을 전달하세요.

상수

IRQ_RESET: int

reset 핀 이벤트에 대한 irq() 트리거 플래그입니다.

IRQ_INDEX: int

index 핀 이벤트에 대한 irq() 트리거 플래그입니다.

IRQ_MATCH: int

위치 일치 이벤트에 대한 irq() 트리거 플래그입니다.

IRQ_ROLL_OVER: int

카운터 롤오버(max -> min)에 대한 irq() 트리거 플래그입니다.

IRQ_ROLL_UNDER: int

카운터 롤언더(min -> max)에 대한 irq() 트리거 플래그입니다.