低価格のマイクロコントローラは、タイマー回路を1〜2個内蔵していることが多い。また、ウォッチドッグタイマーを備えているものも少なくない。しかし、用途によっては、タイマー回路がそれだけでは足りないことがある。そうした場合には、なるべくコストをかけずにタイマー機能を実現したいはずだ。
さほど精度が要求されるわけでなければ、ソフトウエアによってタイマー機能を実現することも可能である。しかし、厳密なタイミングが必要な用途では、マイクロコントローラにとっての負荷が大きくなることから、ソフトウエアによるアプローチは適切なものだとは言えない。
本稿では、マイクロコントローラとごく少数の部品を使用することで、タイマー機能を実現するアプローチを紹介する。具体的には、ほとんどのマイクロコントローラにおいて、中程度の精度で、周期の長いタイマーを構成するために使用されているI/O変化割り込み機能(Interrupt on Change)を利用する。
図1の回路において、通常のI/O端子であるIO1からの出力は、RCフィルタに入力される。同フィルタの出力はシュミットトリガーインバータIC1Aに入力され、その出力を変化割り込み機能を備えるI/O端子であるIO2につなぐ。マイクロコントローラが起動すると、IO1の出力がローになり、IC1Aの出力がハイになる。しばらくして初期化が終わると、IO1の出力がハイになる。これに伴って、コンデンサC1が時定数R1×C1(1MΩ×10μF)で充電される。充電電圧がハイレベルの閾(しきい)値電圧を超えると、IC1Aの出力がローに変化する。これにより、IO2から割り込みがかかる。この割り込みにより、コントローラ内部のISR(Interrupt Service Routine:割り込みサービスルーチン)が働き、カウンタがインクリメントされてIO1の出力がローになる。これにより、C1がR1経由で放電を始める。放電の結果、IC1Aの出力がローに変化し、再び割り込みがかかる。このサイクルが繰り返され、カウント数×R1C1のタイミングが生成できる。
リスト1は、マイクロコントローラとして米Atmel社の「ATmega64」を使用する場合のプログラムである。同リストに示すように、IO1としてはポートD(5番端子)を用い、I/O2としてはINT3の代替機能を備える3番端子を使用している。割り込みのトリガーエッジは、サイクルごとに降下→立ち上がり→降下のように変わる。
図2にATmega64とシュミットトリガーインバータ「74HC14」を使用した回路でのタイミング波形を示した。
このタイミング発生回路は、低コストであること、タイミング周期がC1、R1の時定数とカウント数で決まること、抵抗値と容量値を調整することによって分単位から時間単位の周期を得ることも可能なことなどを特徴とする。例えば、R1に10MΩの抵抗、C1に10μFのコンデンサ、16ビットの内部カウンタを使用すれば、最大カウント数は75.85日間分となる。
Copyright © ITmedia, Inc. All Rights Reserved.