Forum: Analoge Elektronik und Schaltungstechnik Spannung messsen mit PC817 und ATmega


von Max (Gast)


Lesenswert?

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 ;) !

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

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.

von Frank K. (fchk)


Lesenswert?

Max schrieb:
> 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 :

Die normalen Optokoppler können nur ein-aus richtig gut. "Analoge" 
Optokoppler sind selten und teuer.

Also: Externen ADC mit SPI-Interface verwenden:

http://www.reichelt.de/ICs-MCP-3-5-/MCP-3201-CI-SN/3/index.html?ACTION=3&GROUPID=5472&ARTICLE=90075&SEARCH=mcp3&OFFSET=500&WKID=0&;

SPI-Interface galvanisch trennen (das ist einfach, weil es digital ist)

http://www.reichelt.de/ICs-ADC-ADXRS-/ADUM-1401-ARW/3/index.html?ACTION=3&GROUPID=5458&ARTICLE=107981&SEARCH=adum1401&OFFSET=500&WKID=0&;

DC-DC-Wandler verwenden, um den ADC und die ADC-Seite des Isolators zu 
versorgen, dann funktioniert der ADC nämlich auch, wenn keine Spannung 
anliegt

http://www.reichelt.de/Wandler-Module-DC-DC/TMA-0505S/3/index.html?ACTION=3&GROUPID=4956&ARTICLE=120443&OFFSET=500&WKID=0&;

von Frank M. (duesentrieb72)


Lesenswert?

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.

von Max (Gast)


Lesenswert?

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 ;)

von Helmut L. (helmi1)


Lesenswert?

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.

von Sensor (Gast)


Lesenswert?

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.

von MaWin (Gast)


Lesenswert?

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.

von Max (Gast)


Lesenswert?

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.

von MaWin (Gast)


Lesenswert?

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.

von Max (Gast)


Lesenswert?

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.

von Helmut L. (helmi1)


Lesenswert?

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.

von Max (Gast)


Lesenswert?

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.

von MaWin (Gast)


Lesenswert?

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.

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

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.

von Max (Gast)


Lesenswert?

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.

von Carlos (Gast)


Lesenswert?

Du kannst auch einen Isolierverstärker nutzen wie:
http://www.ti.com/lit/ds/symlink/amc1100.pdf

von Peter D. (peda)


Lesenswert?

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.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.