一个鸡肋的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(); }