ADC上的arduino中的ADC

时间:2013-10-22 15:10:21

标签: c arduino adc

我正在尝试在纯C中使用Arduio Uno,因为我不能将Arduino IDE用于我的高级设计项目。我在一定程度上成功地使串行通信工作,数字输出/输入和模拟输入。我正在读取模拟输入,但大多数是20,000+,这是很高的方式。这应该是一个10位ADC,我只是试图使用8位。为什么我的结果读取100X所谓的最高值?

void init_aio(){
      DIDR0 = 0x00;           //Digital input disabled on all ADC ports
      PRR &= ~(1<<PRADC);     //ADC turned on
      ADMUX = 0x60;           //AVcc, right adjusted, ADC0 pin
      ADCSRA = 0xcF;          //ADC Enabled, no auto trigger, Iterrupt enabled, 128 prescaller
}

int read_analog(){
    reading = APin0;
    ADCSRA |= 1<<ADSC; //conversion start
    reading = abs(reading);
    return reading;
}

我唯一能想到的是我正在使用“int reading_str = itoa(reading,buffer,10);”使其成为可打印的价值。当我直接打印读数时,它会向终端打印垃圾。 (char buffer [100];是什么缓冲区)

Uno使用Atmega328P: www.atmel.com/Images/doc8161.pdf

感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

ADC的高位不是零初始化,因此您需要手动屏蔽它们:

reading &= 0x3FF; // binary 0000001111111111, i.e. ten bits for ADC

然后,您可以通过将模拟引脚分别接地和Vref来验证这是否正确,并检查结果值是否符合预期。

如果其他人遇到同样的问题,使用不同的读取ADC实现,请确保您的字节顺序和位排序正确。