Ich habe bereits viel im Internet und diversen Foren recherchiert, bin aber bisher zu keinem positiven Ergebnis gekommen. Deswegen wende ich mich mal an euch :)
Problemstellung:
Ich muss mit einem ESP32 bis zu 12 verschiedene 24V Sensoren auslesen können.
Da habe ich mir gedacht, ich nehme jeweils einen Optokoppler den ich mit dem 24V Sensor/Endschalter schalte, und auf der Ausgangsseite des Optokopplers schalte ich dann 3,3V auf einen Pin eines PCF8575 I2C Multiplexer (16-Kanal).
Als Optokoppler habe ich mir die LTV817D besorgt.
Soweit so gut, die Optokoppler Schaltung funktioniert und ich kann am Emitter entweder meine 0V (nicht geschaltet) oder meine 3,3V (geschaltet) messen.
Sobald nun der Optokoppler geschaltet ist, also am Emitter die 3,3V anliegen, und ich nun die Verbindung zwischen Emitter und Input1 (P0) des PCF8575 stecke, bricht mir die Spannung auf ca. 0,1V zusammen.
Die Software vom ESP32 ist soweit in Ordnung und funktioniert. Wenn ich mit einer Steckbrücke direkt von 3,3V auf den PCF8575 stecke, werden alle Eingänge einwandfrei erkannt und kann dort ebenfalls meine 3,3V messen.
Und genau an dieser Stelle weiß ich nicht weiter. Entweder mache ich etwas grundlegend falsch, oder ich stehe einfach nur auf dem Schlauch...
Ein Schaltplan vom Testaufbau füge ich bei.
Vielen Dank im Voraus, ich freue mich über jeden Tipp zu meinem Problem :)
und ich kann am
Emitter entweder meine 0V (nicht geschaltet) oder meine 3,3V
(geschaltet) messen.
Du meinst vermutlich den Kollektor und nicht den Emitter des Optokopplers, denn der Emitter ist lt. deiner Schaltung fest mit GND verbunden.
Aber 100 Ohm ist als Arbeitswiderstand für den Fototransistor sehr wenig. Nimm da mal was höheres wie z.B. 330 Ohm oder 470 Ohm.
und ich nun die Verbindung zwischen Emitter und Input1 (P0)
des PCF8575 stecke, bricht mir die Spannung auf ca. 0,1V zusammen.
Wie gesagt, das würde mich nicht wundern, weil ja der Emitter fest auf GND liegt. Nehmen wir mal an, das du den Kollektor meinst, dann kann es sein, das du den PCF8575 falsch initialisiert. Du solltest die Eingänge auch als Eingänge initialsieren und sie auf high setzen. Allerdings lese ich mir das ganze Datenblatt jetzt nicht durch, das überlasse ich dir :-P
Sobald nun der Optokoppler geschaltet ist, also am Emitter die 3,3V
anliegen, und ich nun die Verbindung zwischen Emitter und Input1 (P0)
des PCF8575 stecke, bricht mir die Spannung auf ca. 0,1V zusammen.
Der Emitter gehört an Ground und sonst nirgendwohin.
Welchen Strom kann denn die 3.3V-Spannungsquelle liefern?
Wenn Du jedem einzelnen Optokoppler einen 100-Ohm-Vorwiderstand spendierst, belastest Du im Vollausbau Deine 3.3V mit gerade mal 8 Ohm - das sind über 400 mA.
Dein "Schaltplan" ist sehr, sehr unvollständig. Woher kommt die Versorgungsspannung des PCF8575?
Soweit so gut, die Optokoppler Schaltung funktioniert und ich kann am
Emitter entweder meine 0V (nicht geschaltet) oder meine 3,3V
(geschaltet) messen.
Dann stimmt aber Dein Schaltplan nicht.
Der OK zieht bei Beleuchtung auf Low (0V).
Die Widerstände sind auch arg zu klein. Für 24V würde ich 10k vorsehen (2,4mA). Am Ausgang reicht der interne Pullup (30..300µA) des PCF8575 völlig aus.
Sobald nun der Optokoppler geschaltet ist, also am Emitter die 3,3V
anliegen, und ich nun die Verbindung zwischen Emitter und Input1 (P0)
des PCF8575 stecke, bricht mir die Spannung auf ca. 0,1V zusammen.
Dann hast Du wohl den PCF8575 auf Output low gesetzt.
Der PCF8575 ist quasi open drain, d.h. bei high ist nur der Pullup aktiv und Du kannst den Pin extern auf low ziehen.
kann es
sein, das du den PCF8575 falsch initialisiert
Das werde ich auf jedenfall nochmal prüfen. Habe nämlich gelesen dass man die Pins welche als Input genutzt werden, im Setup einmal mit "HIGH" initialisieren soll. - Wobei es ja mit einer direkten Verbindung zu 3,3V ohne Optokoppler ja einwandfrei funktioniert.
Welchen Strom kann denn die 3.3V-Spannungsquelle liefern?
Gut dass du es sagst, das habe ich noch garnicht nachgerechnet...
Momentan kommt die 3,3V Versorgung direkt vom ESP32. Der ESP selbst wird von einem LM2596S versorgt, der die 24V auf 5V herunter transformiert.
Die Widerstände sind auch arg zu klein. Für 24V würde ich 10k vorsehen
(2,4mA)
Reichen denn 2,4mA auf der 24V Seite aus, damit der Optokoppler sauber durchschaltet? Max. Strom sind auf der Eingangsseite 50mA deswegen habe ich es etwas höher angesetzt...
Wenn rechts und links vom Optokoppler die selbe Masse ist, ist der Optokoppler unnötig.
Sobald nun der Optokoppler geschaltet ist, also am Emitter die 3,3V
anliegen, und ich nun die Verbindung zwischen Emitter und Input1 (P0)
des PCF8575 stecke, bricht mir die Spannung auf ca. 0,1V zusammen.
Die Masseanschlüsse aller Komponenten sind alle miteinander verbunden?
Problemstellung:
Ich muss mit einem ESP32 bis zu 12 verschiedene 24V Sensoren auslesen
können.
Kleine Syntaxkorrektor: du willst die Sensoren EINlesen und dann was damit machen und dann Signale für Aktoren AUSgeben.
Reichen denn 2,4mA auf der 24V Seite aus, damit der Optokoppler sauber
durchschaltet?
Wenn du auf der Transistorseite einen 3k3 Pullup hast, dann fließt dort bei 0V über dem Transistor ein Strom von 1mA. Der LTV817 mit D am Ende hat ein CTR (Stromübertragungsverhältnis) von 300...600%. Er könnte also aus den 2,4mA in der LED mindesatens 7,2mA im Transistor machen. Für das nötige 1mA reicht das gut aus.
Max. Strom sind auf der Eingangsseite 50mA deswegen habe
ich es etwas höher angesetzt...
Man legt seine Schaltung NIEMALS nach den absolute Maximum Ratings aus. NIENMALS.
Sondern man legt sie so aus, dass sie funktionieren und kontrolliert danach, ob mit die berechneten Werte alle gut unter den absoluten Maximalwerten sind.
Soweit so gut, die Optokoppler Schaltung funktioniert und ich kann am
Emitter entweder meine 0V (nicht geschaltet) oder meine 3,3V
(geschaltet) messen.
Aber sicher nicht mit der gezeichneten Schaltung. Ist es echt so schwer, die Schaltung zu zeigen, mit der man es probiert hat? Eine mit dem Smartphone fotografierte Bleistiftskizze reicht ja.
Reichen denn 2,4mA auf der 24V Seite aus, damit der Optokoppler sauber
durchschaltet?
Du hast anscheinend ein vollkommen falsches Verständnis von der Funktionsweise eines Optokopplers. Ein Optokoppler wie der LTV817 schaltet gar nicht, sondern ist ein zutiefst analoges Bauelement. Er verhält sich näherungsweise wie ein simpler Transistor, nur daß man den Steuerstrom nicht in die Basis, sondern in die Fotodiode schickt.
Der Ausgangsstrom ist dem Steuerstrom weitgehend proportional (deswegen analog). Allerdings ist ein LTV817 ein mieser Transistor. Seine Strom- "Verstärkung" ist nicht ca. 100 wie bei einem normalen Transistor, sondern kann sogar unter 1 liegen (je nach CTR-Klasse).
Die Stromverstärkung heißt beim Optokoppler CTR und wird üblicherweise in Prozent angegeben. Ein Optokoppler mit CTR=100% hat also eine "Stromverstärkung" von gerade mal 1. Die CTR-Klassifizierung erfolgt meist über einen angehängten Buchstaben, wie bei Transistoren auch.
Max. Strom sind auf der Eingangsseite 50mA deswegen habe
ich es etwas höher angesetzt...
Der Emitter gehört an Ground und sonst nirgendwohin.
Doch, du kannst auch mit einer Kollerktorschaltung arbeiten. Was den Vorteil hat, dass du z.B. eine höhere Bandbreite bekommen kannst. Und du hast keine Invertierung. Was heutzutage bei Mikrocontrollern nicht mehr sonderlich interessant ist, weder im positiven noch negativen Sinn. Denn die kann ein µC selber (rückgängig) machen.
Ich habe das mal eben durchgerechnet. Genauer, grob runtgergeschlampt (z.B: < statt <=, und keine Lust mich mit dem Tex-Mathemodus des Forums zu quälen). Das kann daher ziemlich falsch sein. Ich bin mal gespannt ob Fehler gefunden werden:
1
Für den in der Schaltunge angegebenen LTV-817D gilt laut Datenblatt, Rank D (ob der TS wirklich einen LTV-817D hat?):
2
3
CTRmin(25°C) = 300 | IF = 5mA, VCE = 5V, Ta = 25°C
4
CTRmax(25°C) = 600 | IF = 5mA, VCE = 5V, Ta = 25°C
5
6
Derating:
7
8
Annahme: Betriebsbereich der Schaltung Ta_min = 0°C, Ta_max = 65°C
9
Dafür aus Datenblatt-Kurve abgeschätzt:
10
11
RCTR(0°C) = 1,1 -> CTR_min(0°C) = 330
12
RCTR(65°C) = 0,8 -> CTR_min(65°C) = 240
13
14
-> Minimum über Betriebsbereich bei 65°C: CTR_min(65°C) = 240
15
16
Dazu eine angenommene Alterung von 20% über die Nutzungsdauer des Gerätes und weitere 25% Sicherheitsfaktor (Angstfaktor, Reserve, ...)
17
18
-> Minimum unter den gegebenen Bedingungen und Annahmen:
19
20
CTRmin = 240 * (1 - 0,2) * ( 1 - 0,25) = 144
So schnell schmilz ein CTR von 600 auf der ersten Seite des Datenblatts dahin ...
Wie mein damaliger Professor sagte, auf der ersten Seite des Datenblatts stehen die Werte die Sie garantiert nicht bekommen.
1
Weiter:
2
3
Kollektorstrom IC für IF = 5 mA (IF = 5 mA ist so der grobe Zielbereich,
4
auch weil viele Werte im Datenblatt sich auf 5 mA beziehen), und mit IH
5
der in erster Näherung dann für einen High-Pegel VIH am Ausgang des
6
Optokopplers zur Verfügung stehender Strom:
7
8
IC = IH = CTRmin * IF = 1.44 * 5 mA = 7.2 mA
9
10
Spannung am Emitterwiderstand Re um a) den benötigten High-Pegel des
11
PCF8575 erzeugen zu können, und b) den benötigten Low-Pegel erreichen
12
zu können:
13
14
Laut Datenblatt möchte der PCF8575
15
16
VIL < 1,5 V; Maximal erlaube Eingangsspannung für Low-Pegel
17
VIH > 3,5 V; Minimum nötige Eingangsspannung für High-Pegel
18
IIHL < | 0,4 mA | ; Eingangsstrom schwankt um +/- 0,4 mA
19
zwischen Eingang High und Eingang Low.
20
21
a) Re_min wenn Eingang des LTV-817D High sein soll, IC = IH,
22
Kollektorstrom teilt sich auf, daher gilt IRe = IH - IIHL
23
24
-> Re_min > VIH / (IH - IIHL) = 3,5 V / (7,2 - 0,4) mA = 515 Ohm
25
26
b) Re_max wenn Eingang des LTV-817D Low sein soll:
27
28
IL = IC ; bei Low-Pegel
29
30
Untere Grenze (keine Eingangsspannung am Optokoppler, d.h. bei
31
Wandlung von Logikpegeln eventuell falsche Annahme. Egal:
32
33
IL = ICE0 = 0,1 µA ; Collector Dark Current
34
35
Durch Re_max fließt IRe:
36
37
IRe = IC + IIHL = IH + IIHL = ICE0 + IIHL.
38
39
Da der "Collector Dark Current" des LTV-817D mit ICE0 = 0,1 µA
40
gegenüber IIHL = 0,4 mA des PCF8575 vernachlässigbar ist, gilt
41
42
IRe = IIHL
43
44
-> Re_max < VIL / IRe = 1,5 V / 0,4 mA = 3,75 kOhm
45
46
Damit ist der gültige Bereich für Re
47
48
-> 515 Ohm < Re < 3,75 kOhm
49
50
Keine leere Menge, d.h. das ist technisch machbar:
51
52
-> Wir wählen Re = 680 Ohm
53
54
Vorwiderstand Rv am Eingang des Optokopplers:
55
56
Nehmen wir einen weiteren Fehler von 10% an (Toleranz von
57
VCC, Re und den ICs, ...) und rechnen die dann benötigte
58
Spannung VIH2 für einen High-Pegel aus (müsste auch
59
alles kürzer zu rechnen sein):
60
61
VIH2 = VIH * 1,1 = 3,85 V
62
63
Dann wird ein Kollektorstrom IC2 benötige:
64
65
IC2 > IH2 = (VIH2 / Re) + IIHL = 3,85 V / 680 Ohm + 0,4 mA = 6,1 mA
66
67
Damit ist der korrigierte Vorwärtsstrom IF2 duch die
68
LED und der Vorwiderstand Rv:
69
70
71
-> IF2 > IC2 / CTRmin = 6,1 mA / 1,44 = 6 mA
72
-> Rv < (Vin - VF) / IF2 = (24 V - 1,4 V) / 6 mA = 3,77 kOhm
73
74
Wir wählen
75
76
-> Rv = 3,6 kOhm
Fehlt noch alle anderen Bedingungen (Recommended Operating Conditions, Characteristics, ...) aus den Datenblättern der ICs zu überprüfen. Das kann gerne jemand anderes machen :)
Du hast anscheinend ein vollkommen falsches Verständnis von der
Funktionsweise eines Optokopplers.
Da liegst du offenbar goldrichtig.
Die letzten Beiträge haben das ganze für mich etwas verständlicher gemacht, wie gesagt dieser Bereich der Elektronik ist absolut nicht mein Fachgebiet...
Ich habe eben mal ein Foto vom Testaufbau gemacht, und den Schaltplan etwas ausführlicher dargestellt. Ich hoffe, es ist so verständlicher.
Ich habe bereits eure Ratschläge befolgt und etwas mit den Widerständen gespielt, so wie jetzt auch gezeichnet funktioniert die Schaltung. Zwar invertiert, aber sie funktioniert. Bisher habe ich es aber nur mit einem einzelnen Optokoppler aufgebaut. Ich werde dann nochmal den Test mit allen 12 wagen, wobei ich dann wie von euch schon erwähnt meine 3,3V Spannungsversorgung beachten muss sodass ich nicht zu viel Strom verbrauche.
Im Programm durfte ich übrigens nicht den Input (in diesem Fall P00) als "INPUT_PULLUP" deklarieren. Ich habe ihn normal als "INPUT" initialisiert und es funktioniert.
Bei dem ganzen grübeln und testen kam mir neben dem Optokoppler noch eine andere Idee. Warum nutze ich nicht einfach eines dieser 24VDC Miniatur-Relais und schalte damit jeweils meine 3,3V für die Inputs des PCF8575?
Wäre solch eine Variante eventueller besser geeignet, oder war ich mit dem Optokopplern schon auf dem richtigen Weg?
denn der
ESP32 arbeitet nicht mit 5V Versorgungsspannung.
Und der Optokoppler hat seinen Arbeitswiderstand auch auf den +5V, wenn ich das richtig sehe. Das gibt vermutlich Ärger, denn im Ruhezustand des Optokopplers liegen 5V auf P00. Da sind zwar noch 470 Ohm dazwischen, aber gesund ist das nicht. Speise den 470 Ohm Widerstand besser vom VDD Anschluss der ESP Platine - und mach ihn ruhig noch ein bisschen grösser, wie oben angemerkt.
Bringt mich mal auf Trab - war da nicht irgendwas besonderes mit dem P00 Port beim ESP32?
Und der Optokoppler hat seinen Arbeitswiderstand auch auf den +5V, wenn
ich das richtig sehe.
In der Zeichnung da oben ist das nicht der Fall.
Der Widerstand R2 ist mit dem 3.3V-Ausgang der ESP32-Platine verbunden, der auch "Vcc" der PCF8575-Platine speist.
Fritzing-"Schaltpläne" sind echt mies, wie man auch oben links an der PCF8575-Platine sehen kann, wo es fast so aussieht, als wären INT und SCL miteinander verbunden.
und den Schaltplan
etwas ausführlicher dargestellt.
Der LM2596 ist ein Schaltregler und hat keine Potenzialtrennung. Daher ist der Minus der 24V-Seite mit dem Minus der 5V-Seite verbunden.
Also ist ein Optokoppler unnötig, es reicht eine Pegelanpassung über Spannungsteiler. Eventuell ist noch ein Transistor sinnvoll zur Entkopplung und als Überspannungschutz für den PCF8575-Eingang.
Der LM2596 ist ein Schaltregler und hat keine Potenzialtrennung. Daher
ist der Minus der 24V-Seite mit dem Minus der 5V-Seite verbunden.
Also ist ein Optokoppler unnötig, es reicht eine Pegelanpassung über
Spannungsteiler
Wieder was gelernt. Wäre es deiner Meinung nach also besser das Problem mit einem Spannungsteiler zu lösen, oder würde es nur die Schaltung "vereinfachen"?
Wieder was gelernt. Wäre es deiner Meinung nach also besser das Problem
mit einem Spannungsteiler zu lösen, oder würde es nur die Schaltung
"vereinfachen"?
Ein Spannungsteiler ist schon ok. Aber es kann knifflig sein, den so zu dimsionieren, daß er in allen Lebenslagen paßt. Robuster finde ich Dietrichs zweiten Vorschlag mit einem Transistor z.B. so wie im Anhang.
T1 ist ein beliebiger, kleiner npn-Transistor vom Boden deiner Bastelkiste. Ein BC547 oder 2N3904 oder 2SC1815, was du halt da hast. Die Diode D1 ist eine Schaltdiode z.B. eine 1N4148, und schützt den Transistor bei negativer Eingangsspannung. R1 begrenzt den Eingangstrom. Ich würde 47kΩ vorschlagen, für 0.5mA bei 24V Eingangsspannung. Wenn man R1 genügend leistungstark und spannungsfest macht, hält die Eingangsstufe dann auch eine Verbindung mit 230V aus. Widerstand R2 ist der Arbeitswiderstand, der ist zweckmäßigerweise als Pullup schon deinen µC integriert. Sonst nimmt man einen Wert, der bei der Betriebsspannung ca. 1mA zieht. Für 3.3V als 3.3kΩ.
In der gezeigten Schaltung muss das Sensorsignal ziemlich klein sein, damit der Transistor sicher abschaltet.
Wenn diese Schaltschwelle zu niedrig ist kann man noch einen Widerstand zwischen Basis und GND spendieren.
er schrieb Modul
alle Module die ich fand werden mit pullups am I2C verkauft.
Meistens sind die zu groß. Erst wenn mehrere solche Module am Bus hängen, fließt der empfohlene Strom. Bei so hohen Widerständen wie sie auf einem Einzelmodul meist drauf sind, kommt es auf die Kapazität der Verkabelung und die Geschwindigkeit der Busübertragung an, ob es zuverlässig genug funktioniert. Auf solche Zufälligkeiten würde ich mich nicht verlassen wollen - gerade bei 3V3.
Ansonsten sollte man den vorhandenen Widerstand (einschließlich Wert) ins Modul mit rein zeichnen, damit man den Schaltplan lesen kann.
Kurz: Ohne Angaben zu I²C Pull-Up und Buskapazität lässt sich der Schaltplan schlecht bewerten.