ADC Messung in C programmieren
Einzelmessung und Mehrfachmessung mit Mittelwert
// ADC initialisieren
void ADC_Init(void)
{
unsigned int result;
*********************************************************************************
*********************************************************************************
ADMUX = (0<<REFS1) | (1<<REFS0); // AVcc als Referenz benutzen
// Teiler 128 da wir genau messen möchten
ADCSRA = (1<<ADPS2) | (1<<ADPS1) | (1<<ADPS0); // Frequenzvorteiler 128
ADCSRA |= (1<<ADEN); // ADC aktivieren
ADCSRA |= (1<<ADSC); // Single ADC-Wandlung start
while (ADCSRA & (1<<ADSC)); // auf Abschluss der Konvertierung warten
// ADCW muss einmal gelesen werden, sonst wird Ergebnis der nächsten Wandlung nicht übernommen.
result = ADCW;
}
// ADC Einzelmessung
unsigned int ADC_Read(unsigned char channel)
{
// Kanal waehlen, ohne andere Bits zu beeinflußen
ADMUX = (ADMUX & ~(0x1F)) | (channel & 0x1F);
ADCSRA |= (1<<ADSC); // eine Wandlung “single conversion”
while (ADCSRA & (1<<ADSC)) // auf Abschluss der Konvertierung warten
//return ADCW; // ADC auslesen und zurückgeben
return ADCL + (ADCH<<8);
}
// ADC Mehrfachmessung mit Mittelwertbbildung 50ms!
unsigned int ADC_Read_Avg(unsigned char channel, unsigned char average)
{
unsigned long result = 0;
for (unsigned char i = 0; i < average; ++i)
{
result += ADC_Read(channel);
_delay_ms(50);
}
return (unsigned int)(result / average);
}
*********************************************************************************
*********************************************************************************