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刻み。deadtimesource_freqdiv で割ったクロックティックのティック数を測定します。deadtime はタイマー 1 と 8 でのみ利用可能です。

  • brk - BRK_IN 入力がアサートされたときにPWMの出力を停止するためにブレークモードを使用するかどうかを指定します。この引数の値はブレークが有効かどうかおよびその極性を決定し、Timer.BRK_OFFTimer.BRK_LOWTimer.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つの引数、すなわちタイマーオブジェクトが渡されます。funNone の場合、コールバックは無効になります。

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() に準じます

  • 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本のピンが必要なため、Pin APIを使用して一方または両方のピンを適切なタイマーAFを使用するように設定する必要があります。

  • timer.counter() メソッドを使用してエンコーダ値を読み取ります。

  • CH1とCH2でのみ動作します(CH1NやCH2Nでは動作しません)

  • エンコーダモードを設定する際、チャンネル番号は無視されます。

PWMの例 -- すべてのSTM32 OpenMV Camにおいて TIM4 のチャンネル1とチャンネル2は、それぞれヘッダピン P7P8 にルーティングされています:

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)
counter(value: int | None = None) int | None

タイマーカウンターを取得または設定します。

freq(value: int | float | None = None) int | float | None

タイマーの周波数を取得または設定します(設定された場合はプリスケーラと周期が変更されます)。

period(value: int | None = None) int | None

タイマーの周期を取得または設定します。

prescaler(value: int | None = None) int | None

タイマーのプリスケーラを取得または設定します。

source_freq() int

タイマーのソースの周波数を取得します。

定数

カウンターモード定数(init()mode 引数):

UP: int

0 からARRまでカウントアップします(デフォルトモード)。

DOWN: int

ARRから 0 までカウントダウンします。

CENTER: int

0 からARRまでカウントアップし、その後再び 0 までカウントダウンします。

ブレークモード定数(init()brk 引数):

BRK_OFF: int

ブレーク入力は無効です。

BRK_LOW: int

ブレーク入力はアクティブローです。

BRK_HIGH: int

ブレーク入力はアクティブハイです。

チャンネルモード定数(channel()mode 引数):

PWM: int

チャンネルをPWM出力(アクティブハイ)用に設定します。

PWM_INVERTED: int

チャンネルをPWM出力(アクティブロー)用に設定します。

OC_TIMING: int

出力コンペアタイミングモード。どのピンも駆動されません。

OC_ACTIVE: int

出力コンペアアクティブモード。コンペアマッチ時にピンがアクティブになります。

OC_INACTIVE: int

出力コンペア非アクティブモード。コンペアマッチ時にピンが非アクティブになります。

OC_TOGGLE: int

出力コンペアトグルモード。コンペアマッチ時にピンがトグルします。

OC_FORCED_ACTIVE: int

出力コンペア強制アクティブモード。ピンが強制的にアクティブになり、コンペアマッチは無視されます。

OC_FORCED_INACTIVE: int

出力コンペア強制非アクティブモード。ピンが強制的に非アクティブになり、コンペアマッチは無視されます。

IC: int

チャンネルを入力キャプチャモード用に設定します。

ENC_A: int

エンコーダモード: カウンターはCH1が変化したときのみ変化します。

ENC_B: int

エンコーダモード: カウンターはCH2が変化したときのみ変化します。

ENC_AB: int

エンコーダモード: カウンターはCH1またはCH2が変化するたびに変化します。

出力コンペアの極性(OCモードにおける channel()polarity 引数):

HIGH: int

出力はアクティブハイです。

LOW: int

出力はアクティブローです。

入力キャプチャの極性(ICモードにおける channel()polarity 引数):

RISING: int

立ち上がりエッジでキャプチャします。

FALLING: int

立ち下がりエッジでキャプチャします。

BOTH: int

いずれかのエッジでキャプチャします。