10/12ビットA/Dコンバータの使い方 


【A/Dコンバータの内部構成】

F1ファミリでは、すべてのデバイスにA/Dコンバータモジュールが内蔵されています。
A/Dとは「Analog to Digital Converter」の略です。
これは、特定のアナログ入力端子に信号を接続して、そのアナログ信号の電圧を
デジタル数値に変換し、デジタルデータとして読み取ることができる機能です。

F1ファミリのA/Dコンバータは、逐次比較型の変換器で高速な変換ができます。
変化する信号を安定して変換できるようにするサンプルホールド回路も内蔵しています。
下図がPIC16F193xの場合のA/Dコンバータモジュールの内部構成です。
この内部構成はデバイスごとにチャネル数やリファレンス選択肢が異なっている
ところがありますので、デバイスのデータシートで確認してください。


A/DコンバータはADONビットを1にセットすることで動作有効となります。
PICマイコンはアナログ入力端子を複数持っていますが、このうちのどれか1つだけが
入力マルチプレクサで選択され、サンプルホールドへ入力されます。
サンプルホールドキャパシタへの充電を待った後A/D変換を開始すると、
逐次変換方式でA/D変換を行い、変換結果がADRESHレジスタとADRESLレジスタの
2バイトに出力されます。

A/Dコンバータの入力チャネルは、外部ピン以外に、内蔵温度センサ、内蔵D/Aコンバータ、
内蔵定電圧リファレンス(FVR)も選択できるようになっています。
さらに、変換する電圧範囲を決めるリファレンス(Vref+とVref-)として、電源とGND以外に
外部から入力する電圧とすることもできますし、内蔵定電圧リファンレスを指定することもできます。
実際に測定可能な電圧範囲と変換精度はリファレンスVref+とVref−で決定されます。
測定値の最大値がVref+で最小値がVref−となり、この間が1024等分されます。

10ビットA/DコンバータがA/D変換をする時間は、下図で表されます。



どれかひとつのチャンネルが選択されると、そのアナログ信号で内部の
サンプルホールドキャパシタを充電します。
この充電のための時間(アクイジションタイム)が必要となります。
A/D変換を正確に行うには、アクイジションタイムとして標準で5μsec以上を待ち、
それから変換スタート指示をする必要があります。
この時間を待たずにA/D変換のスタート指示を出すと、充電の途中の電圧で
変換してしまうため、実際の値より小さめの値となってしまいます。

この後の逐次変換に要する時間は、10ビットの場合A/D変換用クロック(Tad)の
11倍となります。12ビットの場合は、15倍となります。

この変換用クロックは逐次変換用のクロックで、システムクロックを分周して生成します。
F1ファミリではTadは1μsecから9μsecの間と決められています。
結果的に、F1ファミリの場合のA/D変換速度は、最大速度で動作させても、10ビットの場合
アクイジションタイム(標準5μsec)+変換時間(1μsec×11=11μsec)となるので、
最小繰り返し周期は、16μsecとなります。
これ以上の高速でのA/D変換動作はできないということになります。
つまり、1秒間に62.5kSPS以上の速さでは繰り返し動作はできません。

変換可能なアナログ電圧の範囲は、リファレンスの選択指令に従って、
下側は0VかVref―ボルトから、上側はVref+か電源電圧までとなります。
アナログ信号の電圧値をデジタル信号に変換するときには、どれぐらいの分解能で
変換するのかということが問題になります。
それを表現するのが、A/Dコンバータのビット数で、このA/Dコンバータモジュールは
10ビットまたは12ビットの分解能となっています。
つまり、0〜1023か0〜4096までの1024段階または4096段階で電圧値を表現できる
ということになります。

【A/Dコンバータの制御レジスタ】

A/Dコンバータを制御するためのレジスタは次のようにたくさんあります。
以下順に説明します。
 ・ADCON0 :AD有効化、チャネル選択、変換開始
 ・ADCON1 :結果形式指定、クロック選択、リファレンス選択
 ・ADRESH :変化結果上位バイト
 ・ADRESL :変換結果下位バイト
 ・ANSELx :ピンのアナログ、デジタル切り替え(xはA、B、C・・・)
 ・TRISx  :ピンの入出力モード設定(xはA、B、C・・・)
 ・PIE1   :割り込み許可
 ・PIR1   :割り込みフラグ

これらのレジスタの内容詳細は下図のようになっています。



(1) ADCON0レジスタ
 A/Dコンバータの有効化とチャネル選択、変換開始の設定を行います。
 ADONビットを1にするとA/Dコンバータにクロックが供給され動作状態となります。
 このときA/Dコンバータが電力を消費しますが、300μA近くの電流を必要とします
 ので、低消費電流で使いたい場合には、必要なときのみADONをセットする必要
 があります。 チャネル選択後アクイジション時間を待ってからGOビットを1に
 セットして変換を開始します。

(2) ADCON1レジスタ
 ADFMビットで変換結果の格納形式を指定します。ADFMビットが1の場合は、
 図のようにADRESHレジスタとADRESLレジスタに右詰めで10ビットのデータが
 格納されます。10ビットのデータとして扱う場合は通常この右詰めで使います。
 ADFMビットを0にセットした場合には左詰めとなり、10ビットのデータの上位8ビット
 がADRESHレジスタで取り出せます。このように8ビットだけでよい場合や、
 CCPのデューティ設定などの場合のように上位8ビットと下位2ビットを分けて
 扱う場合に使います。
 ADCS<2:0>ビットでクロックの選択をしますが、基本はシステムクロックの分周に
 なっていますので、Tadの規格範囲(1〜9μsec)に入る値を選択します。
 これができない場合は、専用の内蔵クロックFrc(標準1.0〜6.0μsec)を使います。
 実際のシステムクロック周波数ごとに選択可能な値は下表の白地の範囲で
 黒地の範囲は規格外となります。



 ADNREFビットとADPREF<1:0>ビットでリファレンスのVref−とVref+を選択します。
 リファレンスは外部入力か電源電圧か内蔵電圧リファレンスから選択することが
 できます。各々の場合の電圧は下表のようになります。
 リファレンス設定 入力最大電圧  備 考 
 電源電圧(Vdd)  Vdd  精度はVddの精度に依存
 外部リファレンス電圧差
(Vref+ − Vref―)
 1.8V〜Vdd  精度は外部リファレンスに依存
 内蔵電圧リファレンス  (1.024V)
2.048V
4.096V
 初期電圧誤差は±6%

 ここで注意しなければならないことは、10/12ビット精度は、Vref+とVref−の電圧差が
 1.8V以上のときに保証されていて、それ以下の場合には保証外となっていることです。
 したがってVref+に内蔵電圧リファレンスで1.024Vを指定した場合は精度が保証されません。

 A/Dコンバータの入力条件には、もうひとつ重要な条件があります。それは入力源となる
 アナログ回路の出力インピーダンスが10kΩ以下と規定されていることです。
 これが大きくなるとアクイジションタイムの時間がより長くなることと、あまり大きいと
 測定電圧に誤差が出るようになりますので注意が必要です。
 オペアンプなどを接続した場合は全く問題ありませんが、電圧を測定するような場合に
 抵抗で分圧して入力するとき高抵抗で分圧すると測定誤差が出ますので注意が必要です。

(3) ANSELxレジスタとTRISxレジスタ
 アナログピンとして使うピンは、ANSELxレジスタで0にセットしてアナログピン扱いとし、
 TRISxレジスタで1にセットして入力モードとする必要があります。

(4) 割り込み
 A/Dコンバータモジュールは、A/Dコンバータ終了による割り込みを生成します。
 この割り込みの制御は、PIR1とPIE1レジスタで行います。
 レジスタの内容詳細は下図のようになっています。


 A/Dコンバータモジュールの割り込みが入るようにするための手順は、
 まずPIE1レジスタのADIEビットを1にしてA/Dコンバータ割り込みを許可し、
 その次に、 INTCONレジスタのPEIEとGIEの割り込み許可ビットを1にして
 全体の割り込みを許可します。
 これで、A/Dコンバータが終了した時点でADIFビットが1にセットされ割り込みが
 発生します。割り込み処理では他と同様にADIFビットをクリアする必要があります。
 しかし、A/Dコンバータを使う場合、多くは割り込みを使わないでプログラムで
 変換終了をチェックして待つようにしています。
 これは変換終了までは数10μsecしかかかりませんし、割り込みを使うとかえって
 余分な時間が必要になってしまうため、ステータスチェックで待つ方の効率が
 良いためです。

【FVRの構成と制御レジスタ】

F1ファミリに内蔵されている定電圧リファレンスモジュールの構成は
下図(a)のようになっています。


元となる安定な定電圧を生成するブロックがあり、この電圧をアンプで1倍、2倍、4倍
にして出力します。
このアンプが2系統あり、A/Dコンバータ用とコンパレータその他用に独立に用意されて
いますので、異なる電圧として供給することもできます。

定電圧リファレンスモジュールの設定制御用レジスタの詳細は、下図(b)となっています。
出力電圧の設定と状態監視を行うことができます。
定電圧ブロックは、FVRENビットで有効にすることもできますし、この定電圧を必要とする
モジュールが有効化されると自動的に有効になり定電圧を供給します。

定電圧リファレンスモジュールは、有効化されてから出力が安定になるまで、わずかですが
時間がかかります。この間の状態を示すため、FVRRDYビットが制御レジスタの中に
用意されています。

使い方は次の手順で行います。

@電圧の選択
  CDAFVRかADFVRで電圧を選択する。電源電圧で選択範囲が制限されるので
  注意が必要です。

AFVRの有効化
  FVRENビットをセットしてFVRを有効化します。

【A/Dコンバータの使い方】

A/Dコンバータを使うためには、まずプログラムの最初の初期化部分で
ANSELxレジスタとTRISxレジスタで使用するアナログ入力ピンを指定して
おく必要があります。
同時にADCON1レジスタでクロックとリファレンスを指定しておきます。
このあとADCON0レジスタでADONを指定し動作を開始します。
あとは実際の変換実行部分で、下図のフローでプログラミングします。
A/Dコンバータは1組しかありませんので、一度に1チャンネルしか入力変換
することができません。
したがって、A/D変換をする都度、どのチャンネルに対して実行するかを
指定する必要があります。




実際のプログラム例が下記となります。