前回のタイマーの記事を下に貼り付けて置きます。

ぶっちゃけ下の記事は私の自己満足なので見たくてもいいような気がしますが...

 

 

・ATMEGAタイマーの基礎知識

ATMEGA328Pにはタイマーが3つあります。
 
Timer0・Timer1・Timer2があります。
 
ちなみにTimer0はArduinoの内部で使用されているため、内部の設定を変更してしまうとdelayやmills関数の時間がずれてしまいます。他にもいろいろな点で不具合が発生してしまうため、Timer0の設定は基本変更しない方が良いです。
 
Timer1は16bitタイマー 、Timer2は8bitタイマーとなります。
 
このbitというのはどれだけカウント出来るかを表しているようです。
 
 

・タイマーの基本

次にマイコンのタイマーの基本です。
ちなみに今回はATMEGAシリーズを基準にしています。
一部のマイコンはこれに当てはまらない場合があります。(Arduino UNO/NANOは大丈夫です)
 
まずタイマーのカウンタについてです。
タイマーは基準クロックという物から常にカウントされています。
ちなみにその基準クロックとはArduinoについている水晶発振子という部品でクロックを作り出しています。 そのクロックが1つ来たらカウンタが1つカウントされる感じです。
 
 
この上のような感じで階段のようにカウントされていきます。
 
実際には目には見えないとんでもない早さで進んでいるため次のように見えます。
 
この上の赤い線はMAX値と言います。
下の緑色の線は0を表しています。
 
 
MAX値は先ほどにあった○bitで決まります。
例えばTimer1であればMAX値は16bitです。
という事は 16bit = 2^16 = 65536カウントでMAXと言うことになります。
 
 
タイマーにはいくつかモードがあります。
ATMEGAシリーズには
 
  • 標準モード
  • CTCモード
  • 高速PWMモード
  • 位相基準PWMモード
といったモードがあります。これらについて説明していきます。
 
 

・標準モード

上の図は先ほどの図と同じです。
 
標準モードはオーバーフローした時に割り込みが入る方法です。
 
ここで疑問が発生します。オーバーフローとは何でしょうか
 
オーバーフローとは値が超える(溢れる)事です。
それでは分かりにくいですのでもう少し分かりやすく説明します。
 
例えば16bitで考えます。
 
16bitの最大は65535です。
それはなぜか 2進数で0b1111111111111111のように全て1にした値が65535なのです。
 
では上の状態に1を足したらどうなると思いますか?
これがオーバーフローです。
 
ちなみにオーバーフローすると0に戻る事が多いです。
ただし補数という概念が存在するため0にならないことも多いです。
また一部の言語ではエラーになることもあります。
(C#.NETやVB.NET VBA などはオーバーフローするとエラーになります)
 
オーバーフローは別名桁あふれとも言う様です。
 
ここからオーバーフローした時に割り込まれると言うことは計算できると言うことですね。
 
早速計算してみましょう。
計算式は カウンタのbit数 ÷ クロック周波数で求める事が出来ます。
 
Arduino UNO /NANOは16MHzで動作しているため、
 
65536 ÷ 16M = 4.096msとなりました。
 
周波数にすると
1 ÷ 4.096m = 244.14Hzとなりました。 
これらは次の記事で本当に正しいか調べてみたいと思います。
 
 

・CTCモード

個人的には一番使うであろうモードです。
一番簡単に使うことが出来ると言っても過言では無いモードですね
 
上の図は先ほどから出している図にそっくりですが一本、線が多くなっているのが分かりますか?
これがCTCモードです。
 
先ほどの標準モードではオーバーフローを検知する方法でしたが、CTCモードではあらかじめ上限のような物を決めておき、上限にいくと割り込みが発生します。
 
そして再び0に戻るような動作をするモードです。
 
ちなみに上限の事をTOP値と言います。
 
 
試しに計算してみましょう。
 
では3000カウントをTOP値にしましょう。
3000カウントですので 3000 - 1 = 2999となります。
 
計算では TOP値 ÷ クロック周波数 で求める事が出来ます。
 
TOP値は2999 ArduinoUNO/NANOのクロック周波数は16MHz
3000 ÷ 16M = 187.5μs
 
次に周波数を求めます
1 ÷ 187.5u = 5.33kHzとなりました。
 
これらも次の記事で確かめてみたいと思います。
 

・標準PWMモード

標準PWMモードはPWM波を出力するためのモードです。
 
下にある矩形波がPWM波形です。
このように青い線でONからOFFに変更しているので次のような波形が出てくるようになります。
 
 

・位相基準PWMモード

TOP値まで上がりきったらそこから下がっていくようなPWMモードです。
 
今回は複雑すぎるため省略します。
 
メリットとしては周期が2倍になる、一部の難しい波形が簡単に出力できるメリットがあるそうです。
 
 
 
次は実際にArduinoにプログラミングして作ってみたいと思います。
 
下のリンクは標準モードでの割り込みを行っています。是非ご覧ください。