74HC151

Manche Bausteine haben sehr viele Ausgänge die Ausgelesen werden müssen. Dies kann beim Raspberry Pi sehr viele Anschlüsse benötigen. Um den Raspberry Pi zu entlasten, können Multiplexer vorgeschaltet werden, mit dem man genau einen Ausgang eines Bausteins zum Raspberry Pi durchschalten und auslesen kann.
Der 74HC151 ist ein 8/2-Multiplexer, mit dem es möglich ist 8 Eingange auf einen Ausgang und einem korrespondierenden invertierten Ausgang durchzuschalten. Die Wahl des Eingangs erfolgt mit einem 3-Bit-Signal über drei weitere Anschlüsse des Multiplexers.
Dieses Tutorial zeigt, wie man einen 8-Bit AD-Wandler mit Hilfe eines Multiplexers auslesen kann. Ich werde in diesem Tutorial nicht weiter auf die Verwendung eines AD-Wandlers eingehen und verweise auf mein anderes Tutorial zu diesem Thema über den ADC0804. Auch hier werde ich jede halbe Sekunde eine analoge Eingangsspannung auslesen und auf der Konsole ausgeben. Die Eingangsspannung stelle ich mit einem Potentiometer ein.

Inhalt


Material

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

Aufbau

Der Aufbau des 74HC151 ist schnell zu verstehen:

74HC151
Die Stromversorgung erfolgt wie immer über VCC und GND. Die Eingangssignale schließt man an I7:I0 an. Der Ausgang und der Korrespondierende invertierte Ausgang sind die beiden Y. Mit S2:S0 wählt man das Eingangssignal aus, das durchgeschaltet werden soll. Sie stellen ein 3-Bit Wort zwischen 0 und 7 dar zur Wahl des entsprechenden Eingangs. Das Durchschalten funktioniert nur, wenn E auf LOW ist.

Der Gesamtaufbau ist dem des Tutorials des ADC0804 sehr ähnlich:

Gesamtaufbau
Der einzige Unterschied ist die Verwendung des 74HC151. Die Ausgänge des ADC0804 werden an die Eingänge des Multiplexers angeschlossen und durch S2:S0 ausgewählt. Der invertierte Ausgang wird in diesem Beispiel nicht benötigt. Durch anschließen des E an GND ist der Multiplexer durchgehend im Einsatz.

Programm

Auch das Programm zum Auslesen des AD-Wandlers mit einem Multiplexer ist dem Programm des Auslesens ohne dem Multiplexer aus dem Tutorial ADC0804 sehr ähnlich. Es müssen wie immer die Anschlüsse initialisiert werden:
#define S0 29
#define S1 28
#define S2 27
#define Y 26
#define CS 0
#define RD 4
#define WR 5
#define INTR 6

void init() {
    pinMode(S0,   OUTPUT);
    pinMode(S1,   OUTPUT);
    pinMode(S2,   OUTPUT);
    pinMode(Y ,   INPUT);
    pinMode(INTR, INPUT);
    pinMode(CS,   OUTPUT);
    pinMode(RD,   OUTPUT);
    pinMode(WR,   OUTPUT);

    digitalWrite(CS, HIGH);
    digitalWrite(RD, HIGH);
    digitalWrite(WR, HIGH);
    digitalWrite(S0, LOW);
    digitalWrite(S1, LOW);
    digitalWrite(S2, LOW);
}
Als nächstes schreibe ich eine Funktion, die mir ein Eingang das Multiplexers ausliest:
int readMultiplexerInput(int i) {
    if(i > 8 || i < 0) {
        return 0;
    }

    digitalWrite(S0, LOW);
    digitalWrite(S1, LOW);
    digitalWrite(S2, LOW);

    if((i&0x01) == 0x01) {
        digitalWrite(S0, HIGH);
    }

    if((i&0x02) == 0x02) {
        digitalWrite(S1, HIGH);
    }

    if((i&0x04) == 0x04) {
        digitalWrite(S2, HIGH);
    }

    delay(1);

    return digitalRead(Y);
}
Nun muss die Funktion zum Auslesen des AD-Wandlers angepasst werden:
unsigned char readValue() {
    digitalWrite(CS, LOW);
    digitalWrite(RD, LOW);
    unsigned char retValue 
        = (readMultiplexerInput(7) << 7) |
          (readMultiplexerInput(6) << 6) |
          (readMultiplexerInput(5) << 5) |
          (readMultiplexerInput(4) << 4) |
          (readMultiplexerInput(3) << 3) |
          (readMultiplexerInput(2) << 2) |
          (readMultiplexerInput(1) << 1) |
          (readMultiplexerInput(0) << 0);
    digitalWrite(RD, HIGH);
    digitalWrite(CS, HIGH);

    return retValue;
}
Der Rest sieht genauso aus, wie in dem anderen Tutorial:
void convert() {
    digitalWrite(CS, LOW);
    digitalWrite(WR, LOW);
    digitalWrite(WR, HIGH);
    digitalWrite(CS, HIGH);
    while(digitalRead(INTR) == HIGH) {
    }
}

unsigned char analogRead() {
    convert();
    return readValue();
}

int main() {
    if(wiringPiSetup() == -1) {
        return 0;
    }

    init();

    while(1) {
        delay(500);
        std::cout << (static_cast(analogRead())/255)*5 << std::endl;  
    }
 
    return 0;
}
Die Verwendung eines Multiplexers hat die benötigten Anschlüsse um 4 gekürzt. Da die Ausgabe des ADC0804 auf Softwareseite sowieso seriell ausgelesen wurde, würde ein serielles Durchschalten der Ausgabe durch einen Multiplexer technisch nichts verändern. Unterm Strich spart man sich wertvolle Anschlüsse am Raspberry Pi, die für andere Zwecke genutzt werden können.

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

Keine Kommentare:

Kommentar veröffentlichen

Hinweis: Nur ein Mitglied dieses Blogs kann Kommentare posten.