424778940 发表于 2013-7-19 17:21:44

avr adc部分求助 芯片使用的是atmega128a 得不到正确的结果

本帖最后由 424778940 于 2013-7-19 17:42 编辑

如题,目前使用芯片是mega128a
adc部分第一次用,很多不了解,于是来请教
板子原理图见附件

不清楚的地方有一下几点
adc使用时候ddr和port要怎么配置?? ddr设为输入,port呢?
内部参考电压是否准确,受什么影响?
单通道和差分输入都要怎么接线??? 手册上有些部分说的太绕了,初次接触实在是看不明白


单片机工作在5v电压,万用表实测在4.9x,vref也是这个值,代码如下,使用为porta,单通道,adc0输入
串口hex输出三个char,格式为第一位0c是用来确定开头的,第二位是ADCL,第三位是ADCH
现在问题在于无论我怎么调试得到的都是 0C,00,00或者0C,01,00第二位有时候会小幅变化,无论我接gnd还是接3.3都是基本没变化
不提换算后的值,3.3v的电压差竟然没变化这肯定是不正确的,求解我到底哪里有问题?
volatile unsigned char adc_cache_h = 0x00,adc_cache_l = 0x00;
volatile unsigned int adc_vin = 0x0000;

ISR(ADC_vect,ISR_BLOCK)
{
        adc_cache_l = ADCL;
        adc_cache_h = ADCH;
        adc_vin |= ( (adc_cache_l<<2) | (adc_cache_h<<0) );
        usart_0_send_char(0x0c);//固定字节,用于确定开头位置
        usart_0_send_char(adc_cache_l);
        usart_0_send_char(adc_cache_h);
}

int main(void)
{
        usart_0_init();
       
        usart_0_send_char(0x0c);//清屏
       
        sei();//使能全局中断
       
        //adc port init
        DDRA = 0x00;
        PORTA = 0x00;
       
        //adc reg init
        ADMUX |= (1<<REFS0);//avcc,aref电源,其余默认
        ADCSRA |= ( (1<<ADIE) | (1<<ADFR)) ;//adc中断使能,自动转换模式
        ADCSRA |= ( (1<<ADPS0) | (1<<ADPS1) | (1<<ADPS2) );//128分频
        ADCSRA |= ( (1<<ADEN) | (1<<ADSC) );//adc使能且开始转换

        while(1);
}

424778940 发表于 2013-7-19 17:48:29

自顶,字数补丁

longfeix86 发表于 2013-7-19 18:39:23

AVR的书籍很多,随便翻一本都有了啊

424778940 发表于 2013-7-19 21:14:21

longfeix86 发表于 2013-7-19 18:39 static/image/common/back.gif
AVR的书籍很多,随便翻一本都有了啊

= =...翻完了就有我也就不来问了...
我按照手册正确配置了所有寄存器,外部电路也符合规范,但就是得不到正确的结果
页: [1]
查看完整版本: avr adc部分求助 芯片使用的是atmega128a 得不到正确的结果