Nun zu den Grundlagen der AD-Konvertierung.

Der ATmega8 verfügt über 6 Ports zum Konvertieren analoger Spannungen in entsprechende digitale Werte. ADC0 bis ADC3 arbeiten mit 10Bit Auflösung, ADC4 und ADC5 nur mit 8Bit.
Praktisch bedeuten 10Bit Auflösung, dass der Controller in der Lage ist, einen analogen Wert in 1024 Teilstufen zu zerlegen. Bei einer Spannung von 5V bedeutet dies, dass die am Pin anliegende Spannung auf ca. 5mV genau bestimmt werden kann.
Prinzipiell funktioniert der Wandler nach dem Sample&Hold Prinzip
Die am separat ausgeführten Analog-Spannungs-Pin AVCC anliegende Spannung sollte nicht um mehr als 0,3V von Vcc abweichen. Interne Referenzspannungen von 2,56 bzw. Vcc werden on-chip zur Verfügung gestellt
Zur Rauschunterdrückung wird der Anschluss eines Kondensators an AREF laut Datenblatt empfohlen.

Nun zur Programmierung:

Bei Verwendung der internen Referenzspannungen beziehungsweise Anschluss von AVCC an AREF müssen folgende Bits gesetzt werden: REFSn Bits in ADMUX.

REFS1
REFS0
Auswahl von Vref
0
0
AREF, interne Vref ausgeschaltet
0
1
AVCC mit externer Kapazität an AREF
1
0
Reserviert
1
1
Interne 2,56V Spannung mit Kapazität an AREF

Die Einstellung des Prescalers erfolgt über die ADPSn Bits (ADC Prescaler) in ADCSRA (ADC Control and Status Register A). Über ihn definiert man den Takt des AD-Wandlers. Hier gilt: Je genauer die Messung erfolgen soll, desto geringer sollte der Takt sein (also ein hoher Prescaler). Dem Datenblatt kann entnommen werden, dass eine gute Arbeitsweise des Wandlers bis etwa 200kHz möglich ist. Wählt man den Takt des Wandlers höher, muss man Abstriche bei der Genauigkeit machen. Im Endeffekt definiert soundso immer die Applikation, mit welcher Geschwindigkeit die Wandlung ausgeführt werden muss.

ADPS2
ADPS1
ADPS0
Divisor
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
1
1
1
128

Die Auswahl des Eingabekanals erfolgt mittels der MUX Bits (Analog Channel Selection Bits) in ADMUX (ADC Multiplexer Selection Register). Es gilt zu beachten, dass der ATMega immer nur eine Wandlung zu einem Zeitpunkt durchführen kann. Es ist nicht möglich, an verschiedenen Pins zur selben Zeit die Spannungen zu wandeln.

MUX3…0
Single Ended Input
0000
ADC0
0001
ADC1
0010
ADC2
0011
ADC3
0100
ADC4
0101
ADC5
0110
ADC6
0111
ADC7

Die Aktivierung des AD-Wandlers erfolgt durch setzen von ADEN (ADC Enable) in ADCSRA. In ADCH und ADCL steht dann das Ergebnis der Konvertierung und ADIF (ADC Interrupt Flag) wird gesetzt.
Normalerweise ist das Ergebnis rechtsbündig dargestellt, eine linksbündige Darstellung erfolgt nur, wenn ADLAR (ADC Left Adjust Result) in ADMUX gesetzt ist.

Starten einer Konvertierung:

Das Auslösen einer Konvertierung erfolgt durch das Schreiben einer '1' in ADSC (ADC Start Conversion Bit). Nach Abschluss der Konvertierung wird dieses Bit automatisch zurückgesetzt.
Für eine Dauerkonvertierung (free running mode) muss ADFR (ADC Free Running) in ADCSRA gesetzt werden. Der Start erfolgt analog zu einer Einzelkonvertierung durch setzen von ADSC in ADCSRA.
Im Normalfall erfordert die Konvertierung eine Frequenz von 50kHz bis 200kHz. Diese wird über den bereits oben erklärten Prescaler eingestellt.
Eine Änderung des Kanals bzw. der Referenzspannung ist während einer laufenden Konvertierung nicht möglich. Dies ist nur möglich, wenn:
a.) ADFR und ADEN gelöscht sind
b.) während Konvertierung, einen Takt nach Trigger-Event
c.) während Konvertierung, bevor Interrupt Flag gelöscht wird

Im Single Mode sollte man vor Beginn der Konvertierung Änderungen vornehmen oder direkt nach Abschluss einer Konvertierung. Selbiges gilt für den Running Mode.

Ist die Konvertierung abgeschlossen, kann man den erhaltenen Wert aus ADC übernehmen. Der erhaltene Wert ergibt sich nach der folgenden Formel:

Diese Formel gilt nur für den Single-Mode bei 10 Bit.

Interrupts:

Der ADC stellt einen eigenen Interrupt zur Verfügung. Um ihn zu Verwenden muss das ADIE-Bit (ADC Interrupt Enable) in ADCSRA gesetzt werden. Er wird ausgelöst, sobald eine Konvertierung analog -> digital abgeschlossen ist, d.h. das ADIF-Flag in ADCSRA gesetzt wird. Dieses wird bei Aufruf einer ISR hardwaremäßig wieder gelöscht.

 

Eine Anwendung der oben genannten Fakten kann man sich unter der Rubrik Programme ansehen.

 

Zurück zur Startseite.