2013-10-22 33 views
2

我试图在纯C中使用Arduio Uno,因为我无法将Arduino IDE用于我的高级设计项目。在某种程度上,我成功地使串行通信正常工作,数字输出/输入和模拟输入。我正在阅读模拟输入,但其中大部分都是20,000+,这是很高的。这应该是一个10位的ADC,而我只是试图使用8位。为什么我的结果读100X是最高的呢?ADC在arduino中C

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(读,缓冲液,10);”使其成为可打印的价值。当我直接打印阅读时,它会向终端打印垃圾。 (炭缓冲液[100];是缓冲器是什么)

的乌诺使用一个ATMEGA328P: www.atmel.com/Images/doc8161.pdf

感谢您的帮助。

+0

尝试屏蔽到10位,即'value&0x3FF';前6位可能不会被初始化为零。然后您可以通过将模拟引脚接地来检查输入是否如预期的那样。 – Polynomial

+0

太棒了!就是这样。非常感谢!想让这个答案得到一票吗? –

+0

很高兴帮助:) – Polynomial

回答

1

ADC的最高位是不是零初始化,所以你需要手动掩盖他们去

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

然后,您可以验证这是否是正确的通过捆绑你的模拟引脚连接到地面和VREF分别检查结果值是否符合预期。

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