2440 test 之ADC
1 AD转化简单介绍
1)ARM内置的ADC转换是8通道的10位的模数转化器;
2)本程序可以实现通道0(AIN0)和通道1(AIN1)的模数转化;
3)使用查询的方式来访为转换后的数据。具体实现是查看ADCCON[15](转换标志结束位)是否为1;
4)ADC转化需要确定两个参数:1 模拟输入通道 2AD转换频率。由于AD转换频率至少小于PCLK的1/5(10.14Mhz) ,所以设置了转换频率为2.5MHZ.通过转换频率可以求出预分频值,预分频值=(50Mhz(GCLK)/AD转换频率)-1.
2AD转化的实现步骤:
1)通过转化频率计算预分频值
2)写预分频值和模拟通道到ADCCON
3)通过设置ADCCON的第0位为1,开始ADC
4)确定转换开始后,通过查询ADCCON[15](转换标志结束位)是否为1判断是否转换结束
5)如果转换结束,读取ADCDATO[0-9],即转换后的数据
/====================================================================
// File Name : Adc.c
// Function : S3C2410 ADC Test
// Program : Kang, Weon Tark
// Date : May 22, 2002
// Version : 0.0
// History
// 0.0 : Programming start (March 29,2002) -> KWT
// ADC Test -> May 15, 2002 SOP
//====================================================================
#include "def.h"
#include "option.h"
#include "2440addr.h"
#include "2440lib.h"
#include "2440slib.h"
#define REQCNT 100 //May 08, 2002 SOP
#define ADC_FREQ 2500000 //设定AD的转换频率,应该至少小于PCLK的1/5(10.14Mhz)
//#define ADC_FREQ 1250000
//#define LOOP 1
#define LOOP 10000 //延迟的循环次数
int ReadAdc(int ch)
{
int i;
static int prevCh=-1; //定义静态整形变量prevCh存储AD转换通道
rADCCON = (1<<14)|(preScaler<<6)|(ch<<3); //设置通道ch和 预分频值preScaler
if(prevCh!=ch) //如果通道改变了
{
rADCCON = (1<<14)|(preScaler<<6)|(ch<<3); //重新设置设置通道ch和 预分频值preScaler
for(i=0;i<LOOP;i++); //delay to set up the next channel
prevCh=ch;
}
rADCCON|=0x1; //开始ADC
while(rADCCON & 0x1); ////检查 Enable_start 是否为低电平
while(!(rADCCON & 0x8000)); //检查EC(End of Conversion) 位是否为高电平
return ( (int)rADCDAT0 & 0x3ff );//ADCDAT0[0-9]是普通AD转换后的数据
}
//==================================================================================
void Test_Adc(void)
{
int a0=0, a1; //初始化变量
U32 rADCCON_save = rADCCON;//用rADCCON_save 存储初始的ADCCON,以备恢复用
Uart_Printf( "ADC INPUT Test, press ESC key to exit !\n" ) ;
preScaler = ADC_FREQ;
Uart_Printf("ADC conv. freq. = %dHz\n",preScaler);//打印AD的转换频率
preScaler = 50000000/ADC_FREQ -1; //PCLK:50.7MHz 。通过转化频率计算预分频值
Uart_Printf("PCLK/ADC_FREQ - 1 = %d\n",preScaler);
while( Uart_GetKey() != ESC_KEY )
{
a0=ReadAdc(0); //对应开发板上W1可调电阻
a1=ReadAdc(1); //对应开发板上W2可调电阻
Uart_Printf( "AIN0: %04d, AIN1: %04d\n", a0, a1 );
Delay( 500 ) ;
}
rADCCON = rADCCON_save; 恢复ADCCON
Uart_Printf("\nrADCCON = 0x%x\n", rADCCON);
}
volatile U32 preScaler;