ricola
08.02.2008, 12: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
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