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;

posted @ 2009-12-31 11:59  clara  阅读(685)  评论(0编辑  收藏  举报