« ワンチップマイコンのタイマ | トップページ | あ、いや... »

2021年5月15日 (土)

インターバルタイマ

CPUはSTM32にて。
他のプロセッサでも、まあ大体同じ。

ある間隔で処理をしたいときなんかに、
タイマーを使ってイベント(割り込み)にて
処理を起動するんだけど。

一定間隔だったら、systickなんかを使って、
定数でカウンタをリセットして、
そのタイミングでイベント起動する。
通常のタイマーだと、ARRを使う。

普通のタイマーだと、イベントと同時に
信号出力もできる。
これを使うと正確な矩形波信号が作れたりする。

------

でもこのやり方だと、一つの信号を作るのに、
一つのタイマーを占有してしまう。

stm32と言えども、そこまでたくさん
タイマーがあるわけではないので
別の方法を使わないと、タイマーが
足りなくなる。

そこで、一つのタイマーに複数付いている
CCRを使って、それぞれ独立した間隔での
イベントを発生させる。

------

まずカウンタのARRは0xffffにして、
フリーランカウンタとする。

タイマー割り込みは、ARRだと更新イベントだけど
CRRxなので、コンペアマッチになる。

CCRの割り込みハンドラ内で、
自身のCCRの値に必要な(欲しい時間間隔の)
定数を足していく。

次の割り込み時刻を自分で更新していく感じ。


void TIM2_IRQHandler(void) {

  if (TIM2->SR & (1 << 1)) { // CH1
    TIM2->CCR1 += 10000;

    TIM2->SR = (1 << 1);
  }
}


こんな感じ。これで、CCR1~4までで
別々の周期や位相のずれた波形が作れるようになる。

足していく値を定数でなく、変数とすると
周波数を連続的に変えたりもできる。

------

当然そのままだと、設定できるのはカウンタが
一周する時間の間だけに制限される。

そういう場合は別の方法を考える。

つづく

| |

« ワンチップマイコンのタイマ | トップページ | あ、いや... »

コメント

コメントを書く



(ウェブ上には掲載しません)




« ワンチップマイコンのタイマ | トップページ | あ、いや... »