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

以給定的參數重新初始化編碼器,並重設其位置與循環計數器。接受與建構子相同的關鍵字引數。

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)的觸發旗標。