class Counter -- パルスカウンター

Counter クラスは、単一入力のパルスカウンターとして構成された i.MX RT QENC(直交エンコーダー/カウンター)ハードウェアブロックをラップします。ソースピンの立ち上がりエッジごとにハードウェアの位置カウンターがインクリメント(またはデクリメント)され、ROLL_OVER / ROLL_UNDER / RESET / INDEX / MATCH の各イベントにソフトウェアコールバックを割り当てることができます。

OpenMV Cam RT1062(mimxrt ポート)でのみ利用できます。STM32 ベースの OpenMV カメラでは、代わりに入力キャプチャ用に構成した pyb.Timer を使用してください。OpenMV Cam AE3(alif ポート)では公開されていません。

使用例:

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 で 1 つを選択します)。同じ引数は、既存のインスタンスを再構成するための init() でも受け付けられます。

src -- 立ち上がりエッジをカウントする入力ピンです。

direction(キーワード専用)-- 固定方向を設定する UP / DOWN、または論理レベルで実行時に方向を選択する Pin のいずれかです(low = カウントアップ、high = カウントダウン)。

filter_ns(キーワード専用)-- パルスがカウントされるために入力が安定している必要のある最小時間(ナノ秒単位)です。ドライバはこの値以下で最も長いハードウェアフィルタを使用します。0(デフォルト)はフィルタリングを無効にします。

max / min(キーワード専用)-- 位置カウンターのモジュロ範囲です。カウンターが max を超えると min にラップし、サイクルカウンターがインクリメントされます(カウントダウン時はデクリメント)。maxmin の両方に 0 を渡すと範囲が無効になります。

reset(キーワード専用)-- 立ち上がりエッジで位置カウンターを開始値に再ロードする Pin です(サイクルカウンターは変更されません)。

match(キーワード専用)-- IRQ_MATCH 割り込みが発生するカウンター値です。None を渡すと無効になります。

match_pin(キーワード専用)-- 位置カウンターが match と等しい間は high に駆動され、それ以外では low になる Pin です。

メソッド

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 インスタンスが自動的に deinit されます。

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 は、1 つ以上の 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

reset ピンイベントに対する irq() トリガーフラグです。

IRQ_INDEX: int

index 入力イベントに対する irq() トリガーフラグです。

IRQ_MATCH: int

位置一致イベントに対する irq() トリガーフラグです。

IRQ_ROLL_OVER: int

カウンターのロールオーバー(max -> min)に対する irq() トリガーフラグです。

IRQ_ROLL_UNDER: int

カウンターのロールアンダー(min -> max)に対する irq() トリガーフラグです。