ATmega16 ADC代码无法正常工作

时间:2016-12-21 23:02:49

标签: avr adc atmelstudio atmega16

#define F_CPU 1000000UL
#include <avr/io.h>

volatile uint8_t adcvalue;


int main(void)
{
    DDRA =0x00;
    DDRC = 0xff;

// enable adc
    ADCSRA |= (1<<ADEN);
// using division factor 8
    ADCSRA |= (1<<ADPS0) | (1<<ADPS1);

// enable 8 bit conversion
    ADMUX |= (1<<ADLAR);
// take input from PA0
    ADMUX |= (1<<MUX0);

    while (1)
    {
        // Start conversion
        ADCSRA |= (1<<ADSC);

        // wait until conversion is done
        while (ADCSRA & (1<<ADSC));

        // save result to adcvalue
        adcvalue = ADCH;

        // show result on 8 leds connected to PORT C
        PORTC = adcvalue;       
    }
    return 0;
}

以上代码应从PA0(使用电位计)获取模拟值,并在连接到PORT C的8个LED上显示数字值。当我在Proteus上模拟电路时,即使我更改电位计值,LED也会一直亮着一条消息“[AVR AD CONVERTER]参考值= 0”。

感谢您能否帮助我了解错误。

3 个答案:

答案 0 :(得分:2)

// take input from PA0
    ADMUX |= (1<<MUX0);

这是错误的,你用PA1 / ADC1作为输入,而不是PA0 / ADC0

查看第218页的数据表:http://www.atmel.com/images/doc2466.pdf

MUX 4..0 00000是PA0和 00001是PA1

使用

将MUX 4..0的值设置为00001
ADMUX |= (1<<MUX0);

因此使用PA1作为来源。

干杯

答案 1 :(得分:1)

要删除错误消息[AVR AD CONVERTER]Reference Value = 0  从 proteus 您应该删除源代码中的以下两行:

// enable 8 bit conversion
ADMUX |= (1<<ADLAR);
// take input from PA0
ADMUX |= (1<<MUX0);

并添加此行

 ADMUX = 0b01100000;

另外,请务必在AVcc引脚连接5 VOLT Vcc。

diagram

答案 2 :(得分:0)

我现在没有这里的数据表,所以我要写的是一般形式。 在AVR上,一些寄存器共享一些配置。 在您的情况下,ADMUX共享MUX和8位转换。

你的指示:

ADMUX |= (1<<MUX0);

将位MUX0置位为高电平,然后将其写入寄存器中或寄存器上。 这意味着如果MUX1,MUX2,MUXN为高电平,则在命令执行后将它们置为高电平。

安全初始化将是:

ADMUX &= ~(_BV(MUX0)|_BV(MUX1)|_BV(MUXN)
ADMUX |= (1<<MUX0);

寄存器ADMUX通过存储器将所有位设置为0作为第一个ADC引脚。 所以在你的情况下第一条指令:

ADMUX &= ~(_BV(MUX0)|_BV(MUX1)|_BV(MUXN)

是唯一需要的。