class Counter -- 脈衝計數器

Counter 類別封裝了設定為單一輸入脈衝計數器的 i.MX RT QENC(正交編碼器 / 計數器)硬體區塊。來源接腳上的每個上升緣都會使硬體位置計數器遞增(或遞減);可將軟體回呼函式附加到 ROLL_OVER / ROLL_UNDER / RESET / INDEX / MATCH 事件上。

僅在 OpenMV Cam RT1062(mimxrt port)上可用。在以 STM32 為基礎的 OpenMV cam 上,請改用設定為輸入捕捉的 pyb.Timer。OpenMV Cam AE3(alif port)上未提供此功能。

使用範例:

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)

建構(或取得單例)由 id 識別的 QENC 計數器區塊。RT1062 具有多個 QENC 區塊(id 用於選擇其中之一);init() 也接受相同的參數來重新設定既有的執行個體。

src -- 計數其上升緣的輸入接腳。

direction(僅限關鍵字)-- 可以是 UP / DOWN 以設定固定方向,或是一個 Pin,由其邏輯電位在執行階段選擇方向(低電位 = 向上計數,高電位 = 向下計數)。

filter_ns(僅限關鍵字)-- 一個脈衝要被計數時,輸入訊號需保持穩定的最短時間(奈秒)。驅動程式會採用小於或等於此值的最長硬體濾波器。0(預設值)會停用濾波。

max / min(僅限關鍵字)-- 位置計數器的模數範圍。當計數器超過 max 時會回繞至 min,而循環計數器遞增(向下計數時則遞減)。將 maxmin 都傳入 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)的觸發旗標。