TKM-Hのドットマトリクスディスプレイ付き距離センサボード(以下,DMDボード)をメインマイコンボード搭載ボードに接続するとジョイスティックの位置を検知することができます.では,ジョイスティックの中身はどうなっているのでしょうか.実はただ下図のように可変抵抗が2個入っているのにすぎません.ジョイスティックのレバーを動かすと,この可変抵抗の値が変わり,結果としてマイコンの端子が電圧が0~3.3[V]の間で変化します.これをAD変換すればジョイスティックの位置がわかるわけです.
DMDボードにあるPIC16F1936マイコンとジョイスティックは,AN2(ポートグループA:2番ピン),AN3(ポートグループA:3番ピン)とつながっています.従って,ジョイスティックの動作とAN2およびAN3で得られる電圧値との対応は下図のようになります.
-
ポートの設定
AD変換する方法を説明します.まず,RA2(AN2)およびRA3(AN3)端子をアナログ入力端子にします.それにはピン出力ドライバTRISxyを1にするとともに,ANSAtレジスタを用います.ここでxはポートグループ,yはポート番号,tはANtと対応しており,28ピンの場合には0から4まで,40ピンの場合には0から5までの値が入ります.従って,RA2(AN2)およびRA3(AN3)端子をアナログ入力端子にするには,次のプログラムになります.
/* RA2端子を入力端子にする */ TRISA2 = 1; /* RA3端子を入力端子にする */ TRISA3 = 1; /* RA2(AN2)端子をアナログ入力端子とする */ ANSA2 = 1; /* RA3(AN3)端子をアナログ入力端子とする */ ANSA3 = 1;
-
ADCモジュールの設定
ADC(ADコンバータの意)の変換クロックをはじめに選択します.ADCのクロックを制御するレジスタはADCSです.下表にADCSおよび動作周波数と,変換時間の関係を示します.ここでFoscは動作周波数を表しております.また,灰色で網掛けしているものは,AD変換するための時間用件を満たしていないため,正しい結果が得られません.また,黄色で網掛けしているものは余り高速ではないため,別のクロックソースを選択することを推奨しています.
ADC Clock Period Device Frequency(Fosc) ADC
Clock SourceADCS<2:0> 32[MHz] 20[MHz] 16[MHz] 8[MHz] 4[MHz] 1[MHz] Fosc/2 000 62.5[ns] 100[ns] 125[ns] 250[ns] 500[ns] 2.0[us] Fosc/4 100 125[ns] 200[ns] 250[ns] 500[ns] 1.0[us] 4.0[us] Fosc/8 001 0.5[us] 400[ns] 0.5[us] 1.0[us] 2.0[us] 8.0[us] Fosc/16 101 800[ns] 800[ns] 1.0[us] 2.0[us] 4.0[us] 16.0[us] Fosc/32 010 1.0[us] 1.6[us] 2.0[us] 4.0[us] 8.0[us] 32.0[us] Fosc/64 110 2.0[us] 3.2[us] 4.0[us] 8.0[us] 16.0[us] 64.0[us] Frc x11 1.0-6.0[us] 1.0-6.0[us] 1.0-6.0[us] 1.0-6.0[us] 1.0-6.0[us] 1.0-6.0[us]
例えば,Fosc=4[MHz],変換時間1.0[us]とするには,次のようなプログラムを書きます./* Fosc=4[MHz],変換時間1[us]とするため,Fosc/4とする */ ADCS2=1; ADCS1=0; ADCS0=0;
次に,電圧リファレンスを設定します.AD変換するとき,基準となる電位が必要です.これを電源リファレンスです.電源リファレンスには上限と下限を設定できます.前者はADPREFレジスタ,後者はADNREFレジスタで設定できます.今回,上限をVdd,下限をVssに設定しますので,プログラムは次のようになります.
/* AD変換の上限電圧 */ ADPREF0=0; ADPREF1=0; /* AD変換の下限電圧 */ ADNREF=0;
次に,ADコンバータの入力チャネルを選択します.選択するには,CHSレジストリに値を設定します.CHSとANtの関係を下表に示します.t CHS4 CHS3 CHS2 CHS1 CHS0 0 0 0 0 0 0 1 0 0 0 0 1 2 0 0 0 1 0 3 0 0 0 1 1 4 0 0 1 0 0 5 0 0 1 0 1 6 0 0 1 1 0 7 0 0 1 1 1 8 0 1 0 0 0 9 0 1 0 0 1 10 0 1 0 1 0 11 0 1 0 1 1 12 0 1 1 0 0 13 0 1 1 0 1
ここではAN2を変換した後,AN3を変換するものとしますので,まずはAN2を指定します.
/* AN2を変換対象とする */ CHS4=0; CHS3=0; CHS2=0; CHS1=1; CHS0=0;
ADCモジュールの設定の最後はADC モジュールをオンにすることです.それにはADONレジスタを使います.ADONを1にするとAD変換が開始されます.なお,ADON=1にしてもすぐにAD変換が開始されるわけではなく,あくまでAD変換モジュールが動作し始めるだけです.変換を開始させるのは,この後に説明するGO/DONEレジスタです.
/* AD変換を開始する */ ADON=1;
-
ADアクイジションの待機
AD変換するとき,内蔵のキャパシタに電荷を溜め込む必要があります.このため込む作業をするのに時間が必要です.詳しい計算式は,データシートを読んでください.ここでは,5[us]程度待てばよいということにしておきます. -
変換開始
変換を開始するにはGOレジスタを1にします.このレジスタは,AD変換が終了すると自動的に0になりますので変換開始後にはポーリング(変化をずっと見張っていること)します.
/* AD変換開始 */ GO=1; /* AD変換が終わるまで待つ */ while(GO==1);
-
結果読み取り
変換が終わりましたらその結果を取得します.結果が格納されるのはADRESHとADRESLです.PIC16F1936のAD変換器は10ビットの分解能ですので,1バイト(=8ビット)に収まりきりません.そこで,8ビットと2ビットに分けて格納されます.格納方法には左詰と右詰があります.左詰の場合,ADRESHに8ビット,ADRESLに2ビット(上位2ビットのみでそれ以外は0),右詰の場合にはADRESHに2ビット(下位2ビットのみでそれ以外は0)とADRESLに8ビットが格納されます.詰め方を指定するレジスタはADFMで,ADFM=0の場合には左詰,ADFM=1の場合には右詰となります.ここでは左詰とし,下位2バイトは誤差の範囲ということで捨てることにします.
/* 左詰とする */ ADFM=0; /* 上位8ビットのみ取得 */ { uint8_t an2_result = ADRESH; }
-
AN3のAD変換
ここまででAN2のAD変換を終了しました.同じ方法でAN3のAD変換をします.CHSをAN3にして同じことを繰り返してください.以上でAN2およびAN3のAD変換を終了します. -
結果をドットマトリクスディスプレイを表示する
変換結果を表示するため,ドットマトリクスディスプレイを用います.ドットマトリクスディスプレイにパターンを表示する方法についてはこちらをご覧ください.