AVR用高分解能タイマー割込ライブラリ

前回、公開したタイマー割り込みライブラリはArduinoのタイマー割り込み周期をそのまま使うものだった。

AVR用タイマー割込ライブラリを作成してみた。

今回は、高精度かつ高分解能で割り込みを使えるものを考えてみた。前回同様、他のタイマーは使わずにArduinoの標準タイマー(TIMER0)だけを使って実現しているためTIMER0を使ったPWM出力とは排他的にしか利用できない。
このライブラリを利用するとanalogWrite()/tone()でTIMER0のPWMピンを指定してもPWM出力はできなくなるが割り込み間隔には影響するので注意してほしい。

【スペック】
・分解能は、16MHz=4us/8MHz=8us
・割り込み間隔の範囲は、16MHz=32us-4.77hour/8MHz=64us-9.54hour
・ユーザー割り込みハンドラの戻り値で次の割り込みまでの時間指定が可能。ゼロを返すと割り込み停止。
・ユーザー割り込みハンドラー実行時のライブラリ・オーバーヘッドは16MHzクロックで約11us(実測値)。

TIMER0のような8bitカウンターで256以上をカウントするのに256カウント毎に割り込み発生させると割り込み処理のオーバーヘッドのために256の倍数直後の数カウント以内のタイミングで割り込みを発生させることができない。そのため128カウント毎に割り込みを発生させ半端なカウントは最初の割り込みで調整するように工夫している。

なお、タイマー割り込みが長期間禁止される状況があるとタイマーカウンターのオーバーランが発生し割り込み間隔が狂うので注意してほしい。ユーザー割り込みハンドラーは次の時間以内で処理する必要がある。

割り込み間隔が512us未満:(割り込み間隔 – ユーザー割り込みハンドラー実行時のライブラリ・オーバーヘッド)
割り込み間隔が512us以上:(512us – ユーザー割り込みハンドラー実行時のライブラリ・オーバーヘッド)

例えば、16MHzクロックで割り込み間隔を32 us毎にした場合、余裕は(32us – 11us) = 21us しかない。digitalWrite()/digitalRead()が2回程度しか実行できないくらいの時間なので他に何か処理する余裕はほとんどないと言える。

【サンプル・スケッチ】

【ライブラリ】

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA


このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください