要約
このアプリケーションノートには、MAX7651のEVキットを使用してアナログ-ディジタル変換を行うためのソースコードと関数呼出しが含まれています。これは、MAX7651のEVキットのターゲットボード用の簡単なプログラムの作成、コンパイル、およびダウンロードの方法を示す、3部構成のアプリケーション例の第1部に相当します。
関連アプリケーションノート:
このアプリケーションノート中のソースコードは、8051互換マイクロコントローラMAX7651を使用してアナログ/ディジタル変換を行う方法を示す例になっています。変換を実行して結果を読み取るために必要となる、コードの記述、コンパイル、およびMAX7651EVKITへのダウンロードの主要な手順が含まれています。このプログラムでは、MAX7651に搭載されているオンチップの12ビット内蔵ADCを使用します。このコード例は、Keil DK-51 IDEツールを使用して作成しました。ソースコードを簡単に利用するため、Keil DK-51のデモソフトウェアをwww.keil.comからダウンロードしてインストールしてください。このKeil社のソフトウェアには、MAX7651用の基本的なライブラリが含まれています。次に、µVision2のプロジェクトファイルとソースコードが格納されたAN3083_uVision2_Project_Files.zipをダウンロードしてください。
この例ではMAX7651EVKITを使用しています。また一方、Keil µVision IDE Simulatorを使用することによってMAX7651EVKITなしでもこのソースコードを動作させることが可能です。Keil社製ソフトウェアのインストールの詳細については、MAX7651EVKITのクイックスタートマニュアルを参照してください。
注:マキシムが提供するソースコード例はパブリックドメインです。必要に応じて、自由にコピー、変更、または使用することができます。
Cコードの説明
このソースコード例を有効に活用するためには、ある程度Cプログラミング言語に精通していることが前提になります。このコードは、「ADC Test Function」と呼ばれるmain()プログラムと、convert_all_channels()およびconvert_channel()という2個の関数の、3つの部分で構成されています。メインプログラムは、最初にMAX7651のレジスタ位置によるプログラムの初期化と標準ライブラリ(stdio.h)関数のインクルードを行っています。次に、標準シリアルポートを使用してPCとの通信を行うためのMAX7651の設定を行っています。
main()プログラムは、2個の関数を呼び出しています。convert_all_channels()関数は、8個すべてのADC入力チャネルについて順番に変換を行います。convert_channel()関数は変換チャネルを選択することが可能で、ADC変換が完了した時点で結果が返されます。
変換を開始するには、単にconvert_all_channels()またはconvert_channel()のいずれかの関数を呼び出します。これらの関数は、要求されたチャネルをMAX7651のADCONレジスタに書き込んだ後、ADCONレジスタをポーリングして変換の終了を待つことによって、変換を実行します。変換が完了した後、結果が呼出し元の関数に返されます。そしてmain()プログラムが、stdio.hに含まれているprintf()関数を使用して結果をシリアルポートに出力します。
/*------------------------------------------------------------------------- ADC Test Function (main.c) Copyright: Maxim Integrated Target: MAX7651 Date: Feb 26, 2004 Author: Maxim Integrated Description: This program will convert 8 channels using the MAX7651 and send the results to Serial Port 0 --------------------------------------------------------------------------*/ #include <reg51.h> //include MAX7651 register definitions #include <stdio.h> //Standard I/O, Print() function. #define NUMBER_OF_CHANNELS 8 //Convert 8 channels void convert_all_channels(int* buffer); //Function declaration int convert_channel(int adc_ch); //Function declaration void main(void) //Begin Main() { int Adc_Results[NUMBER_OF_CHANNELS]; //Array to store conversion result int i; //for loop counter convert_all_channels(Adc_Results); //Convert all channels, Store results in Adc_Results #ifndef MONITOR51 //Setup Serial Port if not using Keil Monitor SCON = 0x50; //9600 Baud, 8N1, Xon, Xoff TMOD |= 0x20; TH1 = 0xFA; TR1 = 1; TI = 1; PCON |= 0x80; #endif for (i=0; i < NUMBER_OF_CHANNELS; i++) //Display contents to Adc_Results { printf ("CH %d:%x ",i,Adc_Results[i]); //print the hex } printf(" channel 0 %x", convert_channel(0)); //Convert a single channel and display printf(" channel 1 %x", convert_channel(1)); printf(" channel 2 %x", convert_channel(2)); printf(" channel 3 %x", convert_channel(3)); printf(" channel 4 %x", convert_channel(4)); printf(" channel 5 %x", convert_channel(5)); printf(" channel 6 %x", convert_channel(6)); printf(" channel 7 %x", convert_channel(7)); while(1); //End Program, Start infinite loop since there is no OS } /*------------------------------------------------------------------------- Function: convert_all_channels Copyright: Maxim Integrated Target: MAX7651 Date: Feb 26, 2004 Author: Maxim Integrated Usage: The function will return 8 conversion results to an array. Parameters: p_buffer, pointer to an 8 location array stores the conversion results Return: Values are returned to the calling function using the function parameters /*------------------------------------------------------------------------- Setup ADC in the MAX7651 --------------------------------------------------------------------------*/ sfr ADCON = 0xC5; //Define address of MAX7651 ADCON sfr ADDAT1 = 0xC3; //Define address of MAX7651 ADDAT1 (8MSBs) sfr ADDAT0 = 0xC2; //Define address of MAX7651 ADDAT0 (4LSBs) void convert_all_channels(int* buffer); --------------------------------------------------------------------------*/ #define NUMBER_OF_CHANNELS 8 void convert_all_channels(int* p_buffer) //pointer Buffer to return { int adc_ch; int conv_val; /*----------------------------------------------- Convert all ADC channels -----------------------------------------------*/ for (adc_ch = 0; adc_ch < NUMBER_OF_CHANNELS; adc_ch++) //for ADC channels 1 to 7 { /*----------------------------------------------- Start a conversion and wait for it to complete. -----------------------------------------------*/ ADCON = adc_ch; //Start conversion and select channel while ((ADCON & 0x80) == 0); //wait for conversion to complete conv_val = (ADDAT0 >> 4) | (ADDAT1 << 4); //Format the data in 12 bit format *(p_buffer+adc_ch) = conv_val; //Write result back to calling function } //End For } //End function convert_all_channels() /*------------------------------------------------------------------------- Function: convert_channel Copyright: Maxim Integrated Target: MAX7651 Date: Feb 26, 2004 Author: Maxim Integrated Usage: The function will convert and return the result of a Channel. Parameters: adc_ch, Select ADC channel to be converted. Channels 0-7 = single ended channel 0-7. Channels 8-11 = differential channel pairs {CH0,1}, {CH2,3}, {CH4,5}, {CH6,7} Channel 12 = differential reference measurement {REF+,REF-} Return: Function returns Integer with the conversion result Function Declaration: int convert_channel(int adc_ch); --------------------------------------------------------------------------*/ /*------------------------------------------------------------------------- Setup ADC in the MAX7651 --------------------------------------------------------------------------*/ sfr ADCON = 0xC5; //Define address of MAX7651 ADCON sfr ADDAT1 = 0xC3; //Define address of MAX7651 ADDAT1 (8MSBs) sfr ADDAT0 = 0xC2; //Define address of MAX7651 ADDAT0 (4LSBs) int convert_channel(int adc_ch) { int conv_val; if (ADCON <0 || ADCON >12){ //Check for valid channel return (-2048); //Using -FS for the error code } ADCON = adc_ch; //Select channel and Start conversion while ((ADCON & 0x80) == 0); //Wait for the conversion to complete conv_val = (ADDAT0 >> 4) | (ADDAT1 << 4); //Format the data in 12 bit format return (conv_val); //Return result back to calling function } //End function convert_chan