MAX7651を使用したADC変換の実行

MAX7651を使用したADC変換の実行

著者の連絡先情報

要約

このアプリケーションノートには、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