インターバルタイマ

使用するタイマ

使用するMCU ATmega324に搭載されている3つのハードウェアタイマの用途は以下。

タイマ名 サイズ 用途
Timer 0 8ビット インターバルタイマ
ディスプレイ/キーパッドスキャン
ディスプレイ輝度制御
Timer 1 16ビット PWMサウンドの発生
Timer 2 8ビット ユーザに解放

インターバルタイマ(正確な1/1000秒間隔をつくる)

WOBではインターバルタイマは正確に1/1000秒間隔としたい。本家Arduinoでは「1.024ms」間隔であって正確な1/1000秒=1msではないためである。

1/1000秒間隔すなわち目標割り込み頻度 fi = 1000Hzを作り出すために、システムクロック=I/Oクロック=20MHz、タイマプリスケーラを256分周にセットすると、タイマカウンタの入力クロック fc は

fc = 20e6 / 256 = 78125Hz

となり、これにより駆動されるカウンタの周期カウントCは

C = fc / fi = 78125 / 1000 = 78.125[カウント]

と半端な値になり、このままではジャスト fi にはできない。そこで一定期間内の平均値が fi に等しくなるようカウンタを動的に制御して周期を調整する。0.125 = 1 / 8 であることを利用し、次のようにする。

78カウント * 7回 + 79カウント * 1回 = 625 = 78.125 * 8回

カウンタが8回回れば平均して fi に等しくなる。タイマ割込みがかかるたび、次の割込みまでのカウントを78または79に設定しなおせばよい。78カウントをA、79カウントをBとすればそのシーケンスは

A A A A A A A B (Aが7回、Bが1回の出現頻度)

となる。78や79という値は8ビットのタイマにちょうどフィットするのもいい。8回回るまでの平均期間未満では78や79で作られる「ゆらぎ」を生じるが、それは

(79 - 78) / 78 ≒ 1.3%

程度である。