クラス Timer -- ハードウェアタイマーの制御
Timer クラスは、指定した時間が経過した後、または一定の周期で、Python のコールバック関数を実行する機能を提供します。
Timer オブジェクトで利用できる機能や制約は、利用する MicroPython のボードやポートによって異なります。
WiPy ボードを使用している場合、このクラスの代わりに machine.TimerWiPy を参照してください。
タイマーの種別
MicroPython には2種類のタイマーが存在しますが、すべてのポートが両方をサポートしているわけではありません:
仮想タイマー: ソフトウェアで管理されるタイマーで、一般的に柔軟性があります。複数の仮想タイマーを同時に作成して動作させることができます。仮想タイマーの
idは-1です。ハードウェアタイマー: ハードウェアタイマーは
0から始まる整数のidを持ちます。利用可能なidの数はハードウェアにより決まります。ハードウェアタイマーは、特にhard=Trueがサポートされ設定されている場合、サブミリ秒精度の非常に細かいタイミングでより高精度になります(割り込みハンドラの作成 を参照)。多くのマイコン向けポートはハードウェアタイマーをサポートしていますが、Zephyr と RP2 は仮想タイマーのみをサポートしています。
コンストラクタ
- class machine.Timer(id, /, ...)
"指定した
idで新しいタイマーオブジェクトを構築します。仮想タイマーをサポートするポートでは、
idパラメータは任意指定です。デフォルト値は-1で、これは仮想タイマーを生成します。ハードウェアタイマーをサポートするポートでは、
idに0以上の整数を指定することで、使用するタイマーを決定します。idは キーワード引数として渡してはいけません。その他の追加パラメータは
Timer.init()と同じように処理されます。
メソッド
- Timer.init(*, mode=Timer.PERIODIC, freq=-1, period=-1, callback=None, hard=True)
タイマーを初期化します。たとえば次のように使います:
def mycallback(t): pass #1kHz で定期的に実行 tim.init(mode=Timer.PERIODIC, freq=1000, callback=mycallback) # 100ms 周期で定期的に実行 tim.init(period=100, callback=mycallback) # 1000ms 後に1度だけ実行 tim.init(mode=Timer.ONE_SHOT, period=1000, callback=mycallback)
キーワード引数:
modeは次のいずれかになります。Timer.ONE_SHOT- タイマーは、設定したチャネルの周期が経過した後に1回だけ実行します。Timer.PERIODIC- タイマーは、チャネルの設定した周期で定期的に実行します。
freq- タイマーの周波数(単位:Hz)。周波数の上限はポートに依存する。freqとperiodの両方の引数を与えた場合、freqの方を優先し、periodは無視します。period- タイマー期間(ミリ秒単位)。callback- タイマー期間が終了したときに呼び出されるコールバックです。コールバックは1つの引数を取らなければならず、その引数にはタイマーオブジェクトが渡されます。callback引数は指定しなければなりません。さもなければ、タイマー満了時に次の例外が発生します:TypeError: 'NoneType' object isn't callablehardは次のいずれかです:True- コールバックはハード割り込みコンテキストで実行されます。これにより遅延やジッタ(時間の揺らぎ)が最小限に抑えられますが、 割り込みハンドラの作成 で説明されている制限を受けます。すべてのポートがハード割り込みをサポートしているわけではありません。詳細については、各ポートのドキュメントを参照してください。False- コールバックはソフト割り込みとしてスケジュールされ、メモリ割り当てが可能になりますが、ガベージコレクションの遅延とジッターも発生する可能性があります。
このパラメータのデフォルト値は、歴史的な理由によりポート固有です。
- Timer.deinit()
タイマーを非初期化します。タイマーを停止し、タイマーのペリフェラルを無効にします。