PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : "Bandbreite" der AD-Konvertierung sehr gering und



ricola
08.02.2008, 11:35
Hallo,

ich habe an meinem ATMega169 der mit 5V betrieben wird ein
Analogeingang der zwischen 3 und 5 Volt schwankt. Diesen will
ich messen. Mit meinem Code unten schwanken die 16bit Werte
aber immer nur sehr wenig im gesamten Messbereich, so dass
die Auswertung nur sehr ungenau wird. Außerdem werden die
16bit Werte größer, wenn die Spannung kleiner wird, das verstehe
ich auch nicht.

Wenn ich den Teiler von 64 auf 32 stelle ändert das komischwerweise
auch nichts...



uint16_t readADC(uint8_t channel) {
uint16_t result = 0;

// init ADC, set to 64
ADCSRA = (1<<ADEN) | (1<<ADPS2) | (1<<ADPS1);

// channel of the multiplexer
ADMUX = channel;

// external referencevoltage (AVCC 5.0 V)
ADMUX &= ~(1<<REFS1);
ADMUX |= (1<<REFS0);

// open ADC
ADCSRA |= (1<<ADSC);

// dummy readout
while(ADCSRA & (1<<ADSC));

// convert analog value
ADCSRA |= (1<<ADSC);

// wait for result
while(ADCSRA & (1<<ADSC));

// read value
result = ADCW;

// ADC close
ADCSRA &= ~(1<<ADEN);

return result;
}



DANKE für Hilfe!

Gruß
RICOLA

ogni42
08.02.2008, 11:47
AVCC entkoppelt (LC-Glied, s. Datenblatt)? Steht genug Strom für die Referenz zur Verfügung (die hat eine Impedanz von 32kOhm)?

Ist der VRef pin mit 100n nach GND gelegt (s. Datenblatt)?

Musst Du "ADCClose" durchführen? Wie verhält sich die Messung (mehrere hintereinander), wenn Du den ADC enabled lässt?

sloti
09.02.2008, 10:53
Hi,

hast du beim ATMega169 nicht auch zwei Register für das Ergebniss? Beim Atmega8 muss man das so schreiben:


result = ADCL + (ADCH << 8);

wobei ADCL und ADCH dei beiden Ergebnis register sind.

mfg
Erik

Hubert.G
09.02.2008, 15:28
Nein, muss man nicht, es funktioniert ein result = ADC; Der Compiler macht das richtig, auch in der richtigen Reihenfolge.

sloti
09.02.2008, 19:42
Nagut man lernt halt immer noch dazu...