Bessere Helligkeitsmessung mit LED an MCU-Pin

OP #4140073
Lesenswert?

Die Helligkeitsmessung mit einer LED an einem Microcontroller-Pin ist 
ein beliebter Hack der in vielen Varianten durch das Netz geistert. Ein 
Beispiel wird auch hier beschrieben:

https://www.mikrocontroller.net/articles/Lichtsensor_/_Helligkeitssensor

Das Problem ist, dass LEDs zwar als Lichtsensoren funktionieren, aber 
nur sehr kleine Photoströme liefern (<500nA). Selbst mit einem großen 
Sense-Widerstand lassen sich kaum brauchbare Spannungen erzeugen, die 
direkt mit einem ADC ausgelesen werden können.

Daher wird häufig der Trick genutzt, dass die Sperrschichtkapazität (Und 
Eingangskapazität des GPIO) der LED aufgeladen und danach über den 
Photostrom entladen wird. Über einen Eingangspin lässt sich die 
Entladezeit messen, welche idealerweise proportional zum Photostrom ist.

Prinzipiell bastelt man sich einen Ein-Rampen Integrierenden ADC.

So weit, so gut. Wer das schon ausprobiert hat, weiss das es eher 
schlecht als recht funktioniert. Die Messung dauert sehr lange und ist 
extrem ungenau.

Ich frage mich jetzt, ob es nicht möglich ist, die Genauigkeit zu 
verbessern. Kennt jemand noch bessere Methoden?

Könnte man über den Pull-Up Widerstand Ladung injezieren und damit einen 
Sigma-Delta ADC basteln?
Gast #4140107
Lesenswert?

Tim    schrieb:
> PD schrieb:
>>> Kennt jemand noch bessere Methoden?
>> Eine echte Photodiode.
>
> Das ist unsportlich und von der Ansteuerung auch nicht einfacher :) Dann

Klingt für mich nach, sich mit Trikot und Bier ein Fußballspiel vorm 
Fernseher reinzuziehen und wenn die eigene Mannschaft gewonnen hat, zu 
prahlen wie gut man doch war und sonst nur das Unvermögen anderer zu 
erkennen. Wer sportlich sein will muß schon selbst etwas machen und 
schieben lassen hilft nicht.
OP #4140154
Lesenswert?

Ok, habe die Idee von oben mal testweise implementiert. Anbei zwei 
Oszilloskop-Screenshots.

Links der normale Single-Slope Integrierender Wandler.

Rechts die neue Version. Wenn die untere Schwelle erreicht ist, lade ich 
über einen kurzen Puls über den Pull-Up Widerstand den 
Integrationskondensator so weit auf, dass ich wieder über die Schwelle 
komme. Dadurch kann ich in der gleichen Zeit mehr Bits generieren und 
das "Komparator"-Rauschen (vom GPIO-Digitaleingang) reduzieren.

Im Prinzip entspricht das einem "Continuously-integrating converter", 
wenn ich den Wikipedia-Artikel richtig verstehe. 
(http://en.wikipedia.org/wiki/Integrating_ADC)

Gefühlt verbessert sich die Reproduzierbarkeit. Allerdings ist die 
Ladungsinjektion über den Pull-Up Widerstand nicht sehr genau und könnte 
zusätzliches Rauschen erzeugen.
Angehängte Dateien:
OP #4140157
Lesenswert?

sauber schrieb:
> Klingt für mich nach, sich mit Trikot und Bier ein Fußballspiel vorm
> Fernseher reinzuziehen und wenn die eigene Mannschaft gewonnen hat, zu
> prahlen wie gut man doch war und sonst nur das Unvermögen anderer zu
> erkennen. Wer sportlich sein will muß schon selbst etwas machen und
> schieben lassen hilft nicht.

Ganz so einfach sind Photodioden nun doch nicht zu verwenden.
#4140176
Lesenswert?

Tim    schrieb:

> Ganz so einfach sind Photodioden nun doch nicht zu verwenden.

Die sind aber um Grössenordnungen empfindlicher als LEDs.
Typisch muss man ja auch nicht alle Messprobleme direkt mit
einem "µC" erschlagen, sondern kann ja auch ein vernünftiges
analoges "Frontend" verwenden. Bei privaten Projekten sollte
ja wohl auch die Einsparung von einigen Cent (<1€) kaum eine
Rolle spielen.
Gruss
Harald
#4140194
Lesenswert?

Ich sach mal, wenn eine LED als Lichtsensor auch nur einen einzigen 
Vorteil hätte, würde man das auch in praktischen Schaltungen finden und 
nicht nur in Edelbastler-Hacks.

Eine mechanische Lösung LED+Fototransistor in einer Frontplatte ist 
vermutlich deutlich einfacher und kostengünstiger, als sich mit geringer 
Sensitivität, Reproduzierbarkeit und Störungen rumzuplagen.
#4140200
Lesenswert?

Peter Dannegger schrieb:

> Eine mechanische Lösung LED+Fototransistor in einer Frontplatte ist
> vermutlich deutlich einfacher und kostengünstiger, als sich mit geringer
> Sensitivität, Reproduzierbarkeit und Störungen rumzuplagen.

Nun, wenn man Millionen von Geräten bauen will, spielt die Einsparung
von einigen Cent schon eine Rolle. Für den Privatbastler ist das m.E.
nicht von Belang.
OP #4140208
Lesenswert?

Es handelt sich um einen Hack!

Für mich steht die Frage im Vordergrund, wie man mit einem MCU und 
möglichst wenigen externen Bauteilen Ströme im nA-Bereich messen kann.

Es gibt allerdings tatsächlich einige Anwendungen für LEDs als 
Lichtsensoren. z.B. wenn eine spezielle Spektralantwort gewünscht ist. 
Silizium ist vor allem im Infraroten empfindlich. LEDs sind für 
Wellenlängen kleiner ihres Abstrahlspektrums empfindlich. Damit ist z.B. 
eine rote LED besser an die Spektralantwort des menschlichen Auges 
angepasst als eine Silizium-PD.
OP #4140229
Lesenswert?

Peter Dannegger schrieb:
> Tim    schrieb:
>> wie man mit einem MCU und
>> möglichst wenigen externen Bauteilen Ströme im nA-Bereich messen kann.
>
> Da der Leckstrom des MC bis zu 1µA betragen kann, wirds mit nA wohl
> Essig sein.
> Vielleicht spezielle teure OPVs mit geringem Bias-Strom (OPA111: 1pA).

Guter Punkt.

Atmel gibt typ <50nA an. Die 1µA sind wahrscheinlich die Testspec im 
finalen Bauteiltest und durch das Testequipment, bzw. die Testzeit 
limitiert. Das schließt natürlich trotzdem ein Fehlbauteil nicht aus.
Für die Massenproduktion ist das wohl nichts, aber als Hack reicht es...

Wenn der Eingang auf Vcc/2 gebaised ist und man bei Raumtemperatur 
arbeitet, sollten die Leckströme zusätzlich noch einmal deutlich 
geringer ausfallen, da dann die Schutzdioden weniger Lecken.
Gast #4140254
Lesenswert?

Wie groß der Photostrom von der LED ist, hängt stark von der Type ab. 
Ein erster Schritt wäre da ggf. ein paar durchzumessen. Im Datenblatt 
findet man den Wert in der Regel nicht.

Den Vorteil den die LED als Sensor bietet ist vor allem, dass man kein 
zusätzliches Loch in der Frontplatte braucht.

Ein Möglichkeit wäre ggf. noch die Kapazität am Ausgang etwas zu 
vergrößern, so dass man etwas mehr als die Sperrschaichtkapazität hat. 
Also etwa 1-10 nF zusätzlich, ggf. über 100 Ohm isoliert. Die Spannung 
könnte man dann über den ADC messen. Über die Zeit die man der 
Photodiode lässt den Kondensator zu laden kann man den Bereich festlegen 
- die Helligkeiten gehen schließlich oft über einen großen Bereich. Es 
könnte von Vorteil sein hier vielfache von 10 ms zu nutzen um 100 Hz 
Störungen zu unterdrücken.
Gast #4140384
Lesenswert?

>Wie groß der Photostrom von der LED ist, hängt stark von der Type ab.
>Ein erster Schritt wäre da ggf. ein paar durchzumessen. Im Datenblatt
>findet man den Wert in der Regel nicht.

Das stimmt. Ich habe einige Leds für diese Anwendung untersucht:
Beitrag "led debugging"

Am meisten Photstrom haben ultrahelle rote oder gelbe LEDs gebracht.
OP #4140539
Lesenswert?

Lurchi schrieb:
> Wie groß der Photostrom von der LED ist, hängt stark von der Type ab.
> Ein erster Schritt wäre da ggf. ein paar durchzumessen. Im Datenblatt
> findet man den Wert in der Regel nicht.

Ich verwende eine $0.02 0603 rote SMD led. Also worst case... Der 
Photostrom wird wohl hauptsächlich von der Chipgröße abhängen.

> Ein Möglichkeit wäre ggf. noch die Kapazität am Ausgang etwas zu
> vergrößern, so dass man etwas mehr als die Sperrschaichtkapazität hat.
> Also etwa 1-10 nF zusätzlich, ggf. über 100 Ohm isoliert. Die Spannung
> könnte man dann über den ADC messen. Über die Zeit die man der
> Photodiode lässt den Kondensator zu laden kann man den Bereich festlegen
> - die Helligkeiten gehen schließlich oft über einen großen Bereich. Es
> könnte von Vorteil sein hier vielfache von 10 ms zu nutzen um 100 Hz
> Störungen zu unterdrücken.

Im Moment habe ich tatsächlich hauptsächlich Probleme mit geringer 
Helligkeit (<10 lx, wenn man meinem handy trauen kann). Hier scheint die 
Anfangsladung Einfluss auf die Messung zu haben, bzw. die Messung dauert 
einfach zu lange. (>200ms)

Mit einem größeren Kondensator würde das Problem nur noch schwieriger 
werden. Allerdings könnte man dann evtl. Tatsächlich den ADC verwenden. 
Der S&H Kondensator macht das system allerdings wieder schwerer 
beherrschbar. Beim Starten des ADC wird Ladung abgezogen.

Nach oben hin lässt sich ein erstaunlicher Dynamikumfang erreichen -> ca 
10klx.

Ohne LED hält sich die Ladung übrigens erstaunlich stabil auf dem Pin. 
der Leckstrom wird bei deutlich unter 50nA liegen.
OP #4140542
Lesenswert?

Harald Wilhelms schrieb:
>> Es handelt sich um einen Hack!
>
> Ein "Hack" ist m.E. die Modifikation eines bestehenden Gerätes.

Hier werden auch Bauteile in einer nicht vorgesehenen Weise verwendet.

> Hier handelt es sich eher um eine sog Kunstschaltung.
> Oder sehe ich das falsch?

Du könntest den HaD Leuten ja vorschlagen, Ihre Seite in "Kunstschaltung 
a day" umzubennenen :)
Gast #4140609
Lesenswert?

>Das kann man wahrscheinlich darüber erklären, dass die LEDs in einem
>kurzwelligeren Bereich photoempfindlich sind,

Dass es etwas mit der Wellenlänge zu tun haben könnte, daran habe ich 
auch schon gedacht.
Wenn ich mich richtig erinnere, waren die roten LEDs die ersten LEDs die 
es gab. Allerdings ist rotes Licht langwelliger als grünes oder blaues 
Licht.
Ich glaube, Silizium ist im roten Bereich empfindlicher. Es gab ja auch 
schon sehr früh IR-LEDs und blaube LEDs erst seit ein paar Jahren.
Bei meinen Versuchen hatte es mich gewundert, dass die orangen LEDs 
etwas besser waren.
Gast #4140629
Lesenswert?

Tim schrieb:
>So weit, so gut. Wer das schon ausprobiert hat, weiss das es eher
>schlecht als recht funktioniert. Die Messung dauert sehr lange und ist
>extrem ungenau.

Darauf bin ich beim Bau meines Ultra-Low-Cost Roboters gestoßen:

http://www.hobby-roboter.de/forum/viewtopic.php?f=4&t=131

Dort werden für die Linienverfolgung 2 LEDs verwendet, die jeweils 
abwechselnd als Beleuchtung und Photosensor betrieben werden.
Da vom reflektierten Licht nur wenig zurück kommt, kann der Roboter nur 
in sehr kleinen Schritten fahren. Das sieht aber trotzdem lustig aus.

Für Beitrag "led debugging" habe ich später eine 
direkte Spannungsmessung mit dem ADC eines Arduino verwendet. Mit etwas 
Filterung kommt man dann in einen Datenübertragungsbereich von bis zu 
1KBit.
OP #4140708
Lesenswert?

So. Komme jetzt von ca <5lx bis auf >30klux. Mit einem Dynamikumfang von 
12 Bit bezogen auf den Photostrom. Dafür wird ein 17bit counter mit bis 
zu 256fachem adaptivem oversampling benötigt. Maximale Samplezeit sind 
<200ms.

Ziemlich erstaunlich für eine einfache 0603 LED, keinen ADC und im 
fliegenden Aufbau. Ich werde das einmal direkt zusammenlöten, dann 
sollte die Signalqualität besser werden. Außerdem noch Source 
aufräumen...
OP #4140716
Lesenswert?

Peter Dannegger schrieb:
> Ich würde erstmal mit einem Multimeter die Kennlinie aufnehmen, was
> bessere Ergebnisse liefert, die Fotospannung oder der Sperrstrom.
>
> Kleine Ströme kann man im 0,2V Bereich messen (0,2V / 10M = 20nA).

Habe es schon versucht, aber konnte nur bei hoher Helligkeit etwas 
messen. Muss vielleicht noch einen 10M Widerstand auftreiben.

Die direkte Messung der Photospannung habe ich mit dem AVR-ADC bisher 
nicht hin bekommen.
(Firma: matzetronics) #4140832
Lesenswert?

Tim    schrieb:
> Die direkte Messung der Photospannung habe ich mit dem AVR-ADC bisher
> nicht hin bekommen.

Es wäre einen Versuch wert, einen AVR mit integriertem Opamp vor dem ADC 
zu verwenden, wie z.B. den Tiny25/45/85. Abgesehen von der wahlweisen 
Verstärkung hat man dann doch einen recht hochohmigen Eingang, lt. 
Datenblatt etwa 100 MOhm.
Gast #4140911
Lesenswert?

Peter Dannegger (peda) schrieb
>Habe es schon versucht, aber konnte nur bei hoher Helligkeit etwas
>messen. Muss vielleicht noch einen 10M Widerstand auftreiben.

>Die direkte Messung der Photospannung habe ich mit dem AVR-ADC bisher
>nicht hin bekommen.

Das sollte aber gehen, bei mir funktioniert das super. Ich stecke 
einfach eine Rote Ultrabrigt 5mm LED an einen Arduino Uno und gebe die 
Spannung aus.

Programm:
http://www.arduino.cc/en/Tutorial/AnalogReadSerial
OP #4140970
Lesenswert?

Der Weg ist das Ziel. Habe wieder etwas gelernt.

Anbei ein paar Bilder.

- Photo vom Set-Up. Die rote 0603 SMD LED scheint so ziemlich den 
kleinstmöglichen Die zu haben und ist damit eher unempfindlich. Eine 
Orange 5mm LED mit war ca. 10x empfindlicher.

- Kalibrierung gegen den Lichtsensor in meinem Handy. Wie man sieht, 
erreicht man ca. >3000:1 Dynamikumfang. Mit der 5mm LED etwas mehr. Bei 
niedrigen Lichtstärken gibt es einen Offset, da die integration 
abgebrochen werden muss. Allerdings funktionierte hier der Lichtsensor 
im Handy auch schon nicht mehr richtig.

- Oszilloskopbild des per Software implementierten continuous 
integration Wandlers.
Angehängte Dateien:
OP #4140975
Lesenswert?

Matthias Sch. schrieb:
> Tim    schrieb:
>> Die direkte Messung der Photospannung habe ich mit dem AVR-ADC bisher
>> nicht hin bekommen.
>
> Es wäre einen Versuch wert, einen AVR mit integriertem Opamp vor dem ADC
> zu verwenden, wie z.B. den Tiny25/45/85. Abgesehen von der wahlweisen
> Verstärkung hat man dann doch einen recht hochohmigen Eingang, lt.
> Datenblatt etwa 100 MOhm.

Dumm, dass die LED in meinem Set-up an den falschen Pins hängt.

Hängt der Opamp auch an den single-Rail Eingängen?
OP #4142331
Lesenswert?

chris_ schrieb:
>>- Oszilloskopbild des per Software implementierten continuous
>>integration Wandlers.
>
> Sieht gut aus. Wie genau funktioniert Dein Wandler?

Statt den Kondensator nur einmal ab VCC zu entladen, wird der 
Kondensator periodisch durch einen kurzen Puls über den Pull-Up 
Widerstand wieder aufgeladen und bis zur Schaltschwelle entladen. Diese 
Messung wird für 100ms wiederholt.

Das hat einige Vorteile:

 - Die Rampe wird jetzt nur noch über 0.5V gefahren (Eingangshysterese 
der AVR Pins). Dadurch sinkt die Messzeit und es können mehrere 
Messungen gemittelt werden.
 - Durch das Mitteln von vielen Messungen wird Quantisierungsrauschen 
und überlagertes Rauschen am Eingang reduziert.
 - Die LED, bzw. der Eingangspin ist jetzt im Mittel auf ca 0.5VCC 
gebiased. Dadurch verbessert sich die Linearität deutlich (Oben sieht 
man, dass der Entladevorgang ab VCC sehr nichtlinear ist). Außerdem 
sinken die Leckströme über die Clamp-Dioden am I/O Pin.

Etwas unklar ist noch, wie stabil die Ladungsinjektion über den Pull-Up 
ist. Bereits ein oder zwei Taktzyklen reichen aus, um einen Spannungshub 
von >0.5V zu erreichen.

Das ganze ist ziemlich timingkritisch. Werde es wohl noch in Assembler 
umsetzen müssen, um einige Timingfehler auszumerzen.
Gast #4142407
Lesenswert?

>Statt den Kondensator nur einmal ab VCC zu entladen, wird der Kondensator 
periodisch durch >einen kurzen Puls über den Pull-Up Widerstand wieder aufgeladen 
und bis zur Schaltschwelle >entladen. Diese Messung wird für 100ms wiederholt.

Klingt fast so ahnlich wie ein Sigma-Delta Wandler.
Der Algorithmus waere:
Ist die Spannung 0 => kurzer high Puls
Ist die Spannung 1 => kurzer low Puls
Output=Pulse mitteln

Damit muesste die Wandlung noch schneller werden.
OP #4142415
Lesenswert?

chris schrieb:
>>Statt den Kondensator nur einmal ab VCC zu entladen, wird der
> Kondensator
> periodisch durch >einen kurzen Puls über den Pull-Up Widerstand wieder
> aufgeladen
> und bis zur Schaltschwelle >entladen. Diese Messung wird für 100ms
> wiederholt.
>
> Klingt fast so ahnlich wie ein Sigma-Delta Wandler.
> Der Algorithmus waere:
> Ist die Spannung 0 => kurzer high Puls
> Ist die Spannung 1 => kurzer low Puls
> Output=Pulse mitteln
>
> Damit muesste die Wandlung noch schneller werden.

Ja, prinzipiell ist es ein Sigma-Delta Wandler. Der "Low-Puls" ist in 
diesem Fall ein Null-Puls. Die Hysterese der I/O-Eingänge verhindert 
eine feiner aufgelöste Taktung.
#4147736
Lesenswert?

Ich experimentiere schon länger in diese Richtung, auch mit RGB-LEDs, 
ausschließlich an ATMEL-Controllern. Habe dabei auch schon Erfolg 
gehabt, aber auch Fehlschläge erlebt, hier meine Erfahrungen:

Der Analog-Komparator der AVRs ist für solche Messungen ganz gut 
brauchbar. Rote, Orangene und gelbe LEDs sind lichtempfindlicher als 
Grüne und Blaue. Grüne und Blaue reagieren nicht auf langwelliges Licht. 
Ein kleiner Kondensator 10pF .. 33pF parallel zur LED macht die 
Messergebnisse, bei der Zeitmessungs-Methode, stabiler, verlängert die 
Messzeit aber erheblich. Mittelwertbildung mehrerer Messungen macht die 
Messung deutlich besser (Eventuell gleitender Mittelwert, wenn oft ein 
aktueller Wert benötigt wird). Bei der Messung kleiner Lichtstärke haben 
Leckströme der LED einen großen Einfluss, die Exemplarstreuungen der 
LEDs sind erheblich, hier kann selektieren helfen, die mit der längsten 
Messzeit, bei Dunkelheit, ist die Beste. Die Leckströme sind deutlich 
temperaturabhängig, hier kann der interne Temperatursensor, den viele 
AVRs haben, und eine Korrekturtabelle helfen.

Recht gute Ergebnisse habe ich mit folgender Methode erzielt, unter 
Verwendung des ADC:

LED laden, dazu ADC-Pin auf Ausgang, auf diesem Kanal eine ADC-Messung 
starten (läd den S/H-Kondensator auf eine definierte Spannung), ADC-Pin 
auf Eingang schalten (Beginn Messzeit), definierte Zeit warten 
(Messzeit), weitere ADC-Messung starten, liefert das Ergebnis. Die 
Messzeit sollte der Helligkeit angepasst werden, eventuell automatisch. 
Wärend dem Mess-Ablauf möglichst nicht auf einen anderen ADC-Kanal 
umschalten, das verschleppt Ladungen, und macht die Messung so 
unsicherer. Falls dies unvermeidlich ist, z.B. Messung an mehreren LEDs, 
kann der Einfluss aber ganz gut rausgerechnet werden.

Mit freundlichen Grüßen - Martin

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren