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.