2

我正在尝试在纯 C 中使用 Arduio Uno,因为我无法将 Arduino IDE 用于我的高级设计项目。在某种程度上,我已经成功地让串行通信、数字输出/输入和模拟输入正常工作。我正在读取模拟输入的读数,但其中大多数是 20,000+,这太高了。这应该是一个 10 位的 ADC,而我只尝试使用 8 位。为什么我的读取结果是最高值的 100 倍?

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‎</p>

谢谢你的帮助。

4

1 回答 1

1

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

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

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

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

于 2013-10-22T15:22:35.213 回答