DarkFire
25.04.2006, 19:01
Hallo,
ich habe heute versucht mit dem eingebauten ADC im ATMEGA32 ein analoges Spannungssignal zu messen. Bzw. wenn man es genau nimmt, messe ich 4 Signale hintereinander.
Für eine Messung nehme ich den Mittelwert aus 4 Messungen.
Das eigentliche Problem liegt darin, das ich den ersten Wert mit der internen Spannung von 2,56V (bei mir 2,37V) messe, die anderen mit der Versorgungsspannung als Referenzspg.
Nun bekomme ich für den ersten Wert bei der ersten Messung den richtigen Wert, bei den darauffolgenden Messungen aber einen falschen Messwert (ca. halb so groß, bzw. genau der Faktor 5/2,37).
Ich habe nachgemessen, und bei den darauffolgenden Messungen liegen am AREF pin die 5V Versorgungsspg an.
Mache ich bei der Messung irgendetwas falsch?
Hier mein Quellcode:
uint16_t Messung (int Messkanal) {
uint16_t result = 0;
uint8_t m = 0;
ADCSRA = (1<<ADEN) | (1<<ADPS1) | (1<<ADPS2) | (1<<ADPS0); //Initialiserung ADC, Frequenzteiler: 128
ADMUX = Messkanal; //Zu verwendender Pin
if (Messkanal == 0x01) ADMUX |= (1<<REFS1) | (1<<REFS0); //interne Referenzspg.
else ADMUX |= (1<<REFS0); //Versorgungsspg.
//Dummy-Messung
ADCSRA |= (1<<ADSC); // eine ADC-Wandlung
while(!(ADCSRA & (1<<ADIF)));
ADCSRA |= (1<<ADIF); // ADIF löschen
// Eigentliche Messung - Mittelwert aus 4 aufeinanderfolgenden Wandlungen
for(m=0;m<4;m++)
{
ADCSRA |= (1<<ADSC); // eine Wandlung "single conversion"
while(!(ADCSRA & (1<<ADIF)));
result += ADC; ADCSRA |= (1<<ADIF); //ADIF löschen
}
ADCSRA &= ~(1<<ADEN); // ADC deaktivieren (2)
result /= 4; // Summe durch vier teilen = arithm. Mittelwert
ADMUX = 0x00; // ADMUX löschen
return result;
}
ich habe heute versucht mit dem eingebauten ADC im ATMEGA32 ein analoges Spannungssignal zu messen. Bzw. wenn man es genau nimmt, messe ich 4 Signale hintereinander.
Für eine Messung nehme ich den Mittelwert aus 4 Messungen.
Das eigentliche Problem liegt darin, das ich den ersten Wert mit der internen Spannung von 2,56V (bei mir 2,37V) messe, die anderen mit der Versorgungsspannung als Referenzspg.
Nun bekomme ich für den ersten Wert bei der ersten Messung den richtigen Wert, bei den darauffolgenden Messungen aber einen falschen Messwert (ca. halb so groß, bzw. genau der Faktor 5/2,37).
Ich habe nachgemessen, und bei den darauffolgenden Messungen liegen am AREF pin die 5V Versorgungsspg an.
Mache ich bei der Messung irgendetwas falsch?
Hier mein Quellcode:
uint16_t Messung (int Messkanal) {
uint16_t result = 0;
uint8_t m = 0;
ADCSRA = (1<<ADEN) | (1<<ADPS1) | (1<<ADPS2) | (1<<ADPS0); //Initialiserung ADC, Frequenzteiler: 128
ADMUX = Messkanal; //Zu verwendender Pin
if (Messkanal == 0x01) ADMUX |= (1<<REFS1) | (1<<REFS0); //interne Referenzspg.
else ADMUX |= (1<<REFS0); //Versorgungsspg.
//Dummy-Messung
ADCSRA |= (1<<ADSC); // eine ADC-Wandlung
while(!(ADCSRA & (1<<ADIF)));
ADCSRA |= (1<<ADIF); // ADIF löschen
// Eigentliche Messung - Mittelwert aus 4 aufeinanderfolgenden Wandlungen
for(m=0;m<4;m++)
{
ADCSRA |= (1<<ADSC); // eine Wandlung "single conversion"
while(!(ADCSRA & (1<<ADIF)));
result += ADC; ADCSRA |= (1<<ADIF); //ADIF löschen
}
ADCSRA &= ~(1<<ADEN); // ADC deaktivieren (2)
result /= 4; // Summe durch vier teilen = arithm. Mittelwert
ADMUX = 0x00; // ADMUX löschen
return result;
}