您的位置:首页 > 其它

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

2016-09-27 00:47 423 查看

一个鸡肋的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();
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: