клас Counter – лічильник імпульсів

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

Доступно лише на OpenMV Cam RT1062 (порт mimxrt). На OpenMV Cam на базі 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. 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).