class Encoder -- 正交解碼器¶
Encoder 類別封裝了設定為正交解碼器的 i.MX RT QENC 硬體區塊。它會追蹤來自旋轉編碼器的雙相位訊號(phase_a / phase_b),依相位關係遞增或遞減 32 位元位置計數器,並可結合選用的 index / reset 輸入來進行絕對參考。
僅在 OpenMV Cam RT1062(mimxrt port)上可用。在以 STM32 為基礎的 OpenMV cam 上,請改用設定為編碼器模式(Timer.ENC_AB)的 pyb.Timer。OpenMV Cam AE3(alif port)上未提供此功能。
使用範例:
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)¶
建構(或取得單例)由
id識別的 QENC 編碼器區塊。init()也接受相同的參數來重新設定既有的執行個體。phase_a/phase_b是兩個正交輸入接腳。phases(僅限關鍵字)選擇解碼的精細度。QENC 支援1(每對脈衝計一個邊緣)、2(相位 A 的兩個邊緣)或4(「4 倍解碼」-- 兩個相位的每個邊緣都計數)。預設為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¶
以給定的參數重新初始化編碼器,並重設其位置與循環計數器。接受與建構子相同的關鍵字引數。
- 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以停用中斷。
常數¶