検索
特集

マイコン内蔵のADCを利用してDACを構成Design Ideas

PC用表示 関連情報
Share
Tweet
LINE
Hatena

 マイクロコントローラ製品で、D-Aコンバータ(DAC)を内蔵しているものはあまり多くない。必要に応じ、マイクロコントローラによって制御可能な低価格のD-Aコンバータを入手するのは容易なことだが、本稿では別のアプローチを紹介する。それは、マイクロコントローラにおいて未使用の周辺回路機能を利用し、D-Aコンバータを構成するというものである。

 この方法では、マイクロコントローラが内蔵するA-Dコンバータ(ADC)とGPIO(汎用入出力)端子を利用する。図1のように、GPIO端子の電圧をハイレベルに駆動してコンデンサ(C1)を充電したり、ローレベルに駆動してコンデンサを放電したり、ハイインピーダンスにすることでコンデンサの電圧を保持したりするというのが基本原理だ。一見、ラフな手法であるように思えるかもしれないが、マイクロコントローラが内蔵するA-DコンバータによってD-Aコンバータの出力をモニターし、その結果に基づいてPID(比例−積分−微分)制御を行う系を組み合わせれば、十分に実用的なものになる。

図1 D-Aコンバータの構成方法(概念図)
図1 D-Aコンバータの構成方法(概念図) マイクロコントローラのGPIO端子を利用してD-Aコンバータを構成する。GPIO端子の出力パルスのタイミングと間隔はPID制御により決定する。制御ループには、マイクロコントローラが内蔵するA-Dコンバータを組み込んでいる。

 PID制御部では、モニターした値(D-Aコンバータの出力電圧をA-D変換した値)を目標値と比較し、誤差を計算する。誤差がゼロならば、I/O制御部はGPIO端子をハイインピーダンスに設定する。誤差が正の値である場合、I/O制御部はGPIO端子をローレベルにしてコンデンサを放電する。誤差が負の値であるなら、I/O制御部はGPIO端子をハイレベルに設定してコンデンサを充電する。誤差の値(大きさ)は、マイクロコントローラの処理によってタイマー回路から出力されるパルスの時間幅に変換する。つまり、誤差の符号によって放電サイクルにするのか充電サイクルにするのかを決め、そのサイクルの間隔を誤差の大きさに応じて変化させる。充放電サイクルが完了したら、I/O制御部によりGPIO端子をハイインピーダンスに設定し、D-Aコンバータの出力レベルを保持するという仕組みである。このPID制御には、ソフトウエアによるループ処理が利用できる。この制御ループは、別のタイマーからの割り込みによって起動させることも可能である。

 この手法によるD-Aコンバータの分解能は、いくつかの要因によって制限される。中でも、最大の要因となるのはA-Dコンバータの分解能だ。当然のことながら、D-Aコンバータの分解能はA-Dコンバータの分解能を超えることはない。また、PID制御の係数とタイマーの分解能も、D-Aコンバータの分解能に影響を及ぼす。例えば、10ビットのD-Aコンバータを構成するには、タイマーとPID係数にも16ビットが必要となる。タイマーの分解能を下げることも可能だが、そうすると制御の頻度が増大する。結果として、セトリング時間が長くなり、CPUの使用率も高くなるので注意が必要である。

 PID制御の係数を最適化すれば、非常に短いセトリング時間と、セトリング後の良好な安定性が実現できる。温度に対する安定性は、A-Dコンバータ用の基準電圧の安定性に依存する。一方、抵抗R1とコンデンサC1の温度に対する変動や、C1のリーク電流は、D-Aコンバータの安定性に大きく影響しない。R1とC1の値は用途に応じて選定するが、その選定はセトリング時間を基準にして行えばよい。

 D-Aコンバータの出力をバッファするには、オペアンプをボルテージフォロワとして使用するか、エミッタ接地フォロワを使用する。アンプ回路によって出力を増幅する場合には、その出力を分圧してA-Dコンバータに入力するよう構成すればよい。

Copyright © ITmedia, Inc. All Rights Reserved.

ページトップに戻る