S3C2440包含一个8通道A/D转换器,有10位分辨率下面简要介绍一下S3C2440中ADC的用法:
用到的寄存器:
ADCCON:ADC控制寄存器
ADCDAT0:ADC转换数据寄存器
SUBSRCPND:次级源挂起寄存器
INTSUBMSK:中断次级屏蔽寄存器
SRCPND:源挂起寄存器
INTPND:中断挂起寄存器
INTMSK:中断屏蔽寄存器
ADCCON:AD控制寄存器
ADCDAT0:AD转换数据寄存器
1,首先设置控制寄存器ADCCON的相应位来选择频率和通道:
[html] view plain copy
rADCCON = (1<<14)|(preScaler<<6)|(ch<<3); //setup channel,分频使能,写入分频值,选择通道
其中PreScaler是预分频值,决定A/D转换器频率 = 50MHz/(49+1) = 1MHz
如图:
rADCCON|=0x1; //start ADC开始转换
while(rADCCON & 0x1); //check if Enable_start is low等待启动位清零,转换启动结束
while(!(rADCCON & 0x8000)); //check if EC(End of Conversion) flag is high等待转换结束
3,最后读取相应通道转换结果寄存器的值:
寄存器ADCDAT0的低10位用于存储A/D转换后的数据。
return ( (int)rADCDAT0 & 0x3ff );//返回0~9位的采样值,0~1023
a0=ReadAdc(0); //对应开发板上W1可调电阻
a1=ReadAdc(1); //对应开发板上W2可调电阻
OK!
有必要介绍一下寄存器ADCCON:
如下图:
//====================================================================
// 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
//#define ADC_FREQ 1250000
//#define LOOP 1
#define LOOP 10000
volatile U32 preScaler;
//==================================================================================
int ReadAdc(int ch)
{
int i;
static int prevCh=-1;
rADCCON = (1<<14)|(preScaler<<6)|(ch<<3); //setup channel,分频使能,写入分频值,选择通道
if(prevCh!=ch)
{
rADCCON = (1<<14)|(preScaler<<6)|(ch<<3); //setup channel
for(i=0;i
prevCh=ch;
}
rADCCON|=0x1; //start ADC开始转换
while(rADCCON & 0x1); //check if Enable_start is low等待启动位清零,转换启动结束
while(!(rADCCON & 0x8000)); //check if EC(End of Conversion) flag is high等待转换结束
return ( (int)rADCDAT0 & 0x3ff );//返回0~9位的采样值,0~1023
}
//==================================================================================
void Test_Adc(void)
{
int a0=0, a1; //Initialize variables
U32 rADCCON_save = rADCCON;//保存原值
Uart_Printf( "ADC INPUT Test, press ESC key to exit !\n" ) ;
preScaler = ADC_FREQ;
Uart_Printf("ADC conv. freq. = %dHz\n",preScaler);
preScaler = 50000000/ADC_FREQ -1; //PCLK:50.7MHz//preScaler =1转换频率freq=50M/(1+1)=25M,最大不超过PCLK的1/5?
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=(0<<14)|(19<<6)|(7<<3)|(1<<2); //stand by mode to reduce power consumption
rADCCON = rADCCON_save;//恢复原值
Uart_Printf("\nrADCCON = 0x%x\n", rADCCON);
}
效果图:
完整工程文件可在这里下载。
『本文转载自网络,版权归原作者所有,如有侵权请联系删除』