Hier noch zwei Funktionen...
Gehd bei ATMEGA8535, 32, 128.... und andere wo die Register passen.
Macht X Dummy-Messungen, dann aus x Messungen den Mittelwert
Code:void ADC_init(void) { ADCSRA = (1<<ADEN) | (1<<ADPS2) | (1<<ADPS1); } uint16_t ADC_wert(uint8_t mux) { uint8_t i; uint8_t ii; uint16_t result; uint16_t ergebnis; ergebnis = 0; // +------------ Dummy-Check ------------+ i = 5; // i x Dummy-Check while(i){ ADMUX = mux; // Kanal waehlen ADCSRA |= (1<<ADSC); // eine Wandlung "single conversion" while(!(ADCSRA & (1<<ADIF))); // auf Abschluss der Konvertierung warten (ADIF-bit) result = ADCL + (ADCH << 8); // Wandlungsergebnisse erfassen result = 0; // Zurücksetzen i--; } // +------------- Ermittlung ------------+ i = 8; ii = i; // Schnitt aus i Ergebnissen while(i){ ADMUX = mux; // Kanal waehlen ADCSRA |= (1<<ADSC); // eine Wandlung "single conversion" while(!(ADCSRA & (1<<ADIF))); // auf Abschluss der Konvertierung warten (ADIF-bit) result = ADCL + (ADCH << 8); // Wandlungsergebnisse erfassen ergebnis = ergebnis + result; // Aufaddieren i--; } // +-------- Umrechnung & Ausgabe -------+ ergebnis = ergebnis / ii ; return ergebnis; }







Zitieren

Lesezeichen