ADC,为模数转换器。S3C2440中提供的ADC转换器有8个通道,其中4个用于触摸屏,4个为正常用途{ A[0..3] }(如下图),中间有个8:1的为8选一开关,用来选通AD转换通道,INT_ADC为中断产生信号线,(XP,XM,YP,YM用于触摸屏)
ADC的基本应用主要是配置ADCCON
注:ADC时钟来源为PCLK,配置时ADC的时钟一定要小于PCLK的1/5,而且ADC时钟频率不能大于2.5MHz
ADC需要配置的:
1.是否开启预分频,开启则设置预分频系数
2.Mux 。 8个通道中选一个通道
3.是否读取后自动开启ADC
4.开启ADC
一般通道转换后的数据放在ADCDAT0的低10位
#include "2440addr.h"
#include "config.h"
#define PCLK 50000000
#define PRSCEN 1 //使能预分频系数
#define PRSCVL 49 //预分频系数,ADC Freq = (FCLK/PRSCVL + 1)
#define STDBM 0 //正常模式
#define READ_START 0 //读取后不自动开启ADC转换,手动开启
#define Adc_Start() rADCCON |= 1 //开启ADC
void adcInit(unsigned char channel);
int adcRead(void);
void uartInit(int baudrate);
void putc(unsigned char c);
void Main(void)
{
int value;
/* 使用2号通道 */
adcInit(2);
uartInit(115200);
while(1)
{
value = adcRead();
/* value的范围为 0 ~ 1023 */
putc(value/1000 + '0');
putc( (value%1000)/100 + '0');
putc( (value%100)/10 + '0');
putc( (value%10) + '0');
putc('\n');
/* 延时 */
for(value = 0; value<1000000;value++)
;
}
}
void adcInit(unsigned char channel)
{
/* 配置ADC,手动启动*/
rADCCON &= ~(0xffff);
rADCCON |= ((READ_START<<1) | (STDBM<<2) | (channel<<3) |
(PRSCVL<<6) | (PRSCEN<<14));
}
int adcRead(void)
{
/* 使能ADC */
Adc_Start();
/* ADC启动后位0会自动置位0 */
while(rADCCON & (1<<0))
;
/* 等待ADC转换结束 */
while(!(rADCCON & (1<<15)))
;
return ( (int)(rADCDAT0 & 0x3ff) );
}
/* 串口通信的配置 */
void uartInit(int baudrate)
{
rGPHCON &= ~((3<<4) | (3<<6));
rGPHCON |= (1<<5) | (1<<7);
rULCON0 &= ~(0xff);
rULCON0 |= (0x3<<0);
rUCON0 &= ~(0xffff);
rUCON0 |= ((1<<0) | (1<<2));
rUBRDIV0 = (int)(PCLK/baudrate/16) - 1;
}
void putc(unsigned char c)
{
rUTXH0 = c;
while(!(rUTRSTAT0 & (1<<2)))
;
}