一个鸡肋的ADC?
08年刚出触摸屏的时候,adc原用于电阻式触摸屏复用的。然而刚过半年不到,电容屏推广了,adc成为了一个鸡肋的存在。当然这仅是对开发板而言,实际上ADC又叫模数变换器,用于真实世界的模拟信号,例如温度、压力、声音或者图像等,需要转换成更容易储存、处理和发射的数字形式。ADC原理图
ADC的控制寄存器---ADCCON
转换后的数字量---ADCDAT
选择转换通道的寄存器---ADCMUX
ADC的中断清除寄存器
三、ADC的两种工作模式
1、轮询模式
当打开ADC转换功能后,ADC就开始转换;我们需要轮询判断ADC转换是否完成,没有完成就等待,完成就读取转换后的数字量。
2、中断模式
当打开ADC转换功能后,ADC就开始转换;当ADC转换完成后,就会产生中断。我们在中断服务程序中,可以读取转换后的数字量。
ADC的中断源和中断号
三、ADC的程序设计
1、轮询的方式设计ADC的程序
unsigned short read_adc(int ch)
{
unsigned short adc_data;
//12bits,enable prescaler,devider factor=20,normal,diasable read
ADCCON = (1<<16)|(1<<14)|(19<<6);
ADCMUX = ch;
ADCCON |= (1<<0);//enable adc
while(!(ADCCON & (1<<15)));//wait for
adc_data = ADCDAT & 0xfff;
ADCCON &= ~(1<<14);//disable prescaler
ADCCON |= (1<<2);//standby mode
return adc_data;
}
2、中断的方式设计ADC的程序
int main(void)
{
int i;
uart_init();
for(i=0;i<0x100;i++);
printf("\n\r the test of adc on GEC210\n\r");
printf("adc_data = %d\r\n",adc_data);
int_init();
intc_setvectaddr(NUM_ADC, adc_isr);
//12bits,enable prescaler,devider factor=20,normal,diasable read
ADCCON = (1<<16)|(1<<14)|(19<<6);
ADCMUX = 0; //channel =0x0
intc_enable(NUM_ADC);
ADCCON |= (1<<0);//enable adc
while(1)
{
for(i=0;i<0x200000;i++);
ADCCON |= (1<<0);//enable adc
}
}
void adc_isr(void)
{
adc_data = ADCDAT & 0xfff;
printf("adc_data = %d\r\n",adc_data);
CLRINTADC0 = 122;
intc_clearvectaddr();
}