2013-10-22 31 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的不同實現,請確保您的字節順序和位順序是正確的。