class Encoder – квадратурный декодер

Класс Encoder является обёрткой над аппаратным блоком i.MX RT QENC, настроенным как квадратурный декодер. Он отслеживает двухфазный сигнал (phase_a / phase_b), поступающий от поворотного энкодера, увеличивает или уменьшает 32-битный счётчик позиции в соответствии с фазовым соотношением и может быть скомбинирован с дополнительными входами index / reset для абсолютной привязки.

Доступно только на OpenMV Cam RT1062 (порт mimxrt). На камерах OpenMV на базе STM32 используйте вместо этого pyb.Timer, настроенный на режим энкодера (Timer.ENC_AB). Недоступно на 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)

Создаёт (или возвращает синглтон для) блок энкодера QENC, идентифицируемый по id. Те же аргументы также принимаются методом init() для повторной настройки существующего экземпляра.

phase_a / phase_b – два квадратурных входных вывода.

phases (только именованный аргумент) выбирает гранулярность декодирования. QENC поддерживает 1 (подсчёт одного фронта на пару импульсов), 2 (оба фронта фазы A) или 4 («4x декодирование» – подсчитывается каждый фронт обеих фаз). По умолчанию 1.

filter_ns (только именованный аргумент) – минимальное время стабильности входного сигнала в наносекундах. Драйвер использует самый длинный аппаратный фильтр, который меньше или равен этому значению. 0 (по умолчанию) отключает фильтрацию.

max / min (только именованные аргументы) – диапазон по модулю для счётчика позиции. Когда счётчик переходит через max, он сбрасывается к min, а счётчик циклов увеличивается (уменьшается при движении в другую сторону). Передача обоих равными 0 отключает диапазон.

index (только именованный аргумент) – Pin, нарастающий фронт на котором перезагружает счётчик позиции в min и обновляет счётчик циклов в соответствии с направлением; типичное применение – метка Z-канала на поворотном энкодере.

reset (только именованный аргумент) – Pin, нарастающий фронт на котором перезагружает счётчик позиции в начальное значение (не изменяя счётчик циклов).

match (только именованный аргумент) – значение позиции, при котором срабатывает прерывание IRQ_MATCH. Передайте None для отключения.

match_pin (только именованный аргумент) – Pin, который удерживается в высоком состоянии, пока счётчик позиции равен match, и в низком в противном случае.

Методы

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.

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

Получает или устанавливает знаковый счётчик позиции.

Без аргумента возвращает текущую позицию.

С единственным аргументом value атомарно устанавливает счётчик позиции в value и возвращает предыдущее значение. Распространённый приём enc.value(0) сбрасывает счётчик в начале окна измерения.

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

Получает или устанавливает счётчик циклов – знаковое 16-битное целое число, которое отслеживает, сколько раз счётчик позиции переходил через max / min.

Без аргумента возвращает текущее значение счётчика циклов.

С единственным аргументом value устанавливает счётчик циклов в value (не затрагивая счётчик позиции) и возвращает предыдущее значение.

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

Регистрирует функцию обратного вызова, которая будет вызвана при срабатывании одного из поддерживаемых событий QENC. Обработчик получает объект Encoder в качестве единственного аргумента; конкретное событие можно определить внутри обработчика через irq.flags().

trigger – битовая маска из одной или нескольких констант IRQ_*:

  • IRQ_RESET – вывод reset сработал.

  • IRQ_INDEX – вывод index сработал.

  • IRQ_MATCH – счётчик позиции достиг match. Совпадение является однократным и должно быть повторно активировано путём повторной установки IRQ.

  • IRQ_ROLL_OVER – счётчик позиции перешёл с max на min.

  • IRQ_ROLL_UNDER – счётчик позиции перешёл с min на max.

hard=True регистрирует жёсткий обработчик прерывания (меньшая задержка, но обработчик не должен выделять память). По умолчанию используется запланированная функция обратного вызова. Передайте handler=None для отключения прерывания.

Константы

IRQ_RESET: int

Флаг триггера irq() для события вывода reset.

IRQ_INDEX: int

Флаг триггера irq() для события вывода index.

IRQ_MATCH: int

Флаг триггера irq() для события совпадения позиции.

IRQ_ROLL_OVER: int

Флаг триггера irq() для перехода счётчика через верхнюю границу (max -> min).

IRQ_ROLL_UNDER: int

Флаг триггера irq() для перехода счётчика через нижнюю границу (min -> max).