class Timer -- 内部タイマーを制御する¶
タイマーは非常に多様なタスクに使用できます。現時点では、最も単純なケース、つまり関数を周期的に呼び出すケースのみが実装されています。
各タイマーは、一定のレートでカウントアップするカウンターで構成されています。カウントするレートは、ペリフェラルクロック周波数(Hz単位)をタイマープリスケーラで割った値です。カウンターがタイマー周期に達するとイベントがトリガーされ、カウンターはゼロにリセットされます。callbackメソッドを使用することで、タイマーイベントからPythonの関数を呼び出すことができます。
固定周波数でLEDを切り替える使用例:
tim = pyb.Timer(4) # create a timer object using timer 4
tim.init(freq=2) # trigger at 2Hz
tim.callback(lambda t:pyb.LED(1).toggle())
コールバックに名前付き関数を使用する例:
def tick(timer): # we will receive the timer object when being called
print(timer.counter()) # show current timer's counter value
tim = pyb.Timer(4, freq=1) # create a timer object using timer 4 - trigger at 1Hz
tim.callback(tick) # set the callback to our tick function
さらなる例:
tim = pyb.Timer(4, freq=100) # freq in Hz
tim = pyb.Timer(4, prescaler=0, period=99)
tim.counter() # get counter (can also set)
tim.prescaler(2) # set prescaler (can also get)
tim.period(199) # set period (can also get)
tim.callback(lambda t: ...) # set callback for update interrupt (t=tim instance)
tim.callback(None) # clear callback
注: Timer(1) はカメラに使用されます。同様に、Timer(5) はサーボドライバを制御し、Timer(6) はタイミング制御されたADC/DACの読み書きに使用されます。プログラム内では他のタイマーを使用することをお勧めします。
注: コールバック(割り込み)の実行中はメモリを割り当てることができないため、コールバック内で発生した例外はあまり多くの情報を提供しません。この制限を回避する方法については micropython.alloc_emergency_exception_buf() を参照してください。
コンストラクタ¶
- class pyb.Timer(id: int, *args, **kwargs)¶
指定したidで新しいタイマーオブジェクトを構築します。追加の引数が指定された場合、タイマーは
init(...)によって初期化されます。有効なid値の範囲は、使用しているOpenMV Cam上のSTM32 MCUに依存します。利用可能な汎用タイマーおよびアドバンスドコントロールタイマーについては、STM32リファレンスマニュアルを参照してください。メソッド¶
- init(*, freq: int | float | None = None, prescaler: int | None = None, period: int | None = None, mode: int = Timer.UP, div: int = 1, callback: Callable[[Timer], None] | None = None, deadtime: int = 0, brk: int = Timer.BRK_OFF, hard: bool = True) None¶
タイマーを初期化します。初期化は、周波数(Hz単位)によるか、プリスケーラと周期によるかのいずれかで行う必要があります:
tim.init(freq=100) # set the timer to trigger at 100Hz tim.init(prescaler=83, period=999) # set the prescaler and period directly
キーワード引数:
freq--- タイマーの周期的な周波数を指定します。これは、タイマーが1つの完全なサイクルを通過する周波数として捉えることもできます。prescaler[0-0xffff] - タイマーのプリスケーラレジスタ(PSC)にロードする値を指定します。タイマークロックソースは(prescaler + 1)で除算されてタイマークロックが導出されます。クロックソースはタイマーの親APBバスから供給され、MCUに依存します。STM32では、APB1上のタイマーは通常2 * pclk1でクロックされ、APB2上のタイマーは2 * pclk2でクロックされます。現在のバス周波数はpyb.freq()で読み取り、お使いのOpenMV CamのMCUについてはSTM32リファレンスマニュアルを参照してください。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オブジェクトを構築します。altモードではピンのGPIO入力機能が利用可能です -pull=、value()、irq()。hardは次のいずれかになります:True- コールバックはハード割り込みコンテキストで実行され、遅延とジッタを最小化しますが、ヒープ上に割り当てができないことを含む 割り込みハンドラの記述 で説明されている制限の対象となります。False- コールバックはソフト割り込みとしてスケジュールされ、割り当てが可能になりますが、ガベージコレクションによる遅延やジッタが発生する可能性もあります。
このオプションのデフォルト値はTrueです。
freq か、period と prescaler の両方のいずれかを指定する必要があります。
- deinit() None¶
タイマーの初期化を解除します。
コールバック(および関連するirq)を無効にします。
すべてのチャンネルコールバック(および関連するirq)を無効にします。タイマーを停止し、タイマーペリフェラルを無効にします。
- callback(fun: Callable[[Timer], None] | None) None¶
タイマーがトリガーされたときに呼び出される関数を設定します。
funには1つの引数、すなわちタイマーオブジェクトが渡されます。funがNoneの場合、コールバックは無効になります。
- channel(channel: int, mode: int | None = None, *args, **kwargs) TimerChannel | None¶
チャンネル番号のみが渡された場合、以前に初期化されたチャンネルオブジェクトが返されます(以前のチャンネルが存在しない場合は
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() に準じますpinNone(デフォルト)または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本のピンが必要なため、Pin APIを使用して一方または両方のピンを適切なタイマーAFを使用するように設定する必要があります。
timer.counter() メソッドを使用してエンコーダ値を読み取ります。
CH1とCH2でのみ動作します(CH1NやCH2Nでは動作しません)
エンコーダモードを設定する際、チャンネル番号は無視されます。
PWMの例 -- すべてのSTM32 OpenMV Camにおいて
TIM4のチャンネル1とチャンネル2は、それぞれヘッダピンP7とP8にルーティングされています:timer = pyb.Timer(4, freq=1000) ch1 = timer.channel(1, pyb.Timer.PWM, pin=pyb.Pin.board.P7, pulse_width=8000) ch2 = timer.channel(2, pyb.Timer.PWM, pin=pyb.Pin.board.P8, pulse_width=16000)
定数¶
カウンターモード定数(
init()のmode引数):ブレークモード定数(
init()のbrk引数):チャンネルモード定数(
channel()のmode引数):出力コンペアの極性(OCモードにおける
channel()のpolarity引数):入力キャプチャの極性(ICモードにおける
channel()のpolarity引数):