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:
Code: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; }
Lesezeichen