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
@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
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?
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.
@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
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.
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?
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?
@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/.
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.
@ 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.
@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.
probier doch in setup()
1 | analogReference(INTERNAL) |
2 | analogReference(INTERNAL1V1) |
https://www.arduino.cc/reference/en/language/functions/analog-io/analogreference/ Äxl
Ä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)
> 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.
@ 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.
@Ä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.
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?
@ Ä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.
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.
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.
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.
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!
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.