インターバルタイマ
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までで
別々の周期や位相のずれた波形が作れるようになる。
足していく値を定数でなく、変数とすると
周波数を連続的に変えたりもできる。
------
当然そのままだと、設定できるのはカウンタが
一周する時間の間だけに制限される。
そういう場合は別の方法を考える。
つづく
| 固定リンク | 0

コメント