ADC0804

Manche Sensoren geben ihre Daten nur in Form eines analogen Ausgangssignals her. Analoge Signale sind für einen Computer nicht interpretierbar. Die Lösung ist eine Umwandlung in ein digitales Signal. Für diesen Zweck benutzt man Analog-Digital-Converter, kurz ADC. Leider hat der Raspberry Pi keinen eigenen ADC, sodass man auf weitere Bausteine zugreifen muss. Der ADC0804 ist ein Converter, der ein analoges Signal in ein 8-Bit Ausgangssignal umwandelt, das Werte zwischen 0 und 255 annehmen kann. Dazu wird ein Eingangsintervall [V_min, V_max] definiert, welches auf das Ausgangsintervall [0, 255] linear abgebildet wird. Dabei nimmt V_min den Wert 0 und V_Max den Wert 255 an. Die Aufgabe des Entwicklers besteht nun darin, das richtige Eingangsintervall einzustellen. Mehr dazu im Punkt 'Aufbau'.
Der ADC0804 braucht insgesamt 12 Anschlüsse des Raspberry Pi. Dies ist für einen einzelnen Baustein verhältnismäßig viel. Praktischerweise benötigt man für jeden weiteren ADC0804 nur einen einzigen Anschluss mehr. Drei Anschlüsse sind Ausgänge und dienen zur Steuerung des ADC, während 8 der anderen Anschlüsse Eingänge für die Ausgangsdaten des ADC sind. Der letzte Anschluss ist ebenfalls ein Eingangssignal auf dem der ADC signalisiert, dass eine Konvertierung abgeschlossen ist.
In diesem Tutorial werde ich jede halbe Sekunde eine Eingangsspannung im Intervall [0V, 5V] messen und den Wert auf der Konsole ausgeben.

Inhalt


Material

  • ADC0804
  • 10000 Ohm Widerstand
  • 1 nF Kondensator
  • Diverse Kabel
  • Steckbrett
  • Etwas zum Erzeugen eines beliebigen analoges Inputsignals, z.B. ein Potentiometer.

Aufbau

Der ADC0804 ist für einen Baustein verhältnismäßig groß. Er hat insgesamt 20 Anschlüsse:

ADC0804
Die Ausgangsdaten liegen an D7:D0 an, während D0 das niedrigste und D7 das höchste Bit darstellt. Mit CS wählt man den richtigen ADC0804 aus. Für jede Steuerung des ADC0804 muss CS auf LOW gesetzt werden. Dies hat den Vorteil, dass man mehrere ADC0804 benutzen kann und pro weiteren Baustein nur einen einzigen Anschluss (CS) mehr braucht. Ein LOW an WR startet eine Konvertierung. Mit einem LOW an RD wird das Ergebnis an D7:D0 ausgegeben. Ein LOW an INTR signalisiert dem Raspberry Pi, dass die Konvertierung abgeschlossen ist. Es muss ein RC-Glied an CR und CIN für ein Clock-Signal angeschlossen werden. Wie das aussieht, kann entweder dem Datenblatt oder der unteren Abbildung entnommen werden. Mit VCC an +5V und DGND an GND angeschlossen versorgt man den Baustein mit Strom. Das Eingangsintervall wird definiert durch VREF und VIN-. Dabei stellt VIN- die untere Intervallgrenze und VREF die halbe Intervallbreite dar. Beispielsweise wenn das Eingangsintervall [1V, 5V] ist, dann muss VIN- an +1V und VREF an +2V (=(5V-1V)/2) angeschlossen werden. Der Spezialfall ist das Eingangsintervall [0V, 5V]. Für dieses Intervall kann VIN- an GND angeschlossen werden und VREF lässt man frei. Dadurch wird VREF = VCC/2 gesetzt. AGND stellt das GND für VREF dar. Das analoge Eingangssignal schließt man an VIN+ an.

Mein Eingangsintervall ist [0V, 5V]. Dadurch eignet sich folgender Aufbau:

Gesamtaufbau
Ich habe mit einem Potentiometer die Eingangsspannung beliebig zwischen 0V und 5V eingestellt. Natürlich kann da jedes beliebige Eingangssignal umgewandelt werden, wie z.B. Thermometer- oder Neigungssensorausgaben.

Programm

Das Programm für eine Konvertierung ist zum Glück sehr einfach. Als Erstes beginnt man wieder mit der Initialisierung der Anschlüsse des Raspberry Pi:
#define D0 22
#define D1 23
#define D2 24
#define D3 25
#define D4 29
#define D5 28
#define D6 27
#define D7 26
#define CS 0
#define RD 4
#define WR 5
#define INTR 6

void init() {
    pinMode(D0,   INPUT);
    pinMode(D1,   INPUT);
    pinMode(D2,   INPUT);
    pinMode(D3,   INPUT);
    pinMode(D4,   INPUT);
    pinMode(D5,   INPUT);
    pinMode(D6,   INPUT);
    pinMode(D7,   INPUT);
    pinMode(INTR, INPUT);
    pinMode(CS,   OUTPUT);
    pinMode(RD,   OUTPUT);
    pinMode(WR,   OUTPUT);

    digitalWrite(CS, HIGH);
    digitalWrite(RD, HIGH);
    digitalWrite(WR, HIGH);
}
Die Umwandlung besteht aus zwei Schritten. Als Erstes kommt die eigentliche Konvertierung und als Zweites kommt die Ausgabe auf die D7:D0. Dazu benutzt man folgende zwei Funktionen:
void convert() {
    digitalWrite(CS, LOW);
    digitalWrite(WR, LOW);
    digitalWrite(WR, HIGH);
    digitalWrite(CS, HIGH);
    while(digitalRead(INTR) == HIGH) {
        // Warten bis Konvertierung abgeschlossen.
        // Dies wird mit INTR == LOW signalisiert.
    }
}

unsigned char readValue() {
    digitalWrite(CS, LOW);
    digitalWrite(RD, LOW);
    unsigned char retValue 
        = (digitalRead(D7) << 7) |
          (digitalRead(D6) << 6) |
          (digitalRead(D5) << 5) |
          (digitalRead(D4) << 4) |
          (digitalRead(D3) << 3) |
          (digitalRead(D2) << 2) |
          (digitalRead(D1) << 1) |
          (digitalRead(D0) << 0);
    digitalWrite(RD, HIGH);
    digitalWrite(CS, HIGH);

    return retValue;
}
Beide Funktionen kann man nun in eine Funktion zusammenfassen:
unsigned char analogRead() {
    convert();
    return readValue();
}
Das ist alles was man für eine Umwandlung benötigt. In der main-Funktion rufe ich nun jede halbe Sekunde die Funktion auf und gebe das Ergebnis in V auf der Konsole aus.
int main() {
    if(wiringPiSetup() == -1) {
        return 0;
    }

    init();

    while(1) {
        delay(500);
        std::cout << (static_cast(analogRead())/255)*5 << std::endl;
    }
 
    return 0;
}
Ich persönlich finde die Verwendung des ADC0804 verhältnismäßig kompliziert. Darüber hinaus benötigt er viele Anschlüsse des Raspberry Pi. Dafür ist die zugehörige Software sehr einfach. Ein Analog-Digital-Converter ist für den Einsatz vieler Sensoren eine Notwendigkeit. Beim Einsatz mehrerer Sensoren und dadurch mehrerer ADC benötigt man zum Glück nur einen Anschluss pro ADC mehr, da man über den CS ein ADC auswählen kann.

Ich hoffe dieses Tutorial hat euch bei der Verwendung des ADC0804 weitergeholfen oder euch seinen Nutzen näher gebracht und euch zum Kauf angeregt. Für weitere Informationen zum ADC0804 siehe:

Keine Kommentare:

Kommentar veröffentlichen

Hinweis: Nur ein Mitglied dieses Blogs kann Kommentare posten.