【1.A/D変換とは?】
PIC16C7xシリーズには、「A/D変換」という機能が用意されて
います。A/Dとは「Analog to Digital Converter」の略です。
これは、特定のアナログ入力端子に信号を接続して、そのアナログ
信号の電圧を測定し、ディジタルデータとして読み取ることが出来る
機能となっています。
PIC16C7xシリーズにはいくつかの種類がありますが、ここでは
PIC16C711JW(紫外線消去タイプ)を前提にして説明します。
【A/D変換の精度とは?】
アナログ信号の電圧値をディジタル信号に変換するときには、一体
どれぐらいの分解能で表現するのかということが問題になります。
それを表現するのが、A/D変換のビット数で、PICの場合は現在は
8ビットの分解能となっています。つまり、0〜255までの256段階で
電圧値を表現できるということになります。
この分解能のことを精度と表現することもありますが、精度というと
普通は、8ビットの最下位の1ビット以下という表現になります。
つまり 1/256以下だと言うことです。
この精度は近い将来10ビットから12ビットにアップされる計画が
あります。10ビットだと1024段階、12ビットだと4096段階の分解能
を持つことになり、非常に細かい表現が可能となることになります。
【A/D変換に必要な変換時間】
PICでは、A/D変換をするために、まずアナログ信号を一旦内部の
コンデンサに蓄えます。
その後、参照となる一定の電圧を加算して比較しながら計測する
という原理であるため、A/D変換を正確に行うためには、蓄積する
までの時間と計測する時間の両方を確保することが必要になります。
PICの場合、この時間がどれぐらいかというと
蓄積時間 = 最小約12μsec
計測時間 = 最小約 1.6μsec×9.5=15.2μsec
これらを加算して
最小繰り返し周期=最小約28μsec となります。
従って、これ以上の高速でのA/D変換動作は出来ないということに
なります。(1秒間に約35,000回の計測)
さらにプログラム上、この時間を意識しておくことが必要となります。
計測時間については、A/D変換用のクロック指定が限定されており、
このクロックの時間をTadとすると、
最小計測時間=9.5×Tad (μsec) となります。
また、A/D変換用クロック Tadは最小1.6μsecとする必要があります。
しかし、Tadには2Tosc、8Tosc、32Tosc、Trc の4種類の指定方法
しかないので、例えば10MHzのクロックで1.6μsec以上というと、
Tad=32Tosc=32×0.1=3.2μsec となりますので 計測時間は
9.5×3.2=30.4μsec となります。
結果的にクロックが10MHzの時の、最小繰り返し周期は、42.4μsec
となり、1秒間に最大でも約23,500回以上の測定は出来ないことに
なります。
【計測出来る実際の電圧値】
では実際にどの程度の電圧が測定できるのでしょうか?
まず、電圧の測定は、参照電圧(Reference) Vrefが基本になります。
測定値の最大値が、このVrefになります。Vrefは下記の2種類を指定
することが出来ます。
(1) 外部入力指定の場合 → 3.0V 〜 Vdd
(2) 電源電圧指定の場合 → Vdd(電源電圧)
従って、測定できる電圧は、電源電圧を5Vとすれば、最小分解能は
8ビット(つまり1/256)ですから、
最大測定電圧 → 3.0 〜 5.0V
最小測定電圧 → 3/256 〜 5/256V となります。
(約12mV 〜 20mV)
【A/D変換を制御するレジスタと制御の流れ】
PICでA/D変換機能を使うときに関係するレジスタは下記の3種類
あります。
(1) ADRES (Bank0)
A/D変換の結果のデータが格納されるレジスタ
(2) ADCON0 (Bank0)
A/D変換の制御をするレジスタでクロック指定やスタート指令を
制御します。
(3) ADCON1 (Bank1)
A/D変換の入力ポートの指定(チャンネル指定)を行います。
これらのレジスタを使ってプログラムは下記のような流れで行います。
割り込みを使う方法もありますが、変換終了までは、数10μsecしか
かかりませんから、割り込みを使うと却って余分な時間を必要として
しまうので、割り込みは使わないでステータスチェックのプログラム
ループで待つようにします。
《プログラムフロー》
初期化としてADCON1で使うポートを指定する
|
↓
ADCON0でチャンネルとクロック、A/D ONを指定する
(クロックで最小1.6μsecを確保する)
↓
充電のため最小12μsec待つ(サンプルホールド)
(余裕を見て15μsecだけ待つ)
↓
ADCON0でA/D変換スタート
↓
ADCON0のステータスで変換終了を待つ
↓
ADRESからデータを読み込む
【レジスタの詳細内容】
前項のように、3種類のレジスタがありますが、詳細内容と設定内容
は下図の様になっています。
PIC16C7xの種類によって内容は多少異なりますが、下図はPIC16C711
の例です。
A/D変換クロック(Tad)の設定方法は下表とします。
上表のようにクロック周波数により可能な設定は黄色の設定
設定
ADCS1,0
PICのクロック周波数
20MHz
10MHz
4MHZ
1MHz
Fosc/2
00
2.0
Fosc/8
01
2.0
8.0
Fosc/32
10
1.6
3.2
8.0
Frc
11
2〜 6
のみとなります。他の設定にした場合には、精度が保証されません。
なぜならA/D用クロックとしては1.6μsec以上必要な為です。
このポート設定は下表のようになります
Aはアナログ入力 Dはディジタル入出力 Vrefは基準電圧入力
PCFG1,0
RA0
RA1
RA2
RA3
Vref
0 0
A
A
A
A
Vdd
0 1
A
A
A
Vref
RA3
1 0
A
A
D
D
Vdd
1 1
D
D
D
D
Vdd
基準電圧入力の指定が無いときは、電源電圧が基準となる。
【プログラム例】
下記は実際のプログラム例で、RA0、1の2チャンネルで、Vref指定は
無し、の場合の例です。
(1) 初期化でADCON1を設定
・RA0、1の2チャンネル
・Vrefは外部入力は使用せず
;***********************************
; Initialize
; PORT A RA0,1:Analog input
;***********************************
INITA
BSF STATUS,RP0 ;Set Page 1
MOVLW 02H ;Set to RA0,1 are analog in
MOVWF ADCON1 ;Set A/D
MOVLW 017H ;Set PortA to receive mode
MOVWF TRISA
BCF STATUS,RP0 ;Set Page 0
MOVLW 010H ;Set A/D Fosc/32 CH0 A/D off
MOVWF ADCON0 ;set
↓
このあとメインルーチンへ
(2) チャンネル0または1からのデータ入力
・クロックはFosc/32
・データ蓄積待ちタイマーは15μsec
;***********************
; Start A/D CH0
;***********************
STAD0
MOVLW 081H ;A/D on,Fosc/32
MOVWF ADCON0 ;select CH0
CALL TIME15 ;wait settling
BSF ADCON0,GO ;start A/D
WAIT0
BTFSC ADCON0,GO
GOTO WAIT0
MOVF ADRES,W ;get A/D data
↓
この後 データ処理へ
;*************************
; Start A/D CH1
;*************************
STAD1
MOVLW 089H ;A/D on,Fosc/32
MOVWF ADCON0 ;select CH1
CALL TIME15 ;wait settling
BSF ADCON0,GO ;start A/D
WAIT1
BTFSC ADCON0,GO ;wait end of conversion
GOTO WAIT1
MOVF ADRES,W ;get A/D data
↓
この後 データ処理へ
;***********************************
; 15usec deley timer
; for A/D conversion settling time
;***********************************
TIME15 ;15usec
MOVLW 0DH
MOVWF TCNT
T_LP1 DECFSZ TCNT,F ;2+3*12-1=37
GOTO T_LP1
RETURN ;37+1=38*0.4uec