Forum: Analoge Elektronik und Schaltungstechnik Fototransistor BPW40 [un]empfindlicher machen


von Detlev A. (dede67) Flattr this


Lesenswert?

Moin!
Ich habe an einem AnalogPin eines ATmega328s einen BPW40 hängen und 
möchte damit geringe Helligkeiten messen.
Mich interessiert nur solche Helligkeit, ab der man das Licht 
einschalten möchte. Und in diesem Helligkeitsbereich hätte ich gerne 
möglichst viele Abstufungen. Die höheren Werte interessieren mich nicht 
- da darf er gerne übersteuern.

Lege ich den Kollektor des BPW40 an +5V und den Emitter über einen 
10KOhm-Widerstand an GND, liefert mir der analogRead() am Emitter einen 
Wert von 6 für die maximale Helligkeit, ab der es für mich spannend 
wird.
Sechs brauchbare von 1024 möglichen Werten sind mir entschieden zu 
wenig.

Ersetze ich den 10KOhm- durch einen 100KOhm-Widerstand, bekomme ich vom 
analogRead() dafür immerhin den Wert 60 gemeldet. Das ist schon besser. 
Allerdings erkaufe ich diese höhere Auflösung im interessanten Bereich 
mit einer deutlich trägeren Reaktionszeit auf Helligkeits-Änderungen.

Hat jemand hier eine Idee, wie ich die Auflösung weiter verbessern kann, 
ohne die Reaktionszeit weiter zu verschlechtern?
Und das Ganze möglichst mit minimalem Bauteilbedarf.

Vielen Dank im voraus,
  Detlev

: Verschoben durch Moderator
von Falk B. (falk)


Lesenswert?

@Detlev Ahlgrimm (dede67)

>Lege ich den Kollektor des BPW40 an +5V und den Emitter über einen
>10KOhm-Widerstand an GND, liefert mir der analogRead() am Emitter einen
>Wert von 6 für die maximale Helligkeit, ab der es für mich spannend
>wird.
>Sechs brauchbare von 1024 möglichen Werten sind mir entschieden zu
>wenig.

In der Tat.

>Ersetze ich den 10KOhm- durch einen 100KOhm-Widerstand, bekomme ich vom
>analogRead() dafür immerhin den Wert 60 gemeldet. Das ist schon besser.

Und vor allem linear! 10facher Arbeitswiderstand = 10facher Meßwert bei 
gleicher Helligkeit/Photostrom.

>Allerdings erkaufe ich diese höhere Auflösung im interessanten Bereich
>mit einer deutlich trägeren Reaktionszeit auf Helligkeits-Änderungen.

Glaub ich nicht so recht, selbst mit 100k sind das nur Millisekunden.

>Hat jemand hier eine Idee, wie ich die Auflösung weiter verbessern kann,
>ohne die Reaktionszeit weiter zu verschlechtern?

Wie groß ist denn deine Reaktionszeit und wie mißt du sie? Hast du noch 
einen großen Kondensator an das Pin geschaltet?

Aber auch 60 LSB sind ziemlich wenig, das sind nicht mal 10% vom 
Meßbereich. Nimm 1MOhm, dann hast du 600/1024 LSB, das ist OK.

: Bearbeitet durch User
von Wolfgang (Gast)


Lesenswert?

Detlev A. schrieb:
> Ich habe an einem AnalogPin eines ATmega328s einen BPW40 hängen und
> möchte damit geringe Helligkeiten messen.

Du solltest beide Anschlüsse des BPW40 mit deiner Schaltung verbinden. 
Sonst ist das eine Hausnummer.

Schaltplan?

von Peter R. (Gast)


Lesenswert?

Der AD-Wandler der atmegas fordert eigentlich einen Innenwiderstand der 
Signalquelle von weniger als 10kOhm. Da könnten die 100kOhm schon zu 
groß sein und die Spannung wird durch den Eingangswiderstand des 
Wandlers bedingt anstatt des 100-kOhm Widerstands. Ein 0,1µF- 
Folienwiderstand parallel zu den 100 kOhm (oder ein µF Elko) wäre eine 
Lösung, da der für die Lesezeit des Wandlers die Spannung dann konstant 
hält.

Wieso brauchst Du für die Helligkeitsmessung bei Raumbeleuchtung eine 
schnelle Reaktion? Da würde doch jede Person, die sich im Bereich des 
Sensors bewegt,zum Flackern der Beleuchtung führen.

von Detlev A. (dede67) Flattr this


Lesenswert?

@Falk Brunner (falk): Danke für die Antwort.
Unter der folgenden URL ist meine Projektseite zu finden: 
http://dede67.bplaced.net/Arduino/Nachtlicht/Nachtlicht-S2.html#Fototransistor_statt_Fotowiderstand

Da findet sich u.a. das verwendete Messprogramm.
Und mit deinem "selbst mit 100k sind das nur Millisekunden" liegst du 
durchaus richtig. Es sind sechs Millisekunden bei 100KOhm statt einer 
bei 10KOhm. Allerdings sind mir eigentlich bereits sechs Millisekunden 
zu viel.

Detlev

: Bearbeitet durch User
von Wolfgang (Gast)


Lesenswert?

Falk B. schrieb:
> Und vor allem linear! 10facher Arbeitswiderstand = 10facher Meßwert bei
> gleicher Helligkeit/Photostrom.

Linear wird das nur, wenn der BPW40 im Kurzschluss betrieben wird, d.h. 
indem der ADC die Ausgangsspannung von einem TIA bekommt, der aus dem 
(Kurzschluss-)Photostrom eine Spannung macht.

von micha (Gast)


Lesenswert?

Ah, hättest gleich sagen können, dass du in der "Dunkel"-Pause einr 
PWM-LED Beleuchtung die Intensität des Umgebungslichts messen willst. 
Die Frage ist 1. wozu? 2. sicher dass die LEDs nicht nachleuchten?

Wäre es eventuell nicht sinnvoller eine "Soll-" Lichtstärke vorzugeben 
und dann darauf zu regeln ? Oder einfach einen zweiten Sensor ohne 
direkte Einstrahlung zu nehmen?

von micha (Gast)


Lesenswert?

oder, wenn es um eine automatische (Bewegungsmelder gesteuerten) 
Treppenbeleuchtung geht, die nach x Minuten wieder aus geht, die 
Intensität des Umgebungslichts als laufenden Mittelwert der letzten 10 
min vor Betätigung?

von Detlev A. (dede67) Flattr this


Lesenswert?

@micha (Gast): eine Soll-Lichtstärke funktioniert deswegen nicht, weil 
die LEDs bei Schummerlicht maximal und bei Dunkelheit minimal 
angesteuert werden sollen.
Der Ansatz mit einem Sensor, der jenseits des beleuchteten Bereiches 
misst, würde mindestens zu hässlichen Strippen durchs Treppenhaus 
führen..... außerdem gibt es dort nicht nur eine mögliche /externe 
Lichtquelle/.

von ArnoR (Gast)


Lesenswert?

Detlev A. schrieb:
> Hat jemand hier eine Idee, wie ich die Auflösung weiter verbessern kann,
> ohne die Reaktionszeit weiter zu verschlechtern?

Betreib die hochohmige Variante mit einer pnp-Kaskode.

von Georg M. (g_m)


Lesenswert?

Worum geht’s? LED-Treppenlicht bzw. PIR-LED-Nachtlicht?
Dann fade-out statt abrupt-off.

von Falk B. (falk)


Lesenswert?

@ ArnoR (Gast)

>> Hat jemand hier eine Idee, wie ich die Auflösung weiter verbessern kann,
>> ohne die Reaktionszeit weiter zu verschlechtern?

>Betreib die hochohmige Variante mit einer pnp-Kaskode.

Die Zeiten sind vorbei. Heute nimmt man einen passenden OPV als TIA und 
fertig. Mit der diskreten Lösung spart man weder Zeit, Geld noch 
erreicht man ein besseres Ergebnis.

von Detlev A. (dede67) Flattr this


Lesenswert?

@Georg M. (g_m): ja, das auch :-)
Es geht um eine Treppen-Beleuchtung in einem Einfamilienhaus - nicht um 
ein quasi öffentliches Treppenhaus in einem Mehrfamilienhaus.

Weil uns eine zu helle Treppen-Beleuchtung bei offener Schlafzimmertür 
stören würde, wenn wir schon im Bett liegen und Sohnemann mitten in der 
Nacht nachhause kommt, sollen die LEDs dann gerade hell genug 
angesteuert werden, um die Treppe noch sicher benutzen zu können.
Gleichzeitig sollen die LEDs, wenn es im Winter ab 16:00 Uhr langsam 
dunkler wird, die bisherige Treppen-Beleuchtung überflüssig machen (und 
in diesem Fall für maximale Helligkeit angesteuert werden).

Alles dies ist noch kein sonderliches Problem.... das Problem entsteht, 
wenn sich das Umgebungslicht ändert, nachdem die LEDs bereits 
eingeschaltet wurden.
Dafür war die erste Idee, die LEDs vor einer Messung für eine 
Millisekunde auszuschalten, das Umgebungslicht zu messen, um dann neu zu 
entscheiden, ob (und wenn ja, wie hell) die LEDs nun angesteuert werden 
sollen.
Eine Millisekunde lang abgeschaltete LEDs sieht man noch nicht, sechs 
Millisekunden fallen auf und stören.

von Äxl (geloescht) (Gast)


Lesenswert?

probier doch in setup()
1
analogReference(INTERNAL) 
2
analogReference(INTERNAL1V1)

https://www.arduino.cc/reference/en/language/functions/analog-io/analogreference/


Äxl

von Detlev A. (dede67) Flattr this


Lesenswert?

Äxl (geloescht) schrieb:
> probier doch in setup()analogReference(INTERNAL)
Das wäre tatsächlich einen Versuch wert.
Wobei sich da die Frage stellt, ob der Chip es langfristig übel nimmt, 
wenn er statt 1.1V dann 5V an dem Pin anliegen hat.....

> analogReference(INTERNAL1V1)
Das wird eher nix. Ich habe einen ATmega328, die Doku sagt aber:
INTERNAL1V1: a built-in 1.1V reference (Arduino Mega only)

von Stefan F. (Gast)


Lesenswert?

> Wobei sich da die Frage stellt, ob der Chip es langfristig übel nimmt,
> wenn er statt 1.1V dann 5V an dem Pin anliegen hat.....

Das schadet ihm nicht. Hauptsache man geht nicht über VCC + 0,5V.

von Falk B. (falk)


Lesenswert?

@ Detlev Ahlgrimm (dede67)

>Weil uns eine zu helle Treppen-Beleuchtung bei offener Schlafzimmertür
>stören würde, wenn wir schon im Bett liegen

Tür zumachen?

>und Sohnemann mitten in der
>Nacht nachhause kommt, sollen die LEDs dann gerade hell genug
>angesteuert werden, um die Treppe noch sicher benutzen zu können.

Bewegungsmelder?

>Gleichzeitig sollen die LEDs, wenn es im Winter ab 16:00 Uhr langsam
>dunkler wird, die bisherige Treppen-Beleuchtung überflüssig machen (und
>in diesem Fall für maximale Helligkeit angesteuert werden).

Dito.

>Dafür war die erste Idee, die LEDs vor einer Messung für eine
>Millisekunde auszuschalten, das Umgebungslicht zu messen, um dann neu zu
>entscheiden, ob (und wenn ja, wie hell) die LEDs nun angesteuert werden
>sollen.

Sowas kann man machen, dazu nimmt man halt eine Photodiode + 
Transimpedanzverstärker.

https://www.mikrocontroller.net/articles/Lichtsensor_/_Helligkeitssensor#Konstantstromquelle_mit_Transimpedanzverst.C3.A4rker

Das geht im Prinzip auch mit einem Phototransistor, den kriegt man auch 
auf Schaltzeiten unter 1ms.

Trotzdem würde ich das Gesamtkonzept stark hinterfragen.

von Falk B. (falk)


Lesenswert?

@Äxl (geloescht) (Gast)

>analogReference(INTERNAL)
>analogReference(INTERNAL1V1)

>https://www.arduino.cc/reference/en/language/funct...

Was soll das bringen? Das macht den Phototransistor auch nicht 
schneller, nur die Referenzspannung von ursprünglich Vref=VCC=5V auf 
1,1V. Man gewinnt bestenfalls den Faktor ~4 in Bezug auf die Ausnutzung 
des Meßbereichs.

von Äxl (geloescht) (Gast)


Lesenswert?

ging ja um den Speed - stimmt. Die Auflösung ändert sich aber und er 
könnte nun meit seinem 10KΩ einen größeren Bereich abdecken.
Dann evtl: ADPS0,1 und 2 im ADCSRA löschen? oder nur ADPS1 setzen?
Ich habe jetzt nicht nachgesehen, was die Arduino-Umgebung hier als 
Standard setzt.
Das erhöht die Verarbeitungsgeschwindigkeit des ADC. Hilft das mehr?

von Falk B. (falk)


Lesenswert?

@ Äxl (geloescht) (Gast)

>Dann evtl: ADPS0,1 und 2 im ADCSRA löschen? oder nur ADPS1 setzen?
>Ich habe jetzt nicht nachgesehen, was die Arduino-Umgebung hier als
>Standard setzt.

Sie setzt den Teiler auf /128, damit hat man ca. 10ksps. Das reicht.

>Das erhöht die Verarbeitungsgeschwindigkeit des ADC. Hilft das mehr?

Das bringt rein gar nichts.

von Georg M. (g_m)


Lesenswert?

Detlev A. schrieb:
> Alles dies ist noch kein sonderliches Problem.... das Problem entsteht,
> wenn sich das Umgebungslicht ändert, nachdem die LEDs bereits
> eingeschaltet wurden.
> Dafür war die erste Idee, die LEDs vor einer Messung für eine
> Millisekunde auszuschalten, das Umgebungslicht zu messen, um dann neu zu
> entscheiden, ob (und wenn ja, wie hell) die LEDs nun angesteuert werden
> sollen.

Die Brutto-Beleuchtung messen, dann umrechnen. Wenn schon ein 
Mikrocontroller im Einsatz ist, dann soll er gefälligst etwas tun.

von Lurchi (Gast)


Lesenswert?

Ein Problem bei der Lichtmessung ist der ggf. große Wertebereich für die 
Helligkeit. Eine Möglichkeit auch vom µC aus die Empfindlichkeit zu 
beeinflussen ist es den Strom aus dem Phototransistor zu nutzen um einen 
Kondensator (z.B. 10 nF-100nF) aufzuladen. Um mit 1 µA (das ist so etwa 
die zu Erwartende Größenordnung für den Strom) den 10 nF Kondensator auf 
1 V aufzuladen dauert es 10 ms, also gerade mal eine halbe Netzperiode - 
über kürzere Zeit die Helligkeit messen zu wollen ist sowieso 
problematisch wegen der 100 Hz Modulation bei vielen Lichtquellen.

Je länger man zeit lässt um den Kondensator zu laden, desto 
empfindlicher wird es. Das entladen geht über die IO Funktion des AD 
Eingangs. Als Schutz ist ein 1 Widerstand vor dem IO Pin zu empfehlen.

Auch wenn man die Helligkeit direkt über Widerstand und ADC misst, 
sollte man über ein paar Wandlungen mitteln um vielfache von 20 ms oder 
wenigstens 10 ms zu erfassen. Das gibt deutlich stabilere Werte.

von Hmm (Gast)


Lesenswert?

Detlev A. schrieb:
> @Georg M. (g_m): ja, das auch :-)
> Es geht um eine Treppen-Beleuchtung in einem Einfamilienhaus - nicht um
> ein quasi öffentliches Treppenhaus in einem Mehrfamilienhaus.
>
> Weil uns eine zu helle Treppen-Beleuchtung bei offener Schlafzimmertür
> stören würde, wenn wir schon im Bett liegen und Sohnemann mitten in der
> Nacht nachhause kommt, sollen die LEDs dann gerade hell genug
> angesteuert werden, um die Treppe noch sicher benutzen zu können.
> Gleichzeitig sollen die LEDs, wenn es im Winter ab 16:00 Uhr langsam
> dunkler wird, die bisherige Treppen-Beleuchtung überflüssig machen (und
> in diesem Fall für maximale Helligkeit angesteuert werden).
>
> Alles dies ist noch kein sonderliches Problem.... das Problem entsteht,
> wenn sich das Umgebungslicht ändert, nachdem die LEDs bereits
> eingeschaltet wurden.
> Dafür war die erste Idee, die LEDs vor einer Messung für eine
> Millisekunde auszuschalten, das Umgebungslicht zu messen, um dann neu zu
> entscheiden, ob (und wenn ja, wie hell) die LEDs nun angesteuert werden
> sollen.
> Eine Millisekunde lang abgeschaltete LEDs sieht man noch nicht, sechs
> Millisekunden fallen auf und stören.

Korrigier mich, aber ist es nicht so, dass der Beitrag deiner 
Beleuchtung zum Messwert der Helligkeit konstant und bekannt ist?
d.h. der Controller weiß doch sowieso genau, wieviel Offset er dem 
Umgebungslicht oben draufsetzt.

d.h. rechnerisch ließe sich das auch lösen, ohne Ausschalten. Du musst 
vom Messwert den Betrag subtrahieren, den deine LED hinzufügt. Wenn 
deine Messung linear ist (was mit einem Transimpedanzverstärker + 
Fotodiode kein Problem ist) sollte das klappen.

von Detlev A. (dede67) Flattr this


Lesenswert?

Hmm schrieb:
> Korrigier mich, aber ist es nicht so, dass der Beitrag deiner
> Beleuchtung zum Messwert der Helligkeit konstant und bekannt ist?
> d.h. der Controller weiß doch sowieso genau, wieviel Offset er dem
> Umgebungslicht oben draufsetzt.

Konstant zwar nicht - aber bekannt.
Die LEDs liefern theoretisch 256 mögliche Helligkeiten.
Praktisch sollten wohl zehn unterschiedliche Helligkeiten vollkommen 
reichen...die sich dann sogar trotz Mess-Ungenauigkeiten noch 
unterscheiden ließen.
Damit müsste sich eine reine Software-Lösung bauen lassen.
Gute Idee!
Danke!

von Äxl (geloescht) (Gast)


Lesenswert?

Du könntest testhalberweise versuchen (fiel mir gestern abned noch ein) 
den Fototransistor, während er von den LEDs beleuchtet wird, 
kurzzuschließen. Dann ist der nicht in Sättigung... (nur so 'ne Idee).
Software wäre schon richtiger. Hast ja einen µC.
Äxl

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.