嵌入式开发第48天(ADC的原理与应用)

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



猜你喜欢

转载自blog.csdn.net/reasonss/article/details/52676356