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для отключения прерывания.
Константы¶