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;