【A/D変換モジュール概要】
PIC18Fxxxxシリーズに内蔵のA/Dコンバータは、かなり機能強化されました。
最大13チャンネルまたは10チャンネルの、10ビット分解能を持つA/D変換
モジュールとなっています。
また、従来ソフトウェア処理で待つ必要があったアクイジションタイムの時間を
ハードウェア処理してくれるようになりました。
【A/D変換モジュールの構成】
A/D変換モジュールの内部構成は下図のようになっていて、動作は下記の
順序で実行されます。
(1) あらかじめ動作モードを設定しておくと内部動作が決まる。
Vrefの指定、変換クロック速度の指定など。
(2) 選択されたいずれかのチャネルのスイッチがOnとなりA/Dコンバータに
接続される。 (ADCON0レジスタで指定)
(3) A/D変換が開始されると。A/D変換モジュールの内部で、サンプルホールド
コンデンサの充電が開始されるまでの一定時間、つまりアクイジションタイム
を待ったあと、自動的に実際のA/D変換動作を開始します。
(4) 変換結果は、2バイトのレジスタに書き込まれている。
(ADRESL,ADRESHレジスタ)
【A/D変換制御用レジスタ】
A/D変換モジュールを制御するためのレジスタには下記のように、従来のADCON0と
ADCON1の2種類に加え、ADCON2が追加されました。
これで、チャネル数増への対応と、アクイジションタイムの時間設定ができるように
なりました。
ADCON0レジスタでは、下図のようにチャネルの選択とA/D変換開始制御を
行います。
ADCON1レジスタでは、各ピンをアナログとするかディジタルとするかの設定
を行います。また、1ピン毎に独立で指定できるようになりましたので、
1チャネル毎に増減ができるようになり、分かり易くなりました。
またリファレンスも独立で指定できるようになりましたので使いやすくなりました。
ポートの使い方の設定は下表のようになります。
注(1)
チャネルは、CH0-CH4まではポートAなので、アナログ指定だけで使えるように
なりますが、CH8-CH12まではポートBに新設されたもので、このポートBをアナログ
入力用に使うためには、コンフィギュレーションの設定で、CONFIG3HのPBADEN
ビットを1に設定する必要があります。
このコンフィギュレーションを設定しないと0000と指定しても0111と同じことになって
しまいます。
注(1)
CH5-CH7は40ピンのPICにしかありません。
【A/D変換の使い方】
実際にA/D変換モジュールを使うときの手順は下記のようにします。
(1) アナログピンの設定
ADCON1でアナログ入力にするピンとリファレンスを設定
ADCON0,2でアクイジションタイム、変換クロック、A/D使用を設定
(2) チャネル指定
ADCON0で入力するチャネルを指定
(3) 割込みの許可設定
割込みを使う場合だけ設定します。
(4) A/D変換開始指示
ADCON0のGOビットを1に設定してスタートさせます。
(5) 変換後データ読込み
GOビットが0になるのを待つか、割込みにより終了を確認してから
ADRESHとADRESLのデータを入力します。
《Special Event Triggerの時》
CCPモジュールのSpecial Event TriggerでもA/D変換をスタートさせること
ができます。この場合には、下記の条件が必要です。
・A/D変換モジュールは使用になっていること。(ADON=1)
・指定チャネルが選択済みのこと。
・適当なアクイジションタイムが設定されていること。
【A/D変換の精度や実行時間】
A/D変換モジュールの電気的条件と精度は下記のようになっています。
《電気的条件》
項 目 条 件 備 考 アナログ入力源の
出力インピーダンス2.5kΩ以下 高くなると精度悪化する リファレンス電圧源
の出力インピーダンス250Ω以下 高いと精度悪化する (Vref+) - (Vref-) 3V以上 この条件からはずれると
10ビット精度が悪化するVref+ Vss+3.0V以上 Vref- Vdd-3V以下 アクイジションタイム 最小12.86μsec 25℃ Typ値
《A/Dクロックの設定》
A/D変換モジュールを動かすためには、A/D用クロックの設定が必要ですが、
このA/Dクロックは最小約1.6μsec以上が必要なため、システムクロックとの
関係は、下表のようになり、これが最速のA/D変換時間となります。
★PIC18Fxx20の場合
クロック周波数 ADCS2:0設定 ACQT2:0設定 合計変換時間 1.25MHz 000 2Tosc 下記のいずれか
111 20Tad=32.0μsec
110 16Tad=25.6μsec
101 12Tad=19.2μsec
100 8Tad=12.8μsec
これ以下は使えない。
(8+11)Tad〜
(20+11)Tad
つまり
30.4μsec〜
49.6μsec2.50MHz 100 4Tosc 5.00MHz 001 8Tosc 10.0MHz 101 16Tosc 20.0MHz 010 32Tosc 40.0MHz 110 64Tosc 1.00MHz(RC発振) x11 4μsec 4Tad以上であれば可能 60μsec〜
【A/D変換用C言語関数】
CCS社のPCHコンパイラで用意されている、A/D変換用の組込み関数は下表
となっています。
組込み関数と書式 機能内容 と パラメータ setup_adc(mode) A/D変換のon/offとクロックの指定
modeには下記がある。
ADC_OFF 0
ADC_CLOCK_DIV_2、 ADC_CLOCK_DIV_4
ADC_CLOCK_DIV_8、 ADC_CLOCK_DIV_16
ADC_CLOCK_DIV_32、 ADC_CLOCK_DIV_64
ADC_CLOCK_INTERNAL
《例》
setup_adc(ADC_CLOCK_INTERNAL);
setup_adc(ADC_CLOCK_DIV_32);setup_adc_ports(value) A/D変換用の各ピン毎にアナログかディジタルかの使い方の
設定をする。 valueには下記がある。
(1) ポートの設定
NO_ANALOGS、 ALL_ANALOG
ANALOG_AN0_TO_AN13、 ANALOG_AN0_TO_AN12
ANALOG_AN0_TO_AN11、 ANALOG_AN0_TO_AN10
ANALOG_AN0_TO_AN9、 ANALOG_AN0_TO_AN8
ANALOG_AN0_TO_AN7、 ANALOG_AN0_TO_AN6
ANALOG_AN0_TO_AN5、 ANALOG_AN0_TO_AN4
ANALOG_AN0_TO_AN3、 ANALOG_AN0_TO_AN2
ANALOG_AN0_TO_AN1、 ANALOG_AN0
(2) Vref設定用
VSS_VDD、 VREF_VREF
VREF_VDD、 VSS_VREF
《例》
setup_adc_ports(ANALOG_AN0_TO_AN4 | VSS_VDD);
setup_adc_ports(ALL_ANALOG | VREF_VREF);set_adc_channel(chan) 読み込むアナログのチャンネル番号(ピン指定)を指定する。
chanは 0-12 まであるがPICのデバイスにより異なるので注意
《例》
set_adc_channel(1);i = read_adc( ) 直前で指定されたチャンネルからアナログデータを読み込む。
8ビットか10ビットは、#device ADC=8または10で指定した
内容による。
《例》
value = read_adc();
【A/D変換のプログラム例】
実際の使用例です。1秒周期でAN0に接続された温度センサーのデータを入力して
0−64℃のスケール変換をしたあと、液晶表示器に表示します。
まず初期設定の部分で、ここでA/D変換モジュールの動作を指定しています。
次がメインの部分でA/D変換をスタートさせ、データを取得してから
右に4ビットシフトして1/16にすることでスケール変換しています。
結果を2桁の10進数に変換して液晶表示器に表示しています。
それぞれのサブルーチンは省略しています。
★ 上記のソースファイルです。
メインと液晶表示器制御ライブラリが一緒になっています。