AD-Wandler - Analoge Digitaltechnik
Materialbedarf
Anz. | Bezeichnung | Datenblatt |
1 | Batterie/Spannungsquelle 9V | |
1 | Spannungsregler 7805 | |
1 | ATMega8 AVR-Prozessor | |
2 | Widerstand 220 Ohm | |
1 | Widerstand 10 kOhm | |
1 | Elektrolytkondensator 100 µF/16V | |
1 | Kondensator 100nF | |
1 | Trimmpotentiometer 10 kOhm | |
2 | Standard-Leuchtdiode 3mm oder 5mm | 3mm, 5mm |
Funktionsweise eines AD-Wandlers
Jeder Mikrokontroller arbeitet bekanntermaßen mit digitalen Signalen. Für einfache Steuerungen reicht dies in der Regel auch aus. Aber es gibt immer wieder Situationen, da muss der Controller analoge Messwerte, wie Temperatur, Lichtstärke etc. verarbeiten können. Zu diesem Zweck gibt es Analog-Digital-Wandler, oder kurz AD-Wandler. Hier wird eine angelegte Spannung in ein, für den Controller verwertbaren Wert, umgewandelt.
Um dies zu erreichen, gibt es verschiedene Verfahren. 3 Algorithmen möchte ich kurz erläutern. Als erstes soll das Parallelverfahren vorgestellt werden. Hier wird eine geringe Anzahl von Referenzspannungen erzeugt die dann z.B. mit Hilfe von Operationsverstärkern mit der Eingangsspannung verglichen werden. Der OP, bei dem die Spannungen überein stimmen, 'meldet' sich und man hat den groben Eingangswert in digitaler Form. Diese Wandlermöglichkeit kann man dort einsetzen, wo es nur sehr wenige Werte gibt, wie z.B. bei einer Heizungssteuerung, wo es nur 2 Analogwerte zu überprüfen gilt. Nur Temperatur für Heizung an und Temperatur für Heizung aus.
Als zweites sei das Annäherungsverfahren genannt. Hier wird neben dem Spannungseingang noch ein Digital-Analog-Wandler eingesetzt. Hier erfolgt die Wandlung in mehreren Schritten. Als erster Schritt wird der DA-Wandler auf die Hälfte der Referenzspannung gesetzt. Nun wird diese Spannung mit der Eingangsspannung verglichen. Ist die Eingangsspannung größer als die DA-Spannung, wird der DA-Wandler auf die Hälfte des oberen Bereichs gesetzt und wieder verglichen. Usw. Das Ganze wird so lange wiederholt, bis die maximale Auflösung des Wandlers erreicht ist. Je höher hier die Wandler-Auflösung, desto länger dauert auch die Wandlung.
Am längsten braucht aber unter Umständen, die dritte Wandlerart. Hier wird das Zählverfahren eingesetzt. Bei diesem Algorithmus nimmt man die kleinste Einheit der Referenzspannung. Diese wird mit der Eingangsspannung verglichen, sind die Werte unterschiedlich, wird die Testspannung um die kleinste Einheit erhöht und wieder verglichen. Dies geht so weiter bis die Testspannung und die Eingangsspannung überein stimmen. Jeder kann sich vorstellen, wie viele Schritte notwendig sind, wenn ein Eingangswert mit einer Auflösung von 10 Bit (=1024 Schritte) umgewandelt werden soll.
Der ATMega8 verfügt von 'Haus aus' einen AD-Wandler mit einer Auflösung von 10 Bit. Diesem Wandler ist ein Multiplexer mit 6 Eingängen vorgeschaltet. Zu finden sind diese Eingänge am Port C (ADC0-ADC5). Dieser muss im vor der Verwendung aber erst aktiviert werden. Ansonsten arbeitet der Port C als digitaler Ein-/Ausgangsport.
Wir wandeln eine Spannung
Damit
wir den AD-Wandler des ATMega8 testen können, bauen wir die
nebenstehende Schaltung auf. Den Eingang 0 des ADCs wird mit einem
Potentiometer verbunden. Die Ausgänge 0-3 des Port B werden mit LEDs verbunden. Um die grobe Funktion des internen AD-Wandlers des AVR zu testen, benötigen wir noch ein Programm: |
$regfile "m8def.dat" $crystal = 1000000 Dim Ad As Word Config Portb = Output Config Adc = Single , Prescaler = Auto , Reference = Avcc Start Adc Do Ad = Getadc(0) If Ad <= 340 Then Portb.0 = 1 : Portb.1 = 0 : Portb.2 = 0 Elseif Ad > 340 And Ad <= 680 Then Portb.0 = 0 : Portb.1 = 1 : Portb.2 = 0 Elseif Ad > 680 Then Portb.0 = 0 : Portb.1 = 0 : Portb.2 = 1 End If Loop |
Wird nun die Schaltung gestartet, leuchtet einer der 3 Leuchtdioden D1 bis D3 auf. Drehen wir jetzt am Potentiometer schalten irgendwann die LEDs um. Um dies näher zu verstehen, schauen wir uns das Programm einmal an. Neben den uns bekannten Zeilen finden wir als erstes die Config-Anweisung:
Config Adc = Single , Prescaler = Auto , Reference = Avcc |
Mit dem Part 'Adc=Single' sagen wir dem Controller, dass wir hier nur einen AD-Wandler verwenden möchten. Da der ATMega8 auch nur einen besitzt, ist dies die einzig mögliche Einstellung.
'Prescaler=Auto' ist ziemlich wichtig. Da der Wandler auch eine Taktfrequenz benötigt, aber diese Frequenz nicht so hoch sein darf, wie die Taktfrequenz, wird die Taktfrequenz geteilt. Mit der Angabe von 'Auto' berechnet Bascom aus der angegeben Quarzfrequenz den nötigen Teilerwert. Wie hoch der Wandlertakt sein darf, kann man bei Bedarf im Datenblatt nachlesen.
Wir wollen dem AD-Eingang Spannungen von 0-5V anlegen können, dafür geben wir noch die Anweisung 'Reference=Avcc' hinzu. Damit legen wir fest, dass die Spannung an AVcc, in unserem Fall die Betriebsspannung, als Referenz dienen soll.
Jetzt ist der interne AD-Wandler eingestellt. Ist aber noch nicht aktiv. Dass heißt, die interne Wandlerelektronik ist noch abgeschaltet und der Wandlertakt wird auch noch nicht erzeugt. Dafür benötigen wir die nächste interessante Anweisung:
Start Adc |
Nun läuft der AD-Wandler. Jetzt können wir die einzelnen Eingänge abfragen. Da wir hier nur den Eingang 0 verwenden, wird dieser auch nur abgefragt. Dafür dient der folgende Befehl:
Ad = Getadc(0) |
Da wir das Ergebnis der Wandlung später mehrfach verwenden wollen, speichern wir das Ergebnis in einer Variablen, die wir weiter oben mit 'Dim Ad as Word' definiert haben. Nach Ausführung dieser Anweisung steht uns in Ad ein Wert zwischen 0 und 1023, je nach aktueller Eingangsspannung zur Verfügung. Diesen Wert müssen wir jetzt noch auswerten, welches mit folgenden Anweisungen passiert:
If Ad <= 340 Then Portb.0 = 1 : Portb.1 = 0 : Portb.2 = 0 Elseif Ad > 340 And Ad <= 680 Then Portb.0 = 0 : Portb.1 = 1 : Portb.2 = 0 Elseif Ad > 680 Then Portb.0 = 0 : Portb.1 = 0 : Portb.2 = 1 End If |
Hier wird nun in mehreren Schritten der aktuelle Wert abgefragt. Mit der ersten Anweisung 'If Ad<340 Then' prüfen wir, ob der Wandlerwert einen Wert zwischen 0 und 340 besitzt. Trifft dies zu, wird die LED an Port B.0 eingeschaltet. Die anderen Leuchtdioden hingegen abgeschaltet.
Ist die Bedingung nicht erfüllt, wird getestet ob der Wert zwischen 341 und 680 liegt. Wenn ja, schalten wir die 2. LED ein. Und bei der dritten Prüfung testen wir dann noch, ob der AD-Wert größer als 680, als bis 1023 ist. Dann wird entsprechend die D3 aktiviert.
Die AD-Abfrage und die Wert-Prüfung sind in einer Endlosschleife mit Do/Loop eingefasst, so dass dieser Vorgang unendlich oft wiederholt wird.