Hallo zusammen,
ich möchte gern eine Spannung 0-10V (von einer Lichtsteuerung) über
einen analogen Portpin eines ATmega328 einlesen (bzw. das entsprechende
Spannungsverhältnis, da der 328 ja mit 5V läuft).
Ich weiss, dass ich das mit einem Spannungsteiler am einfachsten
realisieren kann, aber würde auch gern eine galvanische Trennung haben.
Daher würde ich gern den Optokoppler PC817 verwenden. Die Grundschaltung
wäre sicherlich die 3. (ganz rechts) hier aufgezeigte Möglichkeit mit
dem Pullup an der Kathode :
http://www.mikrocontroller.net/articles/Datei:Optokoppler_grundschaltungen.png
2 Fragen habe ich jedoch, bei denen ich nicht genau weiss, wie ich es am
besten anstellen soll und natürlich möchte ich auch nicht die Messung
durch irgendwelchen unüberlegten Murks ungenau werden lassen :
1.: Das Datenblatt des PC817 gibt einen maximalen Ausgangsstrom von 50mA
an, was für den ATmega (max. 40mA) zu viel ist. Wie begrenze ich diesen
Strom am besten ? Einen Widerstand zwischen Kathode und Portpin ? Wenn
ja, wie groß ? R=U/I ist mir bekannt, aber soll ich eher knapp
kalkulieren oder großzügig ? Oder sollte ich den Eingangswiderstand an
OK1 erhöhen, sodass die LED schwächer leuchtet und sich dadurch indirekt
auch der Ausgangsstrom verringert werden müsste ?
2.: Kann ich anstatt des extra 10K Pullups den internen Pullup (ich
glaube 20K) verwenden ? Also funktioniert der überhaupt am analogen
Eingang oder nur, wenn der Pin als digitaler Pin verwendet wird ?
Und wenn der interne Pullup funktionieren würde, sollte ich den dann
auch tatsächlich in dem Fall nutzen, wenn ich einen extra Widerstand
zwischen Kathode und IC-Pin einbaue ? In dem Fall wäre der Pullup ja
erst "nach" diesem Widerstand platziert und nicht "davor" sprich nicht
mehr direkt an der Kathode angeschlossen.
Wäre toll, wenn mir jemand helfen könnte ;) !
Max schrieb:> Daher würde ich gern den Optokoppler PC817 verwenden.
Das bringts nicht, denn so ein normaler Optokoppler ist sehr unlinear.
Da passiert erstmal bis etwa 1,5V gar nichts und dann fängt die interne
LED sehr schnell an zu leuchten.
Optokoppler für Analogsignale sind recht teuer und benötigen auch auf
der Geberseite zumindest eine Stromversorgung, die du dann auch wieder
galvanisch trennen müsstest.
Überlege nochmal, ob du auf die galv. Trennung verzichten kannst.
Ich werfe da mal den IL300 in den Raum...
Der ist zwar nicht ganz unkompliziert, kann aber mit entsprechender
Beschaltung die Aufgabe erfüllen.
Die Schaltung muss leider dem gerade egatterten Typ (-G,-H,... siehe
Datenblatt) mit den Verstärkunsfaktoren in angepasst werden.
Ich hatte neulich die Gelegenheit, einen kurzen Blick auf eine
"professionelle" (China-?)Platine zu werfen, die ein 0-10V
Eingangssteuersignal in PWM wandelt (um MOSFETs zu treiben). Da war
tatsächlich ein PC817 verbaut, der von einem ADC gemessen wurde und
dieser dann wieder mit einem PWM-IC verbunden war. Viel mehr außer ein
paar Widerständen war da sonst nicht drauf.
Grundsätzlich scheint das also schon zu funktionieren. Da man damit aber
nur Licht dimmt, fällt das schlechte Analogsignal vielleicht nicht so
auf (das menschliche Auge hat ja keine lineare Wahrnehmung, was
Helligkeit anbelangt) ?
Matthias Sch. schrieb:> Das bringts nicht, denn so ein normaler Optokoppler ist sehr unlinear.> Da passiert erstmal bis etwa 1,5V gar nichts und dann fängt die interne> LED sehr schnell an zu leuchten.
Na gut, aber vielleicht könnte man dieses unlineare ja eventuell
softwareseitig lösen ? Also z.B. mit einer Umrechnungstabelle ? Die 10
Bit Genauigkeit des ATmega328 benötige ich sowieso nicht; 7 oder 8 Bit
würden auch ausreichen.
> Optokoppler für Analogsignale sind recht teuer und benötigen auch auf> der Geberseite zumindest eine Stromversorgung, die du dann auch wieder> galvanisch trennen müsstest.
Da hatte ich vor Start dieses Threads folgende Meinung gefunden:
Beitrag "Re: Galvanisch getrennte Spannungsmessung"> Überlege nochmal, ob du auf die galv. Trennung verzichten kannst.
Die Trennung möchte ich eigentlich schon, da das Steuersignal von
"extern" kommt und ich keinen Einfluß darauf habe. Bei Überspannung -
z.B. wenn irgendso ein Fachmann meint, dass 12V anstatt max. 10V auch
noch gut sind - würde ein Spannungsteiler schon zu viel Spannung bringen
und der ATmega geht kaputt. Außerdem finde ich das mit einem Optokoppler
auch deshalb elegant, weil man damit gleich noch einen einfachen
Verpolungsschutz hat (glaube ich zumindest; ist ja nur eine LED im
Eingang?).
@Frank K. und Frank M. : vielen Dank für die Tipps; das wären schonmal
zwei Alternativlösungen, falls die "keep it simple" - Idee mit dem PC817
doch nicht brauchbar ist ;)
Max schrieb:> Na gut, aber vielleicht könnte man dieses unlineare ja eventuell> softwareseitig lösen ? Also z.B. mit einer Umrechnungstabelle ? Die 10> Bit Genauigkeit des ATmega328 benötige ich sowieso nicht; 7 oder 8 Bit> würden auch ausreichen.
Murks, jede Temperaturaenderung macht dir deine Messung kaputt.
Entweder Analogen Optokoppler nehmen (IL300) oder zuerst digitalisieren
mittels ADC und diese Werte digital ueber Optokoppler auf die andere
Seite uebertragen. Man kann auch mittels Komparator und D-Flipflop einen
Deltasigma modulator aufbauen und dessen Ausgang (Digital) mittel OK
galvanisch trennen. Auf der anderen Seite dann RC Glied nehmen und
wieder ein Analoges Signal erzeugen, so haben es wahrscheinlich die
Chinesen gemacht.
Max schrieb:> Na gut, aber vielleicht könnte man dieses unlineare ja eventuell> softwareseitig lösen ? Also z.B. mit einer Umrechnungstabelle ?
Was willst Du da umrechnen? Die interne LED des Optokopplers fängt bei
ca. 1,5V an zu leuchten, und dabei bleibt es, weil der Rest der Spannung
am notwendigen Vorwiderstand abfällt. Wenn Du den wegläßt, brennt die
LED durch. Du kriegst also garnicht mit, wenn die Spannung auf der
Eingangsseite auf 10V ansteigt.
Max schrieb:> Die Grundschaltung> wäre sicherlich die 3. (ganz rechts) hier aufgezeigte Möglichkeit
Sicherlich nicht, denn das ist ein digitaler Optokoppler.
Du kannst 0.1V auf Eingangsseite nicht zum Ausgang signalisieren, du
brauchst in jedem Fall eine Hilfsspannung auf Eingangsseite die (weil es
ja galvanisch getrennt sein soll) von der Versorgung des ATmega328
galvanisch getrennt sein muss.
Auf welche Art du zu einer Spannungsversorgung der Sendeseite des
Optokopplers kommen kannst, wissen wir nicht, ob deine 0-10V Quelle eine
Betriebsspannung zur Verfügung stellt, es eine Batterie sein darf, ein
extra Trafo und Netzteil her muss oder du per Solarzelle oder
DC/DC-Wandler eine Spannung überträgst. Es müssen nur wenige Milliampere
sein, so 20mA reichen locker aus, bei 3 bis 24V, je nach dem was
verfügbar ist.
Erst wenn du diese Hilfsspannung hast, kann man weiterreden.
Methoden ohne Hilfsspannung (Fluxgate-Förster oder so) sind für dich
unerreichbar und viel teurer und ungenauer.
Sensor schrieb:>> Was willst Du da umrechnen? Die interne LED des Optokopplers fängt bei> ca. 1,5V an zu leuchten, und dabei bleibt es, weil der Rest der Spannung> am notwendigen Vorwiderstand abfällt. Wenn Du den wegläßt, brennt die> LED durch. Du kriegst also garnicht mit, wenn die Spannung auf der> Eingangsseite auf 10V ansteigt.>
Der Vorwiderstand muss natürlich mindestens so groß sein, dass die LED
die max. Eingangsspannung auch aushält; versteht sich ja von selbst.
Aber die LED und das Photoelement im Optokoppler sind doch nicht
"digital". Die LED kann doch verschieden hell leuchten (wenn ich anstatt
10V nur 5V anlege, muss sie ja dunkler werden, da der Vorwiderstandswert
fix ist und in dem Fall für 5V eigentlich viel zu groß) - sonst wäre
doch überhaupt keine analoge Übertragung möglich. Wie gut oder schlecht
das bezüglich der Genauigkeit/Linearität klappt, ist natürlich mal noch
eine andere Frage ...
Helmut Lenzen schrieb:> Entweder Analogen Optokoppler nehmen (IL300) oder zuerst digitalisieren> mittels ADC und diese Werte digital ueber Optokoppler auf die andere> Seite uebertragen. Man kann auch mittels Komparator und D-Flipflop einen> Deltasigma modulator aufbauen und dessen Ausgang (Digital) mittel OK> galvanisch trennen. Auf der anderen Seite dann RC Glied nehmen und> wieder ein Analoges Signal erzeugen, so haben es wahrscheinlich die> Chinesen gemacht.
Auf der einen Seite war tatsächlich nur ein Vorwiderstand und die beiden
OK-Eingänge des PC817. Der Rest war auf der "anderen" Seite (hatte ein
gemeinsames GND).
Der Optokoppler-Ausgang war direkt über Widerstände (wahrscheinlich
Pullup und Vorwiderstand) mit einem TSSOP-Bauteil verbunden. Da war das
Logo von ST drauf und eine Bezeichnung "DC121" (oder so ähnlich). Das
habe ich zwar im Internet nicht wieder gefunden, aber es gibt von TI
einen "ADC121" - vielleicht ist das was baugleiches. Und dieses Teil war
dann nur noch mit einem 8 Pin-IC verbunden und dieser mit einem MOSFET.
Mich hatte eben die Einfachheit begeistert, aber wahrscheinlich taugt
diese Konstruktion wohl doch nicht viel. Wäre ja auch zu schön gewesen
;)
MaWin schrieb:> Du kannst 0.1V auf Eingangsseite nicht zum Ausgang signalisieren
Das bei angelegten 0,1V nichts übertragen wird, weil die OK-LED da nicht
leuchtet, sehe ich ein.
Das ganze wurde zwar als "0-10V" bezeichnet, aber wahrscheinlich wäre
"1,5V-10V" o.ä. treffender. Tatsächlich gibt es auch verschiedentlich
die Bezeichnung "1-10V". Die ausgegebene PWM ist ja auch invertiert,
d.h. bei 0V sind es 100% Duty Cycle und bei 10V (oder vielleicht auch
nur 9V) 0%. Das die PWM überhaupt erst ab 1,5/2V kleiner als 100% wird,
fällt wahrscheinlich nicht auf.
> Auf welche Art du zu einer Spannungsversorgung der Sendeseite des> Optokopplers kommen kannst, wissen wir nicht
Das ist ein Steuersignal, mit dem zumindest früher irgendwann mal
dimmbare Lampen, Leuchtstoffröhren usw. geregelt wurden. Das kommt wohl
aus der Haus-/Bühnentechnik bevor das auf digital (z.B. DMX, KNX, DALI
o.ä.) umgestellt wurde, aber so genau weiss ich es jetzt auch nicht.
Jedenfalls gibts da keine zusätzliche Spannungsversorgung der
OK-Sendeseite, sondern die paar mA für die LED werden direkt aus der
Signalleitung entnommen.
Max schrieb:> Das bei angelegten 0,1V nichts übertragen wird, weil die OK-LED da nicht> leuchtet, sehe ich ein.> Das ganze wurde zwar als "0-10V" bezeichnet, aber wahrscheinlich wäre> "1,5V-10V" o.ä. treffender. Tatsächlich gibt es auch verschiedentlich> die Bezeichnung "1-10V".
Sicher, aber du schriebst 0-10V.
> Die ausgegebene PWM ist ja auch invertiert,
und jetzt schreibst du PWM.
Ja was isses denn nu ?
PWM wäre digital und kann als ein/aus Signal problemlos über den
Optokoppler übertragen werden und erst auf Empfängerseite zu einem 0-5V
Analogsignal verwandelt, oder auch direkt vom uC eingelesen werden.
MaWin schrieb:> Ja was isses denn nu ?>> PWM wäre digital und kann als ein/aus Signal problemlos über den> Optokoppler übertragen werden und erst auf Empfängerseite zu einem 0-5V> Analogsignal verwandelt, oder auch direkt vom uC eingelesen werden.
... das habe ich eigentlich in meinen Beiträgen weiter oben schon
gesagt: ich habe neulich einen Blick auf eine Platine werfen können,
welche diese 0-10V Eingangssignalspannung mittels PC817 und
nachgeschalteten ADC-IC in eine PWM-Ausgabe wandelt (z.B. 5V
Eingangsspannung => 50% PWM Duty Cycle).
Also vergleichbar mit dem, was ich machen möchte - nur das der ADC bei
mir eben schon direkt im ATmega ist. Grundsätzlich scheint es also
möglich, aber ich weiss nicht, in welcher Genauigkeit die Messung
erfolgt und welche Widerstandswerte ich mit welcher Beschaltung (siehe
obersten Beitrag) ich für ein optimales Messergebnis verwenden sollte.
Max schrieb:> ich habe neulich einen Blick auf eine Platine werfen können,> welche diese 0-10V Eingangssignalspannung mittels PC817 und> nachgeschalteten ADC-IC in eine PWM-Ausgabe wandelt (z.B. 5V> Eingangsspannung => 50% PWM Duty Cycle).
Mach mal einen Schaltplan und lass die Prosa weg.
Helmut Lenzen schrieb:> Mach mal einen Schaltplan und lass die Prosa weg.
Es war genau wie diese Grundschaltung (ganz rechts, der PullUp könnte
aber auch ein Pulldown gewesen sein) :
http://www.mikrocontroller.net/articles/Datei:Optokoppler_grundschaltungen.png
D.h. das 0-10V Signal war mit Vorwiderstand direkt am OK angeschlossen
sprich Plus und Minus an U_EIN und GNDA. Der ganze andere Rest war
galvanisch getrennt auf der anderen Schaltungseite. U_AUS ging über
mind. einen Widerstand an einen ADC (eventuell "ADC121").
Auf dieser Seite gab es natürlich auch eine eigene Betriebsspannung, es
war ein 78irgendwas verbaut - das GND war aber jedenfalls nicht mit GNDA
verbunden, was durch die Massefüllung gut erkennbar war. Der Rest der
Schaltung ist für mich nicht weiter von Interesse; vom ADC ging es
(wahrscheinlich per SPI) zu einem achtbeinigen PWM-IC und von dort ans
MOSFET-Gate. Mehr war nicht und mich interessiert auch nur der Teil vom
OK zum ADC und nicht, was dann mit dem digitalen Singnal passiert.
Max schrieb:> ich habe neulich einen Blick auf eine Platine werfen können,> welche diese 0-10V Eingangssignalspannung mittels PC817 und> nachgeschalteten ADC-IC in eine PWM-Ausgabe wandelt (z.B. 5V> Eingangsspannung => 50% PWM Duty Cycle).
Also hast du kein PWM, und wenn die Schaltung vor dem Optokoppler wäre,
müsstest du eine Versorgungsspannung vor dem Optokoppler bereitstellen.
Du kommst also so oder so nicht um eine Versorgungsspannung vor dem
Optokoppler drumrum.
Einzige Lösung wäre eine Schaltung die mit minimal 1.5V und wohl wenigen
Milliamperes auskommt und die LED im Optokoppler blitzen lässt, also ein
U/F Konverter Spannung in Frequenz. Dann kann man gleich in PWM wandeln.
Wenn man eine LED in den Gegenkopplungskreis eines Opamps baut, kann man
sie ein wenig linearisieren, das hat Elektor früher mal im Formant
Synthi gemacht, um mit LED Signale wie Sinus und Dreieck zu
visualisieren. Aber das bedeutet noch nicht, das der Phototransistor auf
der anderen Seite des OK auch linear arbeitet. Ausserdem bräuchtest du
dann doch wieder auf der Eingangsseite eine Versorgung für den OpAmp.
'DC121' ? Hmm, Evtl. haben die Chins da einen simplen 74121 Monoflop
benutzt und statt des zeitbestimmenden Widerstandes den OK genommen? Da
kommt dann schon so etwas wie PWM raus, lineare Beziehungen kann man da
aber nicht erwarten.
Matthias Sch. schrieb:> 'DC121' ? Hmm, Evtl. haben die Chins da einen simplen 74121 Monoflop> benutzt und statt des zeitbestimmenden Widerstandes den OK genommen? Da> kommt dann schon so etwas wie PWM raus, lineare Beziehungen kann man da> aber nicht erwarten.
Wahrscheinlich habe ich Depp mir die falsche Nummer gemerkt, denn einen
"DC121" gibts von ST nicht. Rechts oben stand auf dem Bauteil noch eine
andere dreistellige Zahl, die ich als Chargennummer o.ä. abgetan hatte
:(
Nach etwas Recherche könnte es von ST auch der LM339 ("Low power quad
voltage comparator") gewesen sein, wobei aber "LM" definitiv nicht drauf
stand. Genau wie auf dem Bild, was ich über die Google-Bildersuche
gefunden habe :
http://www.icver.com/images/PIC/L/LM/LM339%28ST%29.JPG
Könnte also sein, dass es ein LM339 war und dieser soweit ich das
verstehe die U_AUS vom OK mit seiner eigenen Betriebsspannung vergleicht
und das Ergebnis dann digital weiter meldet.
Da die Messungenauigkeit aber wohl schon direkt im OK entsteht, kommt es
eigentlich auch nicht mehr darauf an, was man da noch "hinterher" macht.
Wahrscheinlich werde ich also wohl doch auf eine der vorgeschlagenen
Lösungen (IL300 oder externen ADC mit SPI-Interface + OKs) setzen
müssen.
Max schrieb:> Da war> tatsächlich ein PC817 verbaut, der von einem ADC gemessen wurde und> dieser dann wieder mit einem PWM-IC verbunden war.
Dann wird aber die Reihenfolge sein:
ADC -> PWM-IC -> PC817 -> MOSFET
D.h. die Trennung erfolgt als digitales Signal.
Ich hab sowas ähnliches mal gemacht:
0..5V -> ATtiny13 -> PC357 -> ATmega8
Die Datenübertragung erfolgte ähnlich einer IR-FB, d.h. lange Pulse =
1-Bit, kurze Pulse = 0-Bit.