class Counter – счётчик импульсов

Класс Counter является обёрткой над аппаратным блоком i.MX RT QENC (квадратурный энкодер / счётчик), настроенным как счётчик импульсов с одним входом. Каждый нарастающий фронт на входном выводе увеличивает (или уменьшает) аппаратный счётчик позиции; к событиям ROLL_OVER / ROLL_UNDER / RESET / INDEX / MATCH можно прикреплять программные функции обратного вызова.

Доступно только на OpenMV Cam RT1062 (порт mimxrt). На камерах OpenMV на базе STM32 используйте вместо этого pyb.Timer, настроенный на захват входного сигнала. Недоступно на OpenMV Cam AE3 (порт alif).

Пример использования:

from machine import Pin, Counter

counter = Counter(0, Pin("P0", Pin.IN))
counter.value(0)
# ... wait some time ...
print("pulses:", counter.value())

Конструкторы

class machine.Counter(id: int, src: Pin | None = None, *, direction: int | Pin = UP, filter_ns: int = 0, max: int | None = None, min: int = 0, reset: Pin | None = None, match: int | None = None, match_pin: Pin | None = None)

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

src – входной вывод, нарастающие фронты на котором подсчитываются.

direction (только именованный аргумент) – либо UP / DOWN для задания фиксированного направления, либо Pin, логический уровень которого выбирает направление во время выполнения (низкий уровень = счёт вверх, высокий = счёт вниз).

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

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

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

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

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

Методы

init(src: Pin | None = None, *, direction: int | Pin = UP, filter_ns: int = 0, max: int | None = None, min: int = 0, reset: Pin | None = None, match: int | None = None, match_pin: Pin | None = None) None

Повторно инициализирует счётчик с заданными параметрами и сбрасывает его счётчики позиции и циклов. Принимает те же именованные аргументы, что и конструктор.

deinit() None

Останавливает счётчик, отключает все ожидающие прерывания и освобождает аппаратные ресурсы QENC. Программный сброс автоматически деинициализирует все экземпляры Counter.

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

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

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

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

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

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

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

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

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

Регистрирует функцию обратного вызова, которая будет вызвана при срабатывании одного из поддерживаемых событий QENC. Обработчик получает объект Counter в качестве единственного аргумента; конкретное событие можно определить внутри обработчика через 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 для отключения прерывания.

Константы

UP: int

Передайте в direction, чтобы считать нарастающие фронты положительными.

DOWN: int

Передайте в direction, чтобы считать нарастающие фронты отрицательными.

IRQ_RESET: int

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

IRQ_INDEX: int

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

IRQ_MATCH: int

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

IRQ_ROLL_OVER: int

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

IRQ_ROLL_UNDER: int

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