AD-omvandlaren

Tillbaka till startsidan

ATmega328/P har en tio bitars AD-omvandlare. Man kan välja att mäta spänningen från sex av kretsens pinnar, eller från en inbyggd temperatursensor.

För att pröva AD-omvandlaren behöver man koppla in en potentiometer.

AD-omvandlarens inställningar

AD-omvandlaren behöver klockpulser med en frekvens mellan 50 kHz och 200 kHz, ju högre frekvens desto snabbare omvandling, men med ett mindre noggrannt resultat.
Processorns klocka  fCPU  delas ned med en prescaler (1/2 1/4 1/4 1/16 1/32 1/64 1/128) till en lämplig frekvens  fADC. Registret  ADCSRA  och bitarna  ADPS2   ADPS1   ADPS0  används till detta. Med 16 MHz klockfrekvens blir  fCPU/128 = 125 kHz.

ADCSRA |= (1 << ADPS2) | (1 << ADPS1) | (1 << ADPS0);  // 16MHz/128 = 125KHz

Samma register  ADCSRA  och biten  ADEN  slår på matningen till AD-omvandlaren.

ADCSRA |= (1 << ADEN) ;  // Enable AD converter

AD-omvandlaren kan användas med olika referensspänningar. Detta ställs in med registret  ADMUX  och bitparet  REFS1   REFS0. Kombinationen 01 använder AVCC (som då ska vara ansluten till +5V).

ADMUX |= (1 << REFS0) ;  // Set reference voltage to AVCC

Samma register  ADMUX  och bitarna  ADMUX3   ADMUX2   ADMUX1   ADMUX0  används för att välja källa, vilken pinne som ska kopplas in till AD-omvandlaren. Väljer man kanal 0, "0000", så är detta default och för detta val behöver inget ställas in.

Det kan vara bra att stänga av den "digitala delen" av den valda pinnen eftersom den annars kommer att dra onödig hög ström om den analoga spänningen skulle komma att ligga mitt mellan värdena för digitalt 0 och 1.

DIDR0 |= (1 << ADC0D);   // Turn off digital buffer at this AD pin

Det AD-omvandlade värdet är 10 bitar. Det rymms inte i en 8 bitars variabel (en char) utan behöver en 16 bitars variabel (en int). Resultatet hamnar i två 8 bits register  ADCH  och  ADCL. De 10 bitarna kan läsas direkt som  ADC. Biten  ADLAR  i  ADMUX-registret styr om bitarna fördelas som 2+8 bitar (defaultvärdet), eller 8+2.

Starta en AD-omvandling

Man startar AD-omvandlingen genom att skriva '1' till biten  ADSC  i registret  ADCSRA. Den biten förblir sedan '1' så länge som AD-omvandlingen pågår.

ADCSRA |= (1 << ADSC);         // start AD conversion

while(ADCSRA & (1 << ADSC)){}  // wait for ADSC become ’0' again

Det fullständiga programmet finns här:


Tillbaka till startsidan

 


William Sandqvist    willsandqvist@gmail.com