Der ADC0831 ist ein 8-bit Analog-Digital-Wandler (A/D Wandler) mit synchroner serieller Ausgabe.
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.
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
Diese Informationen holt man sich aus den Datenblättern, die es zu jedem IC und von jedem Hersteller im Internet gibt.
Der Schaltungsaufbau
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 |
|
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.
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.
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.
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.
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.