AD-omvandlaren
ATmega328P.pdf ( Register summary on p 428 )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-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.
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:
ad.txt
(for Arduino use code stored as: ad\ad.ino)
William Sandqvist willsandqvist@gmail.com