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