Unterrichts- und Lernmaterial für Mikrocontroller
Unterrichts- und Lernmaterial fürMikrocontroller

1 - Der IC Baustein ADC0831

Der ADC0831 ist ein 8-bit Analog-Digital-Wandler (A/D Wandler) mit synchroner serieller Ausgabe.

  • Ein A/D Wandler wandelt einen analogen Spannungswert in eine entsprechende binäre Zahl um.
  • 8-Bit beschreibt die Anzahl binärer Stellen, die der ADC0831 zur Beschreibung eines analogen Spannungswertes benutzt. Mit 8-Bit bezeichnet man in diesem Fall auch die Auflösung eines A/D Wandlers. Mit 8-Bit lassen sich im binären Zahlsystem die natürlichen Zahlen von 0 bis 255 darstellen (Grundlagen - Signale richtig verstehen - Zahlensysteme). Das bedeutet, dass der ADC0831 einen analogen Spannungswert zwischen 0 und 5 Volt in  256 gleichgroße Stufen aufteilen kann. Jeder Stufe entspricht dann einem Spannungsbereich von 0,0195 Volt oder 19,5 mV. Entsprechend würde ein 12-Bit A/D Wandler einen Bereich von 0 bis 5 Volt in 4096 gleichgroße Stufen aufteilen mit einer Auflösung von 1,22 mV.
  • Synchron und seriell bedeutet hier, dass die BASIC Stamp mit Hilfe eines CLK-Signals (Taktgeber) die serielle Ausgabe der Bits steuert.

Die BASIC Stamp wird so programmiert, dass sie die 8-Bit des ADC0831 seriell ausliest und in einer Variablen ablegt. Zusätzlich wird der binäre Wert anschließend in einen entsprechenden Dezimalwert umgerechnet. Dieser Dezimalwert wird dann in einen entsprechenden Spannungswert umgerechnet und im Debug Terminal angezeigt. Zusätzlich muss die BASIC Stamp Steuersignale an den ADC0831 übertragen, damit er seine Aufgaben erfüllen kann.

Abbildung 1 zeigt die Pinbelegung des ADC0831. Die Zahlen geben die Pinnummer an und die Bezeichner beschreiben die Funktion des jeweiligen Pin.

Binäre Steuersignale

Darunter sind HIGH und LOW Signale zu verstehen, mit denen einem Baustein vermittelt wird, was und wann er etwas zu tun hat. Ein ADC0831 benötigt zum Beispiel ein Steuersignal, mit dem er aktiviert wird und ein CLK-Signal, mit dem die Übertragung der einzelnen Ausgabebits synchronisiert wird.

Abbildung 1 - ADC0831 Schaltsymbol und Pinbelegung

Die Bedeutung der Anschlussbelegungen im Einzelnen

Vin(+)           analoger Eingang

D0               serieller Ausgang

Vref, Vin(-)     Referenzspannung

Vcc, Vdd         Pluspol der Spannungsversorgung

GND, Vss         Minuspol der Spannungsversorgung

/CS              active low Chip Select

CLK              Takteingang

Um den ADC0831 auf eine Messung vorzubereiten, muss

  1. an seinen Eingang /CS ein HIGH-LOW Signal gelegt werden. Das Signal muss für die Dauer der Umwandlung auf LOW bleiben.
  2. Anschließend muss am CLK-Eingang ein einzelner Spannungspuls folgen; er signalisiert, dass die Umwandlung mit dem nachfolgenden Takt beginnt. Bei diesem IC besteht ein Takt aus einer Folge LOW-HIGH-LOW.
  3. Weitere 8 Takte sind nötig, um die Umwandlung abzuschließen. Jedes mal, wenn der CLK-Eingang einen Takt erhält, wird ein weiteres Bit seriell an den Ausgang D0 übertragen.

Diese Informationen holt man sich aus den Datenblättern, die es zu jedem IC und von jedem Hersteller im Internet gibt.

2 - Ein einfaches Digitalvoltmeter (DVM) - Teil 1

Der Schaltungsaufbau

Abbildung 2 - Schaltskizze mit ADC0831
Ein einfaches Voltmeter - Teil 1
Material

1x  Board of Education (BoE) mit BASIC Stamp (Fa. Parallax Inc.)

1x  IC  ADC0831

1x  Potenziometer - 100kOhm

9x  Steckdraht

Aufgaben
  • Baue die Schaltung nach der Schaltskizze (Abb. 2) auf dem Steckbrett des BoE auf.
  • Übertrage das Programm ADWandler_1.bs2 in den Editor und speichere es ab.
  • Starte das Programm.

Das Programm ADWandler_1.bs2

Der über den Mittelabgriff des Potenziometers eingestellte Spannungswert wird als 8-Bit Binärzahl im Debug Terminal angezeigt.

Die Terminalanzeige

Jede Drehbewegung am Potenziometer verändert die Anzeige im Terminal. Sollte das Programm auf das Potenziometer nicht reagieren, überprüfe sowohl die Verkabelung des Schaltungsaufbaus als auch das Programm auf Fehler.

Wie arbeitet das Programm?

Beginnen wir mit dem Deklarationsteil. Im vorliegenden Programm wird nur die Variable adcBits benutzt. Die anderen Variablen werden in einem späteren Programm benötigt.

Im Initialisierungsteil wird über die PIN-Direktive den einzelnen Pinanschlüssen ein Name zugeordnet. Das macht die Lesbarkeit des Programms übersichtlicher und da die Namen mit den Anschlussbezeichnern in der Darstellung der Pinbelegung übereinstimmen (Abb. 1) auch leichter.

Die drei GOSUB-Befehle im Abschnitt Hauptprogramm sind in eine Endlosschleife eingebettet und rufen nacheinander drei verschiedene Unterprogramm auf, die im Abschnitt Unterprogramme spezifiziert sind.

Unterprogramme werden in PBASIC immer über ein Label aufgerufen. Das Programm verzweigt zu diesem Label, arbeitet dort alle Befehle ab, kehrt mit dem RETURN-Befehl zum Hauptprogramm zurück und setzt seine Arbeit mit dem Befehl fort, der auf den GOSUB-Befehl folgt.

Abbildung 3 - Ablauffolge bei Aufruf eines Unterprogramms in PBASIC

Von besonderer Bedeutung ist das Unterprogramm adc_data. Über es wird praktisch die Initialisierung des ADC0831 und die Datenübertragung gesteuert.

 

Unterprogramm adc_data

An den /CS Eingang (D0 in Abb. 4) des ADC0831 wird ein HIGH-LOW Signal gelegt.

An den Eingang CLK (D1 in Abb. 4) wird ein LOW-Signal gelegt und anschließend über PULSOUT ein HIGH-LOW-Signal mit einer Pulslänge von 420µs.

Mit SHIFTIN werden 8 Datenbits (D2 in Abb. 4) über den seriellen Ausgang D0 des ADC-Bausteins an die BASIC Stamp übertragen.

Dies sind die drei o. g. Schritte zur Vorbereitung des ADC0832 auf eine Messung; umgesetzt in der Sprache PBASIC. Das Zeitdiagramm für die drei Pinbelegungen P0 (/CS), P1 (CLK) und P2 (DATA) zeigt Abb. 4.

Abbildung 4 - Debug Terminal Ausgabe und Zeitdiagramm für P0, P1 und P2

Als Übertragungsmodus ist bei SHIFTIN die Option MSBPOST gewählt; damit werden die vom ADC0831 bereitgestellten Datenbits mit der fallenden Flanke des Taktgebers und mit dem MSB (most significant bit) beginnend übertragen.

 

Gut zu sehen sind im Zeitdiagramm die vom Befehl SHIFTIN ausgelösten 8 Taktimpulse, die dazu führen, dass die vom ADC0831 eingelesenen Daten an P2 der BASIC Stamp übertragen und im Speicher adcBits abgelegt werden. Die im Debug Terminal dargestellte Binärzahl 10011011 ist mit dem Impulsdiagramm identisch.

 

Unterprogramm calc_volt

Hat hier noch keine Bedeutung.

 

Unterprogramm display

Die beiden Programmzeilen sind selbst erklärend.

 

Ergänzt man im Programm ADWandler_1.bs2 im Unterprogramm display die Zeile

  • DEBUG CR, CR, "Dezimalwert: ", DEC3 adcBits
    

erhält man neben der binären Zahlenausgabe den entsprechenden Dezimalwert im Debug Terminal angezeigt.

Abbildung 5 - Debug Terminal Ausgabe und Zeitdiagramm für /CS, CLK und DATA

3 - Ein einfaches Digitalvoltmeter (DVM) - Teil 2

Umrechnung der Messwerte in Spannungswerte

Der Spannungsbereich von 0 bis 5 Volt wird vom ADC0831 in 256 gleich verteilte Spannungsabschnitte von 0 bis 255 eingeteilt. 0 Volt entspricht somit binär die Darstellung 00000000 und 5Volt entsprechend 11111111.

Wir können also sagen:

  • Die gemessene Spannung U verhält sich zu 5 Volt wie die vom A/D Wandler gemessene Dezimalzahl zu 255 
    

oder als mathematischer Term geschrieben:

(1) nach Ugemessen aufgelöst ergibt die Umrechnungsformel

Mit PBASIC lässt sich diese Formel nicht so einfach ausrechnen. Die Sprache verfügt nur über eine Integer-Arithmetik, d. h., es können keine Kommazahlen verarbeitet werden.

 

Das Problem lösen wir mit Hilfe zweier Rechenschritte. Nehmen wir als Beispiel den Dezimalwert 155 und berechnen, welchem Spannungswert diese Zahl entspricht.

Dazu wird nach Formel (2) verfahren:

Die BASIC Stamp würde bei (3) als Ergebnis 3 anzeigen. Multipliziert man nun den Divisionsrest mit 100 und teilt ihn wieder durch 255, so erhält man die Nachkommastellen UNK der gesuchten Zahl. In diesem Fall ergibt sich mit der Formatierungsanweisung DEC2

Der gesuchte Spannungswert ist dann 3,03 Volt.

Allgemein lassen sich die Berechnungsschritte für eine Integer-Arithmetik in die drei Rechenschritte (5), (6) und (7) aufteilen.

Gleichung (5) berechnet den ganzzahligen Divisionswert ohne Rest, Gleichung (6) bestimmt mit dem Rechenzeichen // den Rest bei der Division nach (5) und Gleichung (7) errechnet die ersten beiden Nachkommastellen der Division nach (5). Das Ergebnis setzt sich aus dem Vorkommawert aus (5) und dem Nachkommawert aus (7) zusammen.

Das Programm ADWandler_1.bs2 muss jetzt nur um ein paar Zeilen in den Unterprogrammen calc_volt und display  ergänzt werden, damit die Ausgabe einem DVM-Gerät entspricht.

Die neue Terminalausgabe zeigt das folgende Bild.

Abbildung 6 - Terminalausgabe und Zeitdiagramm für /CS, CLK und DATA

4 - Rundungsfehler am DVM beheben

Rechnet man Formel (2) mit einem Taschenrechner aus, erhält man für den dezimalen Messwert 155 den Wert 3,03921... angezeigt. Es wäre vernünftig, den im Debug Terminal angezeigten Wert auf die 2. Stelle hinter dem Komma mathematisch zu runden. Der korrekt gerundete Wert müsste dann im Digitalvoltmeter (DVM) mit 3,04 V statt wie bisher mit 3,03 V angegeben werden. Um das zu erreichen, führen wir eine dritte Variable v3 ein.

  • v3 = 100 * R // 255 = 235
    
    v3 = 235 * 10 / 255 = 9
    

Dieses Verfahren lässt sich immer weiter anwenden, wenn man gewillt ist auch die 3. oder 4. Stelle hinter dem Komma zu bestimmen.

 

Da in unserem Fall die 3. Stelle hinter dem Komma eine 9 ist, wird die 2. Stelle hinter dem Komma  um 1 erhöht.

  •   IF (v3 >= 5) THEN v2 = v2 + 1
    

Es muss noch berücksichtigt werden, dass die zweite Stelle hinter dem Komma bereits eine 9 sein kann. Addiert man 1 hinzu, wird dann zum Beispiel aus der Zahl 3,996 die Zahl 3,00 statt 4,00. Wenn nach der Addition von eins die Variable v2 >= 100 ist, muss der Inhalt der Variablen v um eins erhöht werden und die Nachkommastellen sind 0.

  •   IF (v2 >= 100) THEN
        v = v + 1
        v2 = 0
      ENDIF
    

Mit der Ergänzung dieser Programmzeilen im Unterprogramm calc_volt werden die Messwerte mathematisch gerundet ausgegeben.

Kommentar schreiben

Kommentare

  • olaf (Sonntag, 10. Dezember 2017 08:35)

    wow...die mit Abstand beste Site, die ich bisher zu diesem Thema gesehen habe :-))
    Vielen Dank dafür. Hilft super beim Erklären!!

  • David Eisenblätter (Sonntag, 11. Februar 2018 13:38)

    Sehr schön erklärt, und zufällig heute, wo ich nochmal nach einer detailierten Gedankenstütze diesbezüglich gesucht habe!

    Vielen vielen Dank!

    David.

Bitte geben Sie den Code ein
* Pflichtfelder
Druckversion Druckversion | Sitemap
© Reinhard Rahner - Gettorf