PIC18F14K50でA/D変換モジュールを使用する実験の記録である。A/D変換結果をUSBによる仮想シリアル通信でPCへ送信することができた。
USB対応マイコンPIC18F14K50にはA/D変換モジュールがあるためA/D変換結果をPCにUSBで送信することができれば、応用の幅が広がる。そこで、今回はPIC18F14K50を用いて、A/D変換を行いその結果をUSBでPCに送信できるようにしてみる。
使用する実験装置は、おなじみの『PICで動かすUSB』評価基板とする。そして今回の目標は何らかのA/D変換結果がUSBでPCに送信できればよいので、図1のようにスイッチが押されたらアナログ電圧をA/D変換し結果をPCに送る。プログラムの大まかな流れとしては以下のとおり。このうち、Ⅰ、Ⅲ、Ⅳは以前の記事ですでに方法を確立している。そこで、今回主にプログラムを考えるのはⅡである。
- 基板上のスイッチが押されたことを検出する
- A/D変換を行う
- 変換結果をUSBによる仮想シリアル通信でPCに送る
- PCにてシリアルを受信し画面に表示する
図2.1に今回実験に使用するハードウェアの構成を示す。変換対象のアナログ電圧は、直流電源が出力するDC電圧としRC6/AN8で読み込むように配線を施した。その他の回路構成は『PICで動かすUSB』の評価基板から変更していない。スイッチが押されたことはRA3の値を読み検出する。

図2.1 ハードウェア構成
PIC18F14K50でA/D変換をするためには、以下の手順が必要である。
- 使用するポートの設定
- A/D変換モジュールの設定
- A/D変換の開始
- A/D変換の終了検出
- 変換結果の取得
以下、順を追ってプログラムを記述する。
Ⅰ 使用するポートの設定はポートを入力にする、アナログ入力にするという2つが必要である。今回はポートCのRC6すなわちAN8を使用することにしたので、以下の記述が必要。
TRISCbits.RC6 = 1; //RC6を入力にする
ANSELHbits.AN8 = 1; //RC6をアナログ入力にする
Ⅱ A/D変換モジュールの設定では、モジュールの有効化、入力ch選択、変換クロックの選択、電圧リファレンス、フォーマット(右寄せか左寄せか)の5つが必要である。今回は電圧リファレンスはVssとVddを用いる。またフォーマットは右寄せとする。したがって、
ADCON0 = 0x21; //AN6を選択、モジュールを有効にする
ADCON1 = 0x00; //電圧リファレンスはVssとVddを用いる
ADCON2 = 0x22; //アクイジションタイムは8TAD、クロックはFosc/32
ADCON2bits.ADFM = 1; //右寄せ
Ⅲ A/D変換の開始は、以下の1行でよい。
ADCON0bits.GO = 1;
Ⅳ A/D変換の終了は、ADCON0bits.NOT_DONE = 0をポーリングで検出するかA/D変換終了割り込みフラグを検出するかのどちらかだが、今回はポーリングとした。すなわち、以下の1行である。
while(ADCON0bits.NOT_DONE);
Ⅴ A/D変換結果の取得は、ADRESLとADRESHから取得すればよい。今回は『PICで動かすUSB』第4章-5を参考にしGenericTypeDef.hというヘッダファイルに定義されているWORD_VALという共用体を使って格納することにした。すなわち以下のような記述となる。
WORD_VAL w; //WORD_VAL型のwを使う
w.v[0] = ADRESL; //下位8ビットを格納
w.v[1] = ADRESH; //上位2ビットを格納
動作確認は、変換対象のアナログ電圧を変化させてその変換結果を調べることにした。その結果が、図3である。与えた電圧に対してほぼ直線的に変換結果も対応しているので概ね正しく変換されていると思われる。

図3 入力電圧とA/D変換結果
PIC18F14K50のA/D変換モジュールを用いてA/D変換を行い、正しく動作させることができた。これで、A/D変換を行った結果をUSB経由でPCに送信するためのテクニックが揃ったので今後このテクニックを生かしてまた何かを作ってみたい。