应用笔记 3083

利用MAX7651实现ADC转换


摘要 : 本文提供了利用MAX7651评估板实现模/数转换的源代码和函数。它是MAX7651评估板提供的3个应用例程之一,能够进行写、编译和下载等简单的编程功能。

另请参考: 本文利用8051兼容的微控制器MAX7651实现模/数转换,并给出了程序代码。其中包括一些关键的写操作、编译和程序下载步骤,支持MAX7651EVKIT进行模数转换,并可读取转换结果。程序使用了MAX7651内部的12位集成ADC。

本例源代码利用Keil DK-51 IDE创建,需要从www.keil.com下载并安装Keil DK-51演示软件,以简化例程使用。Keil程序包含MAX7651基本的库文件,接下来,应该下载µVision2®项目文件和源代码:AN3083_uVision2_Project_Files.zip

本例使用MAX7651EVKIT,当然,必要时也可以使用Keil µVision® IDE仿真器演示这些源代码,无需使用MAX7651EVKIT。软件安装请参考MAX7651EVKIT的快速入门使用手册,其中提供了关于Keil软件安装的详细信息。

注意:这里提供的例程是Maxim给出的公开源代码,可以免费复制,并根据具体应用进行修改。

C程序说明

为了有效使用该例程,需要熟悉C语言编程。程序包括三部分:“ADC Test Function”主程序(main())和两个调用子函数:convert_all_channels()和convert_channel()。主程序首先对MAX7651的寄存器进行初始化,并提供一些标准的库函数。然后配置MAX7651,与PC的标准串口进行通信。

主程序main()调用两个子函数,函数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



下一步
EE-Mail 订阅EE-Mail,接收关于您感兴趣的新文档的自动通知。
© , Maxim Integrated Products, Inc.
The content on this webpage is protected by copyright laws of the United States and of foreign countries. For requests to copy this content, contact us.
APP 3083:
应用笔记 3083,AN3083, AN 3083, APP3083, Appnote3083, Appnote 3083