клас Encoder – квадратурний декодер

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

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