クラス Timer -- 内部タイマーの制御
タイマーはさまざまなタスクに使えますが、現時点では最も単純なケースのみが実装されています。それは定期的な関数の呼出しです。
タイマーはどれも、特定のレートでカウントアップするカウンターから成っています。カウントする速度は、周辺クロック周波数(Hz単位)をタイマープリスケーラーで除算したものです。カウンターがタイマー期間に達すると、イベントがトリガーされ、カウンターはゼロにリセットされます。コールバックメソッドを使うことで、タイマーイベントは Python 関数を呼び出せます。
LEDを固定の頻度で切り替える使用例:
tim = pyb.Timer(4) # タイマー4を使ったタイマーオブジェクトを作成
tim.init(freq=2) # 2Hz でトリガー
tim.callback(lambda t:pyb.LED(1).toggle())
コールバックに名前つき関数を使った例:
def tick(timer): # 呼び出し時にタイマーオブジェクトを受け取る
print(timer.counter()) # 現在のタイマーのカウンター値を表示
tim = pyb.Timer(4, freq=1) # タイマー4を使ったタイマーオブジェクトを作成 - 1Hz でトリガー
tim.callback(tick) # 関数 tick をコールバックに設定
さらなる例:
tim = pyb.Timer(4, freq=100) # freq は Hz 単位
tim = pyb.Timer(4, prescaler=0, period=99)
tim.counter() # カウンター値を取得(設定も可)
tim.prescaler(2) # プリスケーラーを設定(取得も可)
tim.period(199) # 期間を設定(取得も可)
tim.callback(lambda t: ...) # コールバックを設定(t=tim インスタンス)
tim.callback(None) # コールバックを無効化
注記: Timer(2) と Timer(3) は、それぞれ LED(3) と LED(4) の明るさ設定用 PWM に使っています。ただし、これらのタイマーは、関連する LED の明るさが 1 から 254 の値に設定されている場合にのみ PWM 用に設定されます。LED の明るさ機能を使わない場合、これらのタイマーは一般的な用途に自由に使えます。同様に、Timer(5) はサーボドライバーを制御し、Timer(6) はタイミング制御された ADC/DAC の読み書きに使われます。プログラム内では他のタイマーの利用を勧めします。
注記: コールバック(割り込み)中にメモリを割り当てることはできないため、コールバック内で発生した例外はあまり情報を提供しません。この制限を回避する方法については、 micropython.alloc_emergency_exception_buf() を参照してください。
コンストラクタ
- class pyb.Timer(id, ...)
指定の id で新しいタイマーオブジェクトを作成します。追加の引数を指定した場合、
init(...)を使ってタイマーを初期化します。idは 1 から 14 までの範囲で指定できます。
メソッド
- Timer.init(*, freq, prescaler, period, mode=Timer.UP, div=1, callback=None, deadtime=0, brk=Timer.BRK_OFF, hard=True)
タイマーを初期化します。初期化は、周波数(Hz単位)またはプリスケーラーと期間によって行う必要があります。
tim.init(freq=100) # 100Hz でトリガーするタイマーを設定 tim.init(prescaler=83, period=999) # プリスケーラと期間を直に設定
キーワード引数:
freq- タイマーの周期的な周波数を指定します。これは、タイマーが1つの完全なサイクルを通る周波数として考えることもできます。prescaler- 0-0xffffの範囲でタイマーのプリスケーラーレジスタ(PSC)に読み込む値を指定します。タイマーのクロックソースは (prescaler + 1) で割られ、タイマークロックが得られます。タイマー 2-7 および 12-14 はクロックソースが 84 MHz (pyb.freq()[2] * 2) であり、タイマー1 および 8-11 はクロックソースが 168 MHz (pyb.freq()[3] * 2) です。period- タイマー1、3、4 および 6-15 については 0-0xffff の範囲で値を指定できます。タイマー2 および 5 に対しては 0-0x3fffffff の範囲で値を指定できます。これはタイマーのオートリロードレジスタ(ARR)に読み込む値を指定します。これはタイマーの期間を決定します(つまり、カウンターがサイクルするタイミング)。タイマーカウンターは period + 1 タイマークロックサイクル後にオーバーフローします。modeは次のいずれかになります。Timer.UP- タイマーを 0 から ARR までカウントするように設定します(デフォルト)。Timer.DOWN- タイマーを ARR から 0 までカウントするように設定します。Timer.CENTER- タイマーを 0 から ARR までカウントし、その後 0 に戻るように設定します。
div は 1、2、4 のいずれかに設定できます。デジタルフィルタが使うサンプリングクロックを決定するためにタイマークロックを分割します。
callback - Timer.callback() と同様です。
deadtime- 相補的なチャネルのトランジション間の「デッド」または非アクティブな時間を指定します(両方のチャネルが非アクティブになります)。deadtimeは 0 から 1008 までの整数で指定でき、以下の制限があります: 0-128 を1刻みで、128-256 を2刻みで、256-512を8刻みで、512-1008 を16刻みで指定できます。deadtime は、source_freq を div で割ったクロックティックで測定されます。deadtime はタイマー1および8でのみ指定可能です。brk-BRK_IN入力がアサートされたときに PWM の出力を停止するのにブレークモードを使うかを指定します。この引数の値は、ブレークが有効かどうかおよび極性が何であるかを決定し、Timer.BRK_OFF、Timer.BRK_LOW、Timer.BRK_HIGHのいずれかになります。BRK_INピンを選択するには、mode=Pin.ALT, alt=Pin.AFn_TIMxを持つ Pin オブジェクトを構築します。ピンの GPIO 入力機能は alt モードで使えます(pull=,value(),irq())。hardは次のいずれかです:True- The callback will be executed in hard interrupt context, which minimises delay and jitter but is subject to the limitations described in 割り込みハンドラの作成 including being unable to allocate on the heap.False- コールバックはソフト割り込みとしてスケジュールされ、メモリ割り当てが可能になりますが、ガベージコレクションの遅延とジッターも発生する可能性があります。
このオプションのデフォルト値は True です。
freq または period と prescaler の両方の指定は必須です。
- Timer.deinit()
タイマーを無効化します。
コールバック(および関連する割り込み)を無効にします。
チャネルコールバック(および関連する割り込み)を無効にします。タイマーを停止し、タイマーペリフェラルを無効にします。
- Timer.callback(fun)
タイマーがトリガーされたときに呼び出される関数を設定します。
funには1つの引数、つまりタイマーオブジェクトが渡されます。funにNoneを指定した場合、コールバックが無効になります。
- Timer.channel(channel, mode, ...)
チャネル番号のみを指定した場合、以前に初期化されたチャネルオブジェクトが返されます(以前のチャネルが存在しない場合は
Noneが返されます)。さもなければ、TimerChannel オブジェクトを初期化して返します。
各チャネルは、PWM、出力比較、入力キャプチャを実行するように設定できます。すべてのチャネルは、同じ基盤タイマーを共有しています。つまり同じタイマークロック共有していることになります。
キーワード引数:
modeは次のいずれかになります。Timer.PWM--- タイマーを PWM モード(アクティブハイ)に設定します。Timer.PWM_INVERTED--- タイマーを PWM モード(アクティブロー)に設定します。Timer.OC_TIMING--- ピンが駆動されていないことを示します。Timer.OC_ACTIVE--- 比較一致が発生するとピンがアクティブになります(アクティブは極性によって決まります)。Timer.OC_INACTIVE--- 比較一致が発生するとピンが非アクティブになります。Timer.OC_TOGGLE--- 比較一致が発生するとピンがトグルします。Timer.OC_FORCED_ACTIVE--- ピンは強制的にアクティブになります(比較一致は無視されます)。Timer.OC_FORCED_INACTIVE--- ピンは強制的に非アクティブになります(比較一致は無視されます)。Timer.IC--- タイマーを入力キャプチャモードに設定します。Timer.ENC_A--- タイマーをエンコーダモードに設定します。カウンターは CH1 の変化時のみ変更されます。Timer.ENC_B--- タイマーをエンコーダモードに設定します。カウンターは CH2 の変化時のみ変更されます。Timer.ENC_AB--- タイマーをエンコーダモードに設定します。カウンターは CH1 または CH2 の変化時に変更されます。
callback- TimerChannel.callback() と同様です。pin- None (デフォルト)または Pin オブジェクト。指定された場合(Noneでない場合)、指定されたピンの代替機能がこのタイマーチャネルに対して設定されます。ピンがこのタイマーチャネルのための代替機能をサポートしていない場合、エラーが発生します。
Timer.PWM モード用のキーワード引数:
pulse_width- 使用する初期パルス幅の値を決定します。pulse_width_percent- 使用する初期パルス幅のパーセンテージを決定します。
Timer.OC モード用のキーワード引数:
compare- 比較レジスタの初期値を決定します。polarityは次のいずれかになりますTimer.HIGH- 出力がアクティブハイ。Timer.LOW- 出力がアクティブロー。
Timer.IC モード用のオプションのキーワード引数:
polarityは次のいずれかになりますTimer.RISING- 立ち上がりエッジでキャプチャします。Timer.FALLING- 立ち下がりエッジでキャプチャします。Timer.BOTH- 両方のエッジでキャプチャします。
キャプチャはプライマリチャネルでのみ機能し、補助チャネルでは機能しないことに注意してください。
Timer.ENCモードに関する注意事項:
2つのピンが必要なので、1つまたは両方のピンをPin APIを使用して適切なタイマーAFを使うように設定する必要があります。
timer.counter() メソッドを使用してエンコーダの値を読み込みます。
CH1 および CH2 でのみ動作し、CH1N または CH2N では動作しません。
エンコーダモードを設定する際にチャネル番号は無視されます。
PWM の例:
timer = pyb.Timer(2, freq=1000) ch2 = timer.channel(2, pyb.Timer.PWM, pin=pyb.Pin.board.X2, pulse_width=8000) ch3 = timer.channel(3, pyb.Timer.PWM, pin=pyb.Pin.board.X3, pulse_width=16000)
PWMモーターの例。互い補完する出力、デッドタイム、ブレーク入力、ブレークコールバックを使っています:
from pyb import Timer from machine import Pin # machine.Pin は同じピンで alt モードと irq をサポート pin_t8_1 = Pin(Pin.board.Y1, mode=Pin.ALT, af=Pin.AF3_TIM8) # Pin PC6, TIM8_CH1 pin_t8_1n = Pin(Pin.board.X8, mode=Pin.ALT, af=Pin.AF3_TIM8) # Pin PA7, TIM8_CH1N pin_bkin = Pin(Pin.board.X7, mode=Pin.ALT, af=Pin.AF3_TIM8) # Pin PA6, TIM8_BKIN pin_bkin.irq(handler=break_callabck, trigger=Pin.IRQ_FALLING) timer = pyb.Timer(8, freq=1000, deadtime=1008, brk=Timer.BRK_LOW) ch1 = timer.channel(1, pyb.Timer.PWM, pulse_width_percent=30)
- Timer.counter([value])
タイマーカウンターを取得または設定します。
- Timer.freq([value])
タイマーの周波数を取得または設定します(設定の場合、プリスケーラと期間が変更されます)。
- Timer.period([value])
タイマーの期間を取得または設定します。
- Timer.prescaler([value])
タイマーのプリスケーラを取得または設定します。
- Timer.source_freq()
タイマーのソース周波数を取得します。
クラス TimerChannel --- タイマーのチャネルを設定
タイマーチャネルは、タイマーを使用して信号を生成またはキャプチャするのに使います。
TimerChannel オブジェクトは、Timer.channel() メソッドをで作成します。
メソッド
- timerchannel.callback(fun)
タイマーチャネルのトリガー時に呼び出される関数を設定します。
funは1つの引数をとり、タイマーオブジェクトが渡されます。funがNoneの場合、コールバックは無効になります。
- timerchannel.capture([value])
チャネルに関連付けられたキャプチャ値を取得または設定します。capture, compare, pulse_width はすべて同じ関数の別名です。チャネルが入力キャプチャモードの場合、capture は論理的な名前として使います。
- timerchannel.compare([value])
チャネルに関連付けられた比較値を取得または設定します。capture, compare, pulse_width はすべて同じ関数の別名です。チャネルが出力比較モードの場合、compare は論理的な名前として使います。
- timerchannel.pulse_width([value])
チャネルに関連付けられたパルス幅の値を取得または設定します。capture, compare, pulse_width はすべて同じ関数の別名です。チャネルが PWM モードの場合、pulse_width は論理的な名前として使います。
エッジアラインモードでは
period + 1のパルス幅はデューティサイクルが 100% に対応します。センターアラインモードでは、period のパルス幅はデューティサイクルが 100% に対応します。
- timerchannel.pulse_width_percent([value])
チャネルに関連付けられたパルス幅のパーセンテージを取得または設定します。この値は0から100までの数値で、パルスがアクティブなタイマーの期間のパーセンテージを設定します。値は、より正確な制御のために整数または浮動小数点数にできます。たとえば、値が25の場合、デューティサイクルは25%になります。