« 修理:オンボード・スイッチングレギュレータ回路 | トップページ | JIS、IECの論理回路記号 »

2021年12月24日 (金)

オーバーフロー割り込みでの割り込み周期(周波数)計算

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 デューティー計測のためのインプットキャプチャータイミング

|

« 修理:オンボード・スイッチングレギュレータ回路 | トップページ | JIS、IECの論理回路記号 »

Arduino」カテゴリの記事

割り込み処理」カテゴリの記事

コメント

コメントを書く



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




« 修理:オンボード・スイッチングレギュレータ回路 | トップページ | JIS、IECの論理回路記号 »