AVR: ADC einfach auslesen
// ADC STUFF
uint16_t ReadChannel(uint8_t mux)
{
uint8_t i;
uint16_t result;
ADMUX = mux; // Kanal waehlen
ADMUX |= (0<<REFS1) | (1<<REFS0); // interne Referenzspannung nutzen
ADCSRA = (1<<ADEN) | (1<<ADPS1)| (1<<ADPS2) | (0<<ADPS0); // Frequenzvorteiler
// setzen auf 8 (1) und ADC aktivieren (1)
/* nach Aktivieren des ADC wird ein “Dummy-Readout” empfohlen, man liest
also einen Wert und verwirft diesen, um den ADC “warmlaufen zu lassen” */
ADCSRA |= (1<<ADSC); // eine ADC-Wandlung
while ( ADCSRA & (1<<ADSC) ) {
; // auf Abschluss der Konvertierung warten
}
result = ADCW; // ADCW muss einmal gelesen werden,
// sonst wird Ergebnis der nächsten Wandlung
// nicht übernommen.
/* Eigentliche Messung – Mittelwert aus 4 aufeinanderfolgenden Wandlungen */
result = 0;
for( i=4; i>=1; i– )
{
ADCSRA |= (1<<ADSC); // eine Wandlung “single conversion”
while ( ADCSRA & (1<<ADSC) ) {
; // auf Abschluss der Konvertierung warten
}
result += ADCW; // Wandlungsergebnisse aufaddieren
//if (ADCW <= 350){lo++;lo1+=ADCW;}else{hi++;hi1+=ADCW;}
}
ADCSRA &= ~(1<<ADEN); // ADC deaktivieren (2)
// if (lo>=hi){lo1/=lo; result=hi1;} else {hi1/=hi;result=hi1;}
result /= 4; // Summe durch vier teilen = arithm. Mittelwert
// mux==5?uart_puts(“5: “):uart_puts(“7: “);
// Ausgabe an UART
// if (debug==1)
/* uart_puts(itoa((1024-result),h,10));
uart_puts(“\n\r”);
*/
return result;
}