kramann.info
© Guido Kramann

Login: Passwort:










10.1 Verwendung des Analog/Digital-Wandlers

Nutzen des Beispiels

  • Erfassen eines Sensorsignals und dessen Ausgabe.

Verwendete Befehle und ihre Bedeutung

Befehl Bedeutung
ADCSRA Register zur Konfigurierung des AD-Wandlers
SFIOR Register zur Konfigurierung des AD-Wandlers
ADMUX Auswahl des Pins.
ADCH / ADCL Register auf denen die 10 Bit-Auflösung des AD-Wandlers verteilt ist.

Tabelle 10.1-1: Befehlsübersicht

Beispielprogramm

#include <avr/io.h>

void initADwandler()
{
	        ADCSRA = (1<<ADEN) | (1<<ADSC) | (1<<ADATE) | (0<<ADIF) | (0<<ADIE) | (1<<ADPS2) | (1<<ADPS1) | (0<<ADPS0);

            //ADEN
	        //  1   AD-Wandler eingeschaltet
	        //ADSC
	        //  1   Konvertierung starten
	        //ADATE
	        //  0   Auto-Trigger aus
            //ADIF (Interrupt-Flag)
	        //ADIE
	        //  0   Interrupt ausgeschaltet
	        //ADPS 2 1 0 Vorteilung der Taktrate (sollte zwischen 50..200kHz liegen, also bei 9,216MHz Teilung=92 ~ 128)
	        //ADPS 2 1 0 Vorteilung der Taktrate (sollte zwischen 50..200kHz liegen, also bei 9,216MHz 144kHz Teilung=64)
	        //     0 0 0    2  
	        //     0 0 1    2  
	        //     0 1 0    4  
	        //     0 1 1    8  
	        //     1 0 0   16  
	        //     1 0 1   32  
	        //     1 1 0   64 (ausgewählt)  
	        //     1 1 1  128  

            //Freilaufmode auswählen:
	        SFIOR &= 255 - ((1<<ADTS2) | (1<<ADTS1) | (1<<ADTS0));

//ACHTUNG: verwendete Pins von PORTA als Eingang wählen!
            //AD-Wandler einstellen und aktivieren:
            //PA0,1,2,3 als Eingänge (DDRA=0b11110000)

    
	        //ADMUX = (0<<REFS1) | (0<<REFS0) | (0<<ADLAR) | (0<<MUX4) | (0<<MUX3) | (0<<MUX2) | (1<<MUX1) | (1<<MUX0);
            //REFS1 REFS0 
	        //  0     0     externe Referenzspannung
            //ADLAR
	        //  1           Ergebnis in ADCH und ADCL links ausgerichtet (so kann man leicht die höhren 8 Bits lesen)
            //MUX 4 3 2 1 0
	        //    0 0 0 0 0 ADC0  //hier ausgewählt 
	        //    0 0 0 0 1 ADC1
	        //    0 0 0 1 0 ADC2
	        //    0 0 0 1 1 ADC3  
	        //    0 0 1 0 0 ADC4
	        //    0 0 1 0 1 ADC5
	        //    0 0 1 1 0 ADC6
	        //    0 0 1 1 1 ADC7

            //AD0 / Pin 40 als Eingang wählen
	        ADMUX = (0<<REFS1) | (0<<REFS0) | (1<<ADLAR) | (0<<MUX4) | (0<<MUX3) | (0<<MUX2) | (0<<MUX1) | (0<<MUX0);
}


int main(void)
{
    unsigned char akku,akku2;
    int i,k;
	long int x;

    DDRC = 0b11111111; //PORTC alle Bits als Ausgang
    DDRD = 0b00000000; //PORTD alle Bits als Eingang

    initADwandler();

        while(true)
	{
	        x = 0;
                for(i=0;i<100;i++)
                {
		     akku2 = ADCH; //muss erst ausgelesen werden, damit ADCL verfügbar ist.
		     akku  = ADCL;
                     x+=akku2;		    

		     for(k=0;k<100;k++);
		}
                x/=100;
		PORTC = (unsigned char)x;
	}
	return 0;
}
 

Code 10.1-1: Beispiel

Projekt herunterladen
Übung 4a)
  • Schreiben Sie ein Programm, mit dem Sie über Tastendruck zwischen zwei Entfernungssensoren hin und her schalten können.
  • Schreiben Sie ein Programm, bei dem die Motorgeschwindigkeit über einen Entfernungssensor beeinflußt wird.