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;

發佈了31 篇原創文章 · 獲贊 4 · 訪問量 8萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章