LM393 – aus analog wird digital

Über den Beitrag

Versch. Sensormodule für Vibration, Licht, Wärme (Flame), Lautstärke, Hindernis
Versch. Sensormodule für Vibration, Licht, Wärme (Flame), Lautstärke, Hindernis

Was haben die oben abgebildeten Sensormodule gemein? Der Beitragstitel verrät es ja schon: einen LM393. Darüber hinaus besitzen alle Module einen digitalen Ausgang, obwohl die zugrunde liegenden Sensoren analoger Art sind. Und zu guter Letzt haben alle Sensoren ein Poti, mit dem sich das analoge Limit einstellen lässt, bei dem der digitale Ausgang schaltet. In diesem Beitrag möchte ich erklären, wie das funktioniert und wie ihr selbst mit einem LM393 analoge Sensoren digital nutzen könnt.

Wozu digital statt analog?

Stellt euch vor, ihr möchtet ein analoges Signal auslesen und bei einem bestimmten Limit soll eine Aktion erfolgen. Zum Beispiel messt ihr bei einer Lichtschranke über einen LDR (Fotowiderstand) die Helligkeit. Wird ein bestimmter Wert unterschritten, soll ein Alarm ausgelöst werden. Ihr könntet das analoge Signal natürlich mit einem analogRead auslesen. Das hat aber einige Nachteile:

  • Ihr müsst permanent auslesen, damit euch kein Ereignis verloren geht. Das wiederum kann problematisch sein, wenn zwischendurch noch andere Aufgaben zu erledigen sind.
  • Ein analogRead ist eine vergleichsweise langsame Angelegenheit. Ca. 100 µs werden dafür am Arduino UNO benötigt. Ein digitalRead ist fast fünfzigmal schneller und ein direktes Auslesen des Port Input Registers PINx sogar ca. dreihundertfünfzigmal schneller. 
  • Nehmt ihr das digitale Signal über einen Interruptpin entgegen, könnt ihr den Microcontroller zwischendurch auch schlafen schicken (siehe mein Beitrag über Sleep Modes). Mit der analogRead Lösung geht das nicht. 

Eigenschaften des LM393

LM393 - links: Pinout, rechts: schematischer Aufbau
LM393 – links: Pinnummerierung, rechts: schematischer Aufbau

Der LM393 besitzt zwei voneinander unabhängige Komparatoren. Die Komparatoren haben jeweils zwei Eingänge (IN- und IN+) und einen Ausgang (OUT). Wie der Name vermuten lässt, vergleicht der Komparator etwas, und zwar die Spannungen an IN- und IN+. An OUT sitzt ein Transistor, dessen Zustand vom Verhältnis der Spannungen abhängt:

  • IN- ist größer als IN+ → OUT ist gegen Masse geschlossen
  • IN- ist kleiner als IN+ → OUT ist gegen Masse offen (Open Collector)

Hängt man einen Pull-Up Widerstand mit der Spannung VPU an OUT, wechselt die Polarität zwischen 0 und VPU. Fertig ist das digitale Signal.

  • IN- ist kleiner als IN+ → VOUT = VPU
  • IN- ist größer als IN+ → VOUT = 0 V

Elektrische Eigenschaften

Bei einfacher Spannungsversorgung des LM393 kann die Versorgungsspannung 2 bis 36 Volt betragen, bei doppelter Spannungsversorgung 1 bis 18 Volt:

Stromversorgung des LM393 - links: einfache Spannungsversorgung, rechts: doppelte Spannungsversorgung
Links: einfache Spannungsversorgung, rechts: doppelte Spannungsversorgung

Ist OUT gegen Masse offen, dient der LM393 als Stromsenke. Der maximale Strom sollte dabei 16 Milliampere nicht überschreiten. Ihr könnt also eine LED dranhängen, mehr aber nicht.

Der LM393 verbraucht ca. 0.4 mA. Weitere Angaben findet ihr im Datenblatt.

Wo bekomme ich den LM393 her?

Der LM393 ist ein Bauteil, das praktisch in allen (Elektronik-) Online-Shops erhältlich ist. Bei Conrad, Reichelt und Co bekommt ihr ihn für 20 bis 30 Cent das Stück, müsst aber die Versandgebühren beachten. Bei ebay und Amazon ist es da manchmal insgesamt günstiger, aber man sollte schauen, wo die Teile herkommen. Aus China dauert es meist ein paar Wochen. 

Es gibt den LM393 in verschiedenen Bauformen, z.B. DIP oder SMD, und für verschiedene Temperaturbereiche. Um welche Ausführung es sich handelt, ist im Namen verschlüsselt, z.B. LM393AN, LM393ST, usw. Im Datenblatt findet ihr was die Kürzel bedeuten.

Grundschaltung des LM393

Grundbeschaltung der Komparatoren des LM393
Grundbeschaltung der Komparatoren des LM393

Normalerweise nutzt man den LM393, um eine Signalspannung VIN mit einer Referenzspannung VRef vergleichen. Meistens findet man Beispiele, bei denen VRef an IN- und VIN an IN+ liegt. Das ist aber eigentlich egal. Die Referenzspannung erzeugt man üblicherweise über einen Spannungsteiler oder ein Potenziometer. R3 ist der Pull-Up Widerstand, der VOUT hochzieht, wenn OUT geschlossen ist. Die Widerstände R1 und R4 könnt ihr weglassen, wenn ihr z.B. mit einem hochohmigen Potenziometer oder Spannungsteiler an die Eingänge geht. 

Eine Schaltung „zum Kennenlernen“

Die folgende Schaltung soll nochmal verdeutlichen, wie der LM393 funktioniert. Ein Arduino misst dabei für uns die Spannungen VREF, VIN und VOUT.

  • Der Spannungsteiler R1 / R2 liefert (im Idealfall) 2.5 Volt. Das ist unsere Referenzspannung.
  • Die Signalspannung VIN ist variabel und wird von einem Poti geliefert. 
  • Wenn OUT gegen Masse offen ist, dann beginnt die LED1 zu leuchten. Beachtet die Polung – der Strom fließt über den LM393 ab. 
  • Die Spannung VIN wird an A1 gemessen, VRef an A0 und VOUT an A2
LM393 - Schaltung zum Testen und Üben
LM393 – Schaltung zum Testen und Üben

Nehmt ihr die oben angegebenen Widerstandswerte, dann sollte der Schaltpunkt für die LED circa in Mittelstellung des Potis liegen. Mit dem folgenden Sketch könnt ihr VIN, VRef und VOUT verfolgen:

const int refPin = A0;
const int vInPin = A1;
const int vOutPin = A2;
float vRef, vIn, vOut;

void setup() {
  Serial.begin(9600); 
}

void loop() {
  vRef = analogRead(refPin)*5.0/1024;
  vIn = analogRead(vInPin)*5.0/1024;
  vOut = analogRead(vOutPin)*5.0/1024;
  Serial.print("VRef = ");
  Serial.print(vRef);
  Serial.print("  |  VIn = ");
  Serial.print(vIn);
  Serial.print("  |  VOut = ");
  Serial.println(vOut);
  delay(500);
}

 

So könnte dann das Ergebnis am seriellen Monitor aussehen, wenn ihr am Poti dreht:

Ausgabe von LM393_ test_sketch.ino
Ausgabe von LM393_ test_sketch.ino

Man erkennt schön wie VOUT „kippt“, wenn VIN unter VRef rutscht. 

Einen digitalen Lichtsensor bauen

Verschiedene LDRs

Nun kommen wir zu eigentlichen Thema, nämlich wie ihr aus einem analogen Sensor einen digitalen macht. Ich will das am Beispiel eines Lichtsensors zeigen. Ersetzt dazu in der letzten Schaltung den Widerstand R1 aus dem Spannungsteiler durch einen Fotowiderstand (LDR) und R2 durch einen dazu passenden Widerstand, z.B. 33 kOhm. Mit steigender Lichtintensität verringert sich der Widerstand des LDR und damit fällt die Signalspannung. Über das Poti stellt ihr die Referenzspannung ein. 

Die Leitungen zu den analogen Eingängen des Arduino UNO braucht ihr jetzt nicht mehr. Außerdem entfernt die LED und hängt sie stattdessen an den Arduino Pin 13. Den Ausgang des LM393 verbindet ihr mit dem Arduino Pin 2. So sieht die Schaltung dann aus:

Ein digitaler Lichtsensor mit dem LM393
Ein digitaler Lichtsensor mit dem LM393

Mit dem folgenden Minisketch könnt ihr die Schaltung überprüfen: 

byte sensorPin=2;
byte ledPin=13;

void setup() {
  pinMode(ledPin, OUTPUT);
  pinMode(sensorPin, INPUT);
}

void loop() {
  while(!digitalRead(sensorPin)){
    digitalWrite(ledPin, HIGH);
  }
  digitalWrite(ledPin,LOW);
}

 

Dreht am Poti bis die LED gerade aus ist. Wenn ihr den LDR dann zum Beispiel mit der Hand abdeckt, dann könnt ihr sehen, wie die LED angeht. 

Interrupts nutzen

Wie schon zu Beginn des Beitrages erwähnt, nutzt man die Vorteile eines digitalen Sensors erst so richtig mit Interrupts.

Sagen wir mal, ihr steuert mit der Schaltung oben eine Lichtschranke. Das bedeutet, dass ihr unter Umständen nur ein ganz kurzes „Dunkelereignis“ habt. Zwischendurch soll der Microcontroller aber noch andere Sachen machen, z.B. einen anderen Sensor auslesen. Oder ihr habt aus irgendwelchen Gründen noch delays in eurer Hauptschleife eingefügt. Wenn ihr Pech habt, verpasst ihr dann das Auslösen der Lichtschranke. 

Hier die Lösung:

int interruptPin=2;
int ledPin=13;
volatile bool dark;

void setup() {
  pinMode(ledPin, OUTPUT);
  pinMode(interruptPin, INPUT);
  attachInterrupt(digitalPinToInterrupt(interruptPin), darkISR, FALLING);
  dark = false;
}

void loop() {
  if(dark){
    digitalWrite(ledPin, HIGH);
    delay(1000);
    digitalWrite(ledPin, LOW);   
    dark = false;
    attachInterrupt(digitalPinToInterrupt(interruptPin), darkISR, FALLING);
  }
}

void darkISR(){
  dark = true;
  detachInterrupt(digitalPinToInterrupt(interruptPin));
}

 

Hier löst das „Dunkelereignis“ einen Interrupt aus. Die Interrupt Service Routine darkISR setzt die Variable dark auf true. Und sie schaltet die Interrupts am Interruptpin aus, damit nicht noch mehr Interrupts ausgelöst werden, bevor oder während die Aktionen abgearbeitet sind.

In der Programmhauptschleife wird dann der Status der Variable dark ganz entspannt und zu gegebener Zeit abgefragt. Ist dark true, dann leuchtet die LED an Pin 13 für eine Sekunde. Danach wird dark auf false gesetzt und die Interrupts am Interruptpin wieder eingeschaltet. Das System ist wieder scharf sozusagen. 

So könnt ihr nebenbei noch andere Dinge in der Hauptschleife erledigen, denn die Information, dass ein Interrupt ausgelöst wurde, geht euch nicht verloren.

Wenn ihr mit Interrupts nicht so sehr vertraut seit, lest vielleicht nochmal diese Stelle auf den Arduino Seiten.

Andere Sensoren digitalisieren

Damit solltet ihr jetzt in der Lage sein auch andere, analoge Sensoren zu digitalisieren. Mit den meisten Sensoren ist es sogar noch ein bisschen einfacher als mit dem LDR, da sie direkt ein Spannungssignal liefern. Dadurch könnt ihr dann direkt in einen der Komparatoreingänge gehen. Gegebenenfalls setzt ihr noch einen Widerstand dazwischen. Auf die andere Seite kommt wieder ein Poti und das war’s auch schon. 

16 thoughts on “LM393 – aus analog wird digital

  1. Hallo Wolfgang,
    ich bin gerade bei einer Schaltungsentwicklung ( Steckbordstadium ) und brauchte etwas Nachhilfe,weil ich schon länger nicht mehr mit Komparatoren konstruiert habe und eine
    Unsicherheit bei der Eingangsbeschaltung des LM393 bestand.Jetzt habe ich meine Info
    und es kann Dank deiner „ Elekronikkiste „ weitergehen.Vielen Dank für die Hilfe!
    Herzliche Grüße von Bastler Karl.

    1. Vielen Dank, schön zu hören, dass mein Beitrag hilfreich war. Viel Spaß noch beim Basteln!
      VG, Wolfgang

  2. Hallo,
    die obere der beiden Beschreibungen, wie sich der Ausgang in Abhängikkeit der beiden Eingänge verhält, ist falsch!
    Richtig ist:
    Wenn VIN- größer als VIN+, ist der Ausgang geschlossen (gegen Masse)
    Wenn VIN- kleiner als VIN+, ist der Ausgang offen (hochohmig)

    Die darunter stehende Beschreibung stimmt wieder (die mit dem Pullup Wid.)

    LG Jürgen

      1. Ich hing an derselben Stelle (vielleicht auch, weil die Reihenfolge > wenn OUT offen ist). Und dass „geschlossen“ „gegen Masse geschlossen“ bedeutet, wie Jürgen es oben schreibt, finde ich auch sehr hilfreich und würde ich dazunehmen. Offen und Geschlossen sind bei Stromkreisen nicht sehr eindeutige Begriffe. Und ich würde mich freuen, wenn man noch erklären würde, wozu der 1 MOhm R3 dient. Dann muss ich nicht woanders suchen, um diese Info zu finden. Ansonsten sehr schöne Erklärung mit guten Beispielen, freue mich immer, wenn ich sowas finde.

        (Was die Kulturfrage Mailadresse angeht, war ich ca 1998 noch etwa derselben Meinung, musste das aber ändern. Das Internet ist nicht mehr, was es damals war. Natürlich steht es Ihnen jederzeit frei, auch hilfreiche und wohlmeinende Kommentare aufgrund von Prinzipien zu unterdrücken, das ist Ihr Recht als Besitzer dieser Seite. Ich persönlich würde es jedoch bedauern. Nicht wegen mir; ich halte das problemlos aus.)

        1. Hallo, offen gestanden weiß ich nicht mehr, was mich dazu bewogen hat, den 1 MOhm Widerstand einzufügen. Ich habe die Schaltungen noch einmal ausprobiert und den Widerstand ersatzlos gestrichen. Danke für den Hinweis. Auch das „geschlossen gegen Masse“ habe ich aufgenommen. Ich bin kein gelernter oder studierter Elektroniker!
          Was die E-Mail-Adressen angeht: Mich nervt, dass sich jeder versteckt. Außerdem werden die E-Mails nicht veröffentlicht und schließlich muss ich selbst hier noch mehr die Hosen herunterlassen als jeder Kommentator. Als ich den Kommentar gelöscht habe, hatte ich wohl aber auch gerade schlechte Laune.

  3. Hallo Wolfgang,

    danke für den ausführlichen Beitrag! Ich würde den LM393 gerne anders einsetzen, bin mir aber nicht sicher, ob ich das richtig verstanden und es somit überhaupt umsetzbar ist:

    1. Ich habe ein zu versorgendes Bauteil (Peltierelement)
    2. Stromversorgung generell: Kfz-Bordnetz, welches stark schwankt
    3. Um immer eine ähnliche Spannung zu haben, soll die Versorgung entweder direkt aus dem Bordnetz kommen oder, wenn die dortige Spannung zu hoch ist, über einen Spannungsregler (L7815)

    Mein Gedanke:
    IN+ an Bordnetz (hinter Diode etc. zur Absicherung)
    IN- an L7812-Ausgang
    GND an GND
    OUT an Peltierelement => liefert immer 12 V

    Ist das so machbar oder habe ich die Funktion des LM393 grundlegend falsch verstanden?

    Danke und Grüße

    1. Hallo Stefan, ja, genauso geht es. Ein Kondensator (z.B. 10 mikro F) vor und einer hinter dem Spannungsregler tut der Spannungsstabiliät noch gut.
      Viel Erfolg! Wolfgang

      1. So wird das wohl nichts.
        Peltierelemente gibt es in vielen Spannungsklassen und Leistungsklassen. Eine häufige Größe ist 40x40mm mit 12V-15,5V bei etwa 50-60W und ca. 6A.
        ……..

        1. Hallo AZ,
          auch wenn dein Kommentar hilfreich sein sollte – wenn mir auffällt, dass ein Kommentator offensichtlich eine Fake E-Mail-Adresse als Absender verwendet, dann veröffentliche ich den Kommentar nicht, bzw. jetzt hier nur die ersten zwei Zeilen. Das hat zum einen Sicherheitsgründe, zum anderen ist es eine Kulturfrage. Ich bitte um Verständnis.
          VG, Wolfgang Ewald

  4. Hallo Wolfgang,

    ist da ein Fehler in der Beschreibung zur Schaltung „zum Kennenlernen“ oder bin ich zu blöd (was wahrscheinlicher ist)?
    „Der Spannungsteiler R1 / R2 liefert (im Idealfall) 2.5 Volt. Das ist unsere Referenzspannung.“ – grüne Leitung – geht an A0 des Arduinos.
    „Die Signalspannung VIN ist variabel und wird von einem Poti geliefert.“ – orange Leitung – geht an A1 des Arduinos
    „Die Spannung VIN wird an A0 gemessen, VRef an A1 …“ – Häh, müsste es nicht genau umgekehrt sein???

    1. Du hast Recht, das ist falsch herum – wird gleich geändert. Vielen Dank!

    1. Das sind unterschiedliche Bauformen, „unter der Haube“ sind sie identsch. „N“ ist die DIP Version (Dual in Line package), also mit zwei Pinleisten und geeignet für Breadboards. „P“ ist die TSSOP (Thin Shrink Small Outline Package) Version, eine SMD Bauform. Hier gibt es ein Datenblatt, das die Bauformen und die Bezeichnungen übersichtlich zeigt:
      https://www.datasheet.live/index.php?title=Special:PdfViewer&url=https%3A%2F%2Fpdf.datasheet.live%2F1fbeab75%2Fst.com%2FLM393N.pdf

  5. Ich habe eine ähnliche Schaltung mit dem Reflexkoppler CNY70 aufgebaut um Motoren zu synchronisieren, an denen Indexerscheiben angebracht sind, auf die diese Reflexkoppler schauen. Zunächst hatte ich auch einen Komparator LM324 verwendet, aber da das Signal etwas rauscht führte das zu viel zu vielen Zählimpulsen. Erst die Verwendung eines Schmidttriggers MOS4093 hat das Problem beseitigt, weil die Hysterese eine Mehrfachzählung verhindert.

    1. Vielen Dank für den Kommentar. Ich bin immer froh für Anregungen, die ggf. anderen weiterhelfen können!

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert