Problem mit dem ADC beim ATMega32
	
	
		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;
        }