いままでMCUのコアばかり探ってきましたが、そろそろ周辺回路にも目を向けていきたいと思います(勿論、まだまだレガシー8051とArmを探すつもりです)。周辺回路もいろいろある中、まず間違いなくほとんどのMCUに必ず搭載されているものが「タイマー」回路です。用途によっては「カウンタ」という名で呼ばれることもありますが、基本的な回路構成はかわりません。これで結構いろいろな関連用語が使われるので、本日はその辺をおさらいしていきたいと思います。
※「鳥なき里のマイコン屋」投稿順Indexはこちら
「クロック」は世間的には置時計ということになっていますが、電子デバイス的には、回路を動かすための一定の周期で繰り返し発生するパルス信号を指します。当然、この「クロック」を何らかの手段で数えることができれば時間が測れる道理です。パルス信号を数える回路はカウンタと呼ばれますから、カウンタにクロック信号を入力すれば「タイマ」と言えるわけです。このタイマ、MCUにおいては非常に重宝され、なくてはならない構成要素です。通常は設定値をいろいろ変更できるプログラマブルなタイマで制御のために使われます。本当に年月日時分秒を測るための「タイマ」とは違います。ただ、MCUによっては年月日時分秒を測るための回路も持っていたりするので、以下のように呼び分けられるのが普通です。
RTC(Real Time Clock)またはカレンダータイマ | 年月日時分秒を保持するための「時計」 |
タイマ | 制御に使われる |
RTCは結構特殊なタイマで、通常、CPUが死んでいるときでも電池でバックアップされて動き続けます。これに入力されているクロック信号は時計用の32.768kHzの水晶振動子からのものです。32.768kHzは2の15乗ぴったり。これを一種のカウンタ(プリスケーラ=分周器)で数えてあげれば「1秒」というクロックが作れるわけです。この1秒を数えるのがRTC本体の仕事ですが、ご存知のように人間が使っている時間単位はメソポタミアに起源をもつらしい60進法などを使った複雑な型式です。このため、普通のRTCはBCDカウンタというちょっと特殊なカウンタ回路になっています。BCDカウンタは、2進数(バイナリ)4桁で、10進数1桁を表すように縛りをかけたカウンタです。これに対して一番普通の2進数を数えるカウンタをバイナリカウンタと呼びます。RTCは、実時間を保持するだけでなく、時間が来たら寝ているシステムを起こす目覚まし時計のような目的に使われることがあります。
さて、普通のタイマ、カウンタの用途ですが、まず一番の用途がインターバルタイマとしての利用です。ある時間間隔、例えば1ミリ秒とか、100マイクロ秒とかでなんらかの制御をしたい場合、インターバルタイマに所望のクロック数をセットしておけば、そのクロック毎に割り込みが発生し、MCUは定められた割り込み処理を繰り返し行うようになります。この際、ある値をカウンタにプリロードしておいて、そこからダウンカウントして0になったら割り込み(当然、逆にアップカウントしてカウンタから溢れて0に戻ったら割り込みという方法もありえます)となるような論理が組まれます。その際使うクロック信号は、制御したい周期に合わせるべきです。あまり遅いクロック信号では誤差が大きくなりすぎますし、早すぎると長大なカウンタが必要になります。周波数の異なる複数のクロックソースとプリスケーラにより適切なクロックを設定できるようになっているのが一般的です。インターバルタイマは、繰り返し割り込みを発生させることが多いですが、なにかイベント発生に合わせて1回だけ時間を制御したい場合にはワンショットタイマといわれるような使いかたもできるのが普通です。また、非同期のシリアル通信(UART)などでは、MCU内部のクロックからするとけた違いに遅いクロックが必要となる場合もあるので、繰り返し動作のインターバルタイマから遅いクロック信号を得るケースもあります。この場合、ボーレートジェネレータなどと呼ばれます。
また、フリーランカウンタなどと呼ばれることが多いですが、通常常にカウントアップしつづけ、最大値に達すると溢れて0に戻る(ラップアラウンド)ようなカウンタも利用されます。このようなカウンタが重宝されるのは、主に入出力信号を制御したい場合です。インプットキャプチャと呼ばれる仕組みでは、外部からなんらかの信号が到来した時点のフリーランカウンタの値をキャプチャ用のレジスタに取り込みます。多くの場合では2つのイベントに対応するフリーランカウンタの値2つの差(当然、ラップアラウンドは考慮)を計算すれば、時間差が分かるわけです。この情報を制御に用います。ある波形の立ち上がりと立下りなど2点を測定すればパルス幅の測定も可能です。
出力では、フリーランカウンタの値をコンペアレジスタと比較することが行われます。事前に設定した値と一致したら、出力端子に信号がでるようになっています。これはアウトプットコンペアとか、ハイスピードアウトプット、とか呼ばれることがあります。さきほどのインプットキャプチャの情報から計算した出力タイミングをセットすれば、正確なタイミングで出力を制御できるわけです。CPUのソフトではできない精度が実現できますし、ソフトでやったのでは限りのあるCPUタイムを占有してしまうので、制御系ではこのようなハードが好まれます。
また、フリーランカウンタの値とコンペアを使うことで、あるパルス幅の波形を出力したりすることもできます。この応用として、出力波形にちょっと工夫を加えればPWM(Pulse width modulation)出力も作れます。PWM波形をLPF(Low Pass Filter)に通せば、アナログ出力が得られます。簡易型ともいえますが、DAコンバータとしても使えるわけです。
また、本来的なカウンタの用途として、外部で発生する信号をカウントするという使い方もできます。外部イベントカウンタなどと呼ばれます。
最後に、ウオッチドッグタイマ(番犬タイマー)という使い方もあります。MCUは、ノイズなどで誤動作しては困るので、その対策の使い方です。ウオッチドッグタイマが予め仕掛けてある時間を超えると、リセットなどの強い初期化信号が発生するような回路になっています。このタイマを走らせておくのですが、ソフトウエアの切りの良いところで、タイマに信号を送って初期値に戻しておくのです。正しくソフトウエアが動いていたら、仕掛けてある時間の前に必ず初期値に戻るようにプログラムを作っておきます。万が一、誤動作してハングというような事態になると、ウオッチドッグが吠えて、システムは初期化されます。万が一の保険のようなものですが、ないより遥かにマシと。