トップページ > dsPIC入門 > dsPICでAD変換(2)

AD変換を使ってみる

ソースコード

タイマーやUARTの時と同じように、AD変換モジュールを使用するためには準備が必要です。 この初期設定というやつが、やたら面倒です。例の如くコンフィグをズラズラと並べていくことになります。 ただし、毎回のことですが一度書いてしまえば雛型として繰り返し使えるようになるので最初だけ頑張って コーディングしていくことにします。

//********************************************************************
//AD変換テスト  @dsPIC30F4012
//********************************************************************


//====================================================================
//ヘッダファイル
#include "p30f4012.h"
#include "adc10.h"
//====================================================================

//コンフィギュレーション
_FOSC(CSW_FSCM_OFF & XT_PLL8);     //10MHzセラロックを使っているのでクロックは80MHz。
_FWDT(WDT_OFF);
_FBORPOR(PBOR_ON & BORV_20 & PWRT_64 & MCLR_EN);
_FGS(CODE_PROT_OFF);



//====================================================================
//AD変換用のコンフィグ

unsigned int ADconfig1 = ADC_MODULE_ON & ADC_IDLE_STOP & ADC_FORMAT_INTG & ADC_CLK_AUTO & 
                         ADC_AUTO_SAMPLING_ON & ADC_SAMPLE_SIMULTANEOUS & ADC_SAMP_ON;

unsigned int ADconfig2 = ADC_VREF_AVDD_AVSS & ADC_SCAN_ON & ADC_CONVERT_CH0 & ADC_SAMPLES_PER_INT_1 & 
                         ADC_ALT_BUF_OFF & ADC_ALT_INPUT_OFF;

unsigned int ADconfig3 = ADC_SAMPLE_TIME_1 & ADC_CONV_CLK_SYSTEM & ADC_CONV_CLK_8Tcy;

unsigned int ADconfigPORT = ENABLE_AN0_ANA;

unsigned int ADconfigSCAN = 0;

unsigned int ADconfigCHANNEL = ADC_CH0_POS_SAMPLEA_AN0 & ADC_CH0_NEG_SAMPLEA_NVREF;
            
//====================================================================
//メイン関数

int main(void)
{

 //-------------------------------------------------------------------
 //ポート初期設定

 //ポートBは0ビット目だけ入力
 TRISB = 0x01;

 //ポートEは出力
 TRISE = 0x00;

 //-------------------------------------------------------------------
 //AD変換モジュールの初期設定

 //各種機能の設定
 OpenADC10(ADconfig1,ADconfig2,ADconfig3,ADconfigPORT,ADconfigSCAN);

 //データ・セレクタに関する設定
 SetChanADC10(ADconfigCHANNEL);
 


 //-------------------------------------------------------------------
 //あとはひたすらAD変換

 while(1)
 {
  //AD変換をする
  ConvertADC10();

  //AD変換終了まで待つ
  while(BusyADC10());
  
  //PORTEへ出力
  PORTE = ReadADC10(0);

 }


}
//********************************************************************

コンパイル・書き込みをして、実行

dsPIC内のAD変換モジュールの構成についてはひとまず置いておいて 、とりあえずAD変換モジュールを 動かしてみます。まず、上記ソースコードをコンパイルします…が、内臓モジュールを使用する際は MPLABでライブラリファイルを設定する必要があるのでタイマーの項の 末尾の『コンパイルする際の注意』を参照して設定してください。

無事コンパイルできたら、dsPICに書き込んで実験してみます。AD変換の実験用の基盤 において、可変抵抗をまわした際に緑色のLEDがAD変換値に応じて光ります。 AD変換値をそのままポートに出力しているので、2進数が増減するような光り方になっています。

※ただし、AD変換は10ビット=1024段階です。AD変換のための入力電圧は、 おおよそ5[V]の電源電圧を10[kΩ]可変抵抗で分圧して入力しています。 すると、5[V]をだいたい1000で割って、0.005[V]くらいの変化でLEDの末尾ビット(PORTEの0ビットに対応)が 点灯したり、しなかったりします。これは手で可変抵抗を回す実験ではとても見分けられません…。 せいぜい上位2ビットくらいが2進数的な動きになっていることが確認できればいいと思います。

メイン関数

最初の実験ですので、例の如く非常に簡単な処理しかやっていません。ソースコードを見れば一発でわかりますが、

  1. ポートの初期設定  (可変抵抗がつながっているPORTBの0ビット目を入力に。)
  2. AD変換の初期設定  (AD0だけをサンプリング。手動。割り込みなし。)
  3. AD変換を手動で実行
  4. AD変換値をポートEへ出力
  5. 3と4を繰り返し

…です。
メイン関数だけを見ればとても短いプログラムです。ただし“AD変換用のコンフィグ”のところが 大変なことになっています。長いですね…。dsPICのAD変換モジュールは多機能なのですが、 そのおかげで初期設定が必要なパラメーターも多くなっています。混乱しないように、 1つ1つ回路側の構成と結びつけて確認していくことにします。また、AD変換用の各種関数についても、 合わせて次回確認します。




前へ   次へ