PICキット スタートマニュアル8
アナログI/O制御の基本プログラミング その1
A/Dコンバータを使ってみる(アッセンブラ、XC8)編
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
詳細な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も使用します
回路図はここにあります
とは言っても、ただのボリウムです・・・
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と言う専用変数に収納
(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と言う専用変数に収納
画像03 A/Dコンバータ サブルーチン
分かり易く、シンプルなサブルーチンと思います。
その反面汎用性が無く、推奨される記述では無いです・・・
ADC出力値10bitデータの内、下位2bitは切り捨てています。
そのデータは専用変数に収納しています。
分かり易く、シンプルなサブルーチンと思います。
その反面汎用性が無く、推奨される記述では無いです・・・
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有効)で返します
(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有効)で返します