オーバーフロー割り込みでの割り込み周期(周波数)計算
2020年2月4日:Arduinoのタイマー OCRレジスタは「n」じゃなく「n - 1」の値を設定せよ
てなことを論じました。
この時はコンペアマッチ割り込みで一定周期(周波数)の
タイミングを得ようというものでした。
同じようなことがオーバーフロー割り込みでも言えるのです。
8ビットタイマーでのオーバーフロー割り込みの発生タイミングは
「255の次」のクロックです。
その時にTCNTの値を書き換えて、所定の周期を得ます。
こんな感じになります。
・オーバーフロー発生タイミングは255の次のクロック
:
253
254
255
0 → OVF発生 → TCNT書き換え
TCNT+1
TCNT+2
:
TCNTを書き換えなければ255→0→1とカウントが進み
クロックの256倍の割り込み周期(1/256の周波数)が
得られます。
TCNTの書き換え値を「254」にすると、
255
0 → OVF → 254
255
0 → OVF → 254
255
0 → OVF → 254
255→254→255→254…と2クロックサイクルで割り込みが
発生します。
クロック数は「256-254」で得られ、設定数は「256-2」で
計算できます。
書き換え値が253の時は
255
0 → OVF → 253
254
255
0 → OVF → 253
255
254
0 → OVF → 253
「256-253」で3クロックサイクルで割り込み発生します。
さて、vabenecosiさんの簡易パルスジェネレータの製作(ソフト編)
この中に置かれているソースファイル:
・2018/2/8 上記に加えてアイドル時の自動画面切り替え表示機能を追加 Simplified_PG_v5r4
をご覧ください。
#define tcnt2base 102 // timer2のTCNT2のBOTTOM値
// 102で約10ms(CK/1024)
ISR(TIMER2_OVF_vect) { …タイマー2のオーバーフロー割り込み
TCNT2 = tcnt2base; …102を設定
t2ovfCnt += 1;
if (t2ovfCnt >= timeout) {
timeoutFlg = true; // タイムアウトフラグをセット
t2ovfCnt = t2ovfCnt - timeout;
}
}
このように10msの割り込み周期を得るのに、
「64usクロックで102」をTCNTに設定されています。
※これだと、ちょっと狂ってしまうのです。
この設定102前後の様子を見てみましょう。
クロックが64us=15.625kHzの時。
TCNT設定値 割り込み周期
254 (256-254) 2パルス 0.128ms 7.8125kHz
253 (256-253) 3パルス 0.192ms 5.208kHz
:
102 154パルス 9.856ms 101.46Hz
101 155パルス 9.920ms 100.81Hz
100 156パルス 9.984ms 100.16Hz
99 157パルス 10.048ms 99.52Hz
15.625kHzから100Hz(10ms)を得るのですから
分周比の近似値は「156」。
ということは「256-156」で、割り込みの時に「100」
をTCNTに書き込まなくてはなりません。
102だと、10msより短い周期になってしまいます。
※テストプログラム PB2~PB5ポートに観察用パルスを出してます。
・ダウンロード - test_tm2_ovf.txt
※インプットキャプチャーとオーバーフローのタイミングは
↓で出しています。
Arduino デューティー計測のためのインプットキャプチャータイミング
| 固定リンク
「Arduino」カテゴリの記事
- 「ダイソーの観覧車」を回せ! 回路図(2022.05.08)
- Arduino UNOのA/D入力:PWMでD/A出力してA/D入力を試す(2022.04.22)
- Arduino IDEでRaspberry Pi Pico:millisをwordで処理した時の異常(2022.04.19)
- Arduino IDEでRaspberry Pi Pico:32bitマイコンがバグを生む(2022.04.14)
- ラズパイ・ピコのmillisとmicros、なぜか遅い!?(2022.04.04)
コメント