PIC16F1705内蔵A/Dコンバータ(ADC)モジュール  日本語マニュアルP141 16-0

詳細なADCモジュール使用方法はマニュアルを読んで頂くとして、ここでは基本的な使用パターンを記述させて頂く事とします。

(1)基本事項
 1)ADCモジュールへの電圧入力
   PICに内蔵されているADCモジュールは1つですが、モジュールに電圧を入力方法は幾つかあります。
  ①アナログ入力ピン
   外部からのアナログ電圧入力の場合、AN0~AN7の8ピンを指定できます。
    AN0:RA0
    AN1:RA1
    AN2:RA2
    AN3:RA4
    AN4:RC0
    AN5:RC1
    AN6:RC2
    AN7:RC3
   これらの入力ピンを1つ、あるいは複数入力等し、通常はこの方法でADCを使います
  ②他の内蔵モジュールからの出力
   温度インジケータやDAC等、他のモジュールからの入力もできますが、今回は扱いません

 2)ADC参照電圧
   この電圧を基準にADCは電圧を数値に変換します。
   基準電圧が5V(VDD)なら、入力電圧は0~5Vで、それを1024分割して出力します。(分解能約4.9mV)
   基準電圧が4.096Vならば、入力電圧は0~4.096Vで、それを1024分割して出力します。(分解能4mV)
   基準電圧が2.048Vならば、入力電圧は0~2.048Vで、それを1024分割して出力します。(分解能2mV)
   よって、用途に合わせて選択します。
   
 3)A/D変換クロック
   ADCモジュールが動作するクロックで、PICシステムクロックに合わせて、選択します
  ①Fosc=32MHZの時は、Fosc/32
  ②Fosc=16MHZの時は、Fosc/16
  ③Fosc=8MHZの時は、Fosc/8
  ④Fosc=4MHZの時は、Fosc/4
  ⑤Fosc=1MHZの時は、Fosc/2
   上記以外の周波数の時は、高速な方(上方)の近似値にします。

 3)変換データ結果格納レジスタ 日本語マニュアル P144 図16-3
   16bitのレジスタに格納されますが、その内の10bitが使用されます。
   格納方法は16bitの内の、右側(上位bit側)10bitか、左側(下位bit側)10bitを指定できます。
   上位あるいは下位の余りの6bitには0が格納されます。
   レジスタ名は、上位8bitがADRESHレジスタ、下位8bitがADRESLレジスタ
   
 4)アクイジョン タイム
   ADCモジュールを起動・チャンネル接続後、ADC内コンデンサへの充電安定化時間
   5us以上待つと書いてありますが、信号源インピーダンスや温度によって変わるみたいです。
   それ程高速変換を要求している訳では無いので、ここでは20us待っています。

 5)変換時間待ち
   変換開始命令(GO/DONE=1)から変換終了までの待ち時間
   フラグを見張るか割込みを使うかとなります。
   ここでは変換完了フラグ(GO/DONEビットが0になるまで)を見張る方法をとります。

 6)ADC制御レジスタ

  ①ADCON0 (BANK1)

    bit7     未実装、読み出し=1
    bit6-2  CHS チャンネルセレクトビット
            00000  AN0
            00001  AN1
            00010  AN2
            00011  AN3
            00100  AN4
            00101  AN5
            00110  AN6
            00111  AN7
            01000  予約済み、チャンネル接続無
              ・      ・
            11100  予約済み、チャンネル接続無
            11101  温度インジケータ
            11110  DAC1出力
            11111  FVRバッファ1出力
    bit1     GO/DONE A/D変換ステータスビット
             このビットをセット(1に)すると、A/D変換サイクルが実行を開始する
             ADONと同時にセットしてはいけません
             完了すると、ハードウエアがこのビットをクリアする
             1= A/D変換サイクル実行中
             0= A/D変換サイクル完了
    bit0     ADON ADCイネーブルビット
             1= ADCを有効にする
             0= ADCを無効にする

  ②ADCON1 (BANK1)

    bit7     ADFM A/D変換結果フォーマット選択ビット
             1=右詰、16bitのADRESxレジスタの下位10bitに格納
             0=左詰、16bitのADRESxレジスタの上位10bitに格納
    bit6-4   ADCS A/D変換クロック選択ビット
             000= Fosc/2
             001= Fosc/8
             010= Fosc/32
             011= FRC
             100= Fosc/4
             101= Fosc/16
             110= Fosc/64
             111= FRC
    bit3-2   未実装
    bit1-0   ADPREF A/D正参照電圧のコンフィギュレーションビット
              00= VREF+をVDDに接続
              01= 予約済み
              10= VREF+を外部VREF+に接続
              11= VREF+をFVRモジュールに接続

  ③ADCON2 (BANK1)
    オート・トリガーの設定で、ここでは使用しません。
    パワーオン・デフォルトでADCCON2=0なので、初期設定も不要です。
    この機能を使うと、ハードウエアがGO/DONEビットをセット(1に)します。
    すべてのトリガ源の立ち上がりエッジでセットされます
    詳細は英文マニュアル各モジュールを参照してください
    bit7-4  TRIGSEL 自動変換トリガ選択ビット
             0000  選択しない
             0001  CCP1
             0010  CCP2
             0011  Timer0
             0100  Timer1
             0101  Timer2
             0110  コンパレータC1
             0111  コンパレータC2
             1000  CLC1
             1001  CLC2
             1010  CLC3
             1011  予約
             1100  Timer4
             1101  Timer6
             1110  予約
             1111  予約

    bit3-0   未実装(Read as 0)


 7)FVRモジュール(固定参照電圧モジュール)
   FVRはADCやDAC、他モジュールに、割と正確な正の参照電圧として供給出来ます
   出力はBUFFER1とBUFFER2があり、ADCモジュールにはBUFFER1からの出力となります。
   BUFFER2出力は、DACや他のモジュールへ供給されます。
   また、直接制御はできませんが、オシレータモジュール、他への電圧供給も行っている様です

  ①FVRCON FVR制御レジスタ (BANK1)
    bit7     FVREN FVRイネーブルビット
             0= FVRを無効にする
             1= FVRを有効にする
    bit6     FVRRDY FVRレディ フラグビット(実際は読みだしても常に1のまま)
             0= FVRは安定していないか、無効
             1= FVRは使用可能
    bit5     TSEN 温度インジケータ イネーブルビット
             0= 温度インジケータを無効にする
             1= 温度インジケータを有効にする
    bit4    TSRNG 温度インジケータ レンジ選択ビット
             0= VOUT=VDD-2VT(Lowレンジ)
             1= VOUT=VDD-4VT(Highレンジ)
    bit3-2  CDAFVR FVR BUFFER2制御ビット(コンパレータ、DAC1への出力用)
            00= FVR BUFFER2 OFF
            01= FVR BUFFER2 出力 1.024V
            10= FVR BUFFER2 出力 2.048V
            11= FVR BUFFER2 出力 4.096V(VDD=5V)

    bit1-0  ADFVR FVR BUFFER1制御ビット(ADCへ出力用)
            00= FVR BUFFER1 OFF
            01= FVR BUFFER1 出力 1.024V(ADCではサポートされていないが使える場合もある)
            10= FVR BUFFER1 出力 2.048V
            11= FVR BUFFER1 出力 4.096V(VDD=5V)

 8)ADCでのFVRの用途例

  ①FVR OFF(VREF=VDD)
    ボリウム等の位置検出
  ②FVR ON (VREF=4.096V)
    入力電圧の測定等、電圧計、電流計
  ③FVR ON (VREF=2.048V)
    入力電圧の測定、RF電圧計(電力計)、Sメータ、AGCライン制御等


(2)今回のADCサブルーチン プログラムの実際の流れ

 1)初期設定
   ①RC2を入力(TRIS bit2=1)でアナログ(ANSELC bit2=1)
   ②ADCON1の設定
     ADFM=0 生成データは右詰で格納
     ADCS=010 Fosc=32MHZ、ADCクロック周期1us
     ADPREF=00 VREF=VDD(5V)
   ③FVRCONの設定
     必要に応じて設定

 2)GET_ADC 処理サブルーチン

   ①ADCON0=設定
     CHS=00110(AN6、RC2)
     ADON=1 (ADCイネーブル、内部コンデンサに充電開始)

   ②ウエイト 20us (アクイジョンタイム、もっと短くてもOK)

   ③GO/DONE=1 (変換開始)

   ④GO/DONE=0となるまで、ビットをチェックしながら待つ

   ⑤ADRESH、ADRESLを変数に保存

   ⑥ADON=0 ADC OFF










NO-08 ボリウムモジュールの製作

回路図はここにあります
とは言っても、ただのボリウムです・・・
LEDはここでは必要ないので、ボリウムだけでもOKです
これをCPUモジュールの電源ピンとRC2ピンに接続します。
前回のフルカラーLEDも使用します
アッセンブラ編

(1)プログラミングの準備
 1)プロジェクト オープン
  前回作成したプロジェクト「PIC_START_PRG01」を開きます
  すると、「PIC_START_PRG01.asm」もついでに開くと思いまが、開かないならオープンします。
 2)ソースファイルの準備
  オープンした、このアッセンブラ・ソースファイルを複製します。
  上のツールバー「File」の「Save As」で行います。
  ファイルネームは、とりあえず「PIC_START_PRG02_ADC.asm」とでもしておきます。
 3)新ソースファイルの登録
  「PIC_START_PRG01.asm」をプロジェクトから外して、「PIC_START_PRG02_ADC.asm」を登録します

(2)旧プログラムを再編集
 1)TRISレジスタ、ANSELレジスタの初期設定変更
 2)ADCON1の初期設定を記述追加
   入力はAN6/RC2、出力値は左寄せで格納

 3)メインプログラムの変更
   前回はループで数値を変更しながら発色変化していました
   これをボリウムぐりぐりで発色変化するように変更します
   ①ADC取得
   ②発色値取得
   ③ウエイト
   以上をひたすら繰り返します

 4)「GET_ADC6」サブルーチンの新規記述
   名前の「ADC6」の6はAN6を使用したルーチンと言う意味です。
   引数にチャンネル指定もできるようにするのも使い勝手が上がり良いですが、今回はシンプルに固定です。
   アクイジョンは20us、変換待ちはポーリングで割込みは使いません
   取得した変換データは、上位8bitをADC_DATAと言う専用変数に収納


画像01 イニシャライズ

RC2ポートをアナログに設定
ADCON1レジスタを設定


画像02 メインループ部分の変更

シンプルになりました

画像03 A/Dコンバータ サブルーチン

分かり易く、シンプルなサブルーチンと思います。
その反面汎用性が無く、推奨される記述では無いです・・・

ADC出力値10bitデータの内、下位2bitは切り捨てています。
そのデータは専用変数に収納しています。
2.XC8コンパイラ編

(1)プログラミングの準備
 1)プロジェクト オープン
  前回作成したプロジェクト「PIC_START_CPRG01」を開きます
  すると、「PIC_START_CPRG01.c」もついでに開くと思いまが、開かないならオープンします。
 2)ソースファイルの準備
  オープンした、このアッセンブラ・ソースファイルを複製します。
  上のツールバー「File」の「Save As」で行います。
  ファイルネームは、とりあえず「PIC_START_CPRG02_ADC.c」とでもしておきます。
 3)新ソースファイルの登録
  「PIC_START_CPRG01.c」をプロジェクトから外して、「PIC_START_CPRG02_ADC.c」を登録します

(2)旧プログラムを再編集
 1)TRISレジスタ、ANSELレジスタの初期設定変更
 2)ADCON1の初期設定を記述追加
   基準電圧はVDD、出力値は右詰めで格納で、アッセンブラ版と違います

 3)メインプログラムの変更
   前回はループで数値を変更しながら発色変化していました
   これをボリウムぐりぐりで発色変化するように変更します
   ①ADC取得
   ②発色値取得
   ③ウエイト
   以上をひたすら繰り返します

 4)「GET_ADC6」サブルーチンの新規記述
   名前の「ADC6」の6はAN6を使用したルーチンと言う意味です。
   引数にチャンネル指定もできるようにするのも使い勝手が上がり良いですが、今回はシンプルに固定です。
   アクイジョンは20us、変換待ちはポーリングで割込みは使いません
   取得した変換データは、16bit符号無整数(下位10bit有効)で返します


画像04 初期設定の変更

関数プロトタイピングの追加
ANSELCレジスタの変更
ADCON1の設定

画像05 メインループの変更

これもシンプルになりました
ADC関数が16bit(の内の下位10bit)で返してきます。
よって、ここで下位2bitを破棄しています。

画像06 ADC関数の追加

戻し値は16bit符号無整数で、下位10bitが有効です。
引数(入力ポート)の設定が無いので、汎用性がありません。

今回のソースファイル

アッセンブラ版

 PIC_START_PRG02_ADC.asm

XC8版

 PIC_START_CPRG02_ADC.c



戻る  実験・製作の記録TOPへ戻る