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 wollt 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 kleiner als IN+ → OUT ist geschlossen
  • IN- ist größer als IN+ → OUT ist 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 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 Potentiometer. Zwischen IN+ und VOUT  kommt noch ein 1 MOhm Widerstand (R2). 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 Potentiometer 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 offen ist, dann beginnt die LED1 zu leuchten. Beachtet die Polung – der Strom fließt über den LM393 ab. 
  • Die Spannung VIN wird an A0 gemessen, VRef an A1 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/1023;
  vIn = analogRead(vInPin)*5.0/1023;
  vOut = analogRead(vOutPin)*5.0/1023;
  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 nun 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:

byte interruptPin=2;
byte 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. 

2 thoughts on “LM393 – aus analog wird digital

  1. 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.