Hallo zusammen,
ich habe eine Solarzelle (aus einer alten LED-Gartenleuchte) direkt an
den ADC-Eingang eines ATtiny25 angeschlossen, um für meine
Wetteraufzeichnung das Tageslicht qualitativ zu messen.
Dabei beobachte ich, dass nach einiger Zeit (mehrere Stunden/Tage) die
ermittelten Werte plötzlich unsinnig werden (entweder das Maximum von
Aref überschreiten oder sich irgendwo in der Mitte einpendeln).
Da ich (erst mal) ein Fehler in meinem Programm ausschliesse (sind ja
auch nur ein paar Codezeilen), vermute ich ein schaltungstechnisches
Problem. Frage: muss noch ein Lastwiderstand in die Schaltung rein und
wenn ja in welcher Dimension (bei starker Sonneneinstrahlung messe ich
Werte von ca. 4,5V)?
Grüße & Danke
Der Kurzschlussstrom ist genau proportional zum einfallenden Licht und
das über viel Zehnerpotenzen der Intensität der Sonneneinstrahlung. Alle
anderen Methoden wie Spannungsmessung sind dagegen unbrauchbar.
...ähmm, nach kurzem Überlegen ahne ich was ihr meint...
Wie muss die Schaltung dazu aussehen? (Bin nicht der Elektroniker,
sondern mehr der Softwareentwickler...;-))
Grüße & Danke
Am einfachsten wäre es, Du nimmst einfach einen Lastwiderstand, so dass
die Spannung recht klein wird. Also max. 0.1V. Und dann schaltest Du
einen OPV als Verstärker danach. Bei Verstärkung 50 kommst Du dann
wieder auf die 0.. 5V.
oder du wählst den Wiederstand passend wenn du messen willst
Multimeter -> Kurzschlußstrom -> R=U/I
sollte dich dem nahe bringen (Messbereich des Multimeter muss natürlich
passen)
oder falls dir Licht ja oder nein reicht einfach nur einen hohen
Wiederstand
Timo80 schrieb:> Am einfachsten wäre es, Du nimmst einfach einen Lastwiderstand, so dass> die Spannung recht klein wird. Also max. 0.1V. Und dann schaltest Du> einen OPV als Verstärker danach. Bei Verstärkung 50 kommst Du dann> wieder auf die 0.. 5V.
Falls die Zelle nicht zuviel Strom liefert, gibt es nichts einfacheres
als einen richtigen Transimpedanzverstärker. Im Forum gibt's genug
Beispiel.
Bei der Schaltung mit dem Lastwiderstand ist man immer auf die
Nachverstärkung angewiesen und die Zelle arbeitet trotzdem nicht mehr im
Kurzschlußbetrieb.
> ich habe eine Solarzelle (aus einer alten LED-Gartenleuchte) direkt an> den ADC-Eingang eines ATtiny25 angeschlossen, um für meine> Wetteraufzeichnung das Tageslicht qualitativ zu messen.
Welche Qualität willst du da messen ?
Die Spannung einer Solarzelle sagt mehr über die Temperatur der
Solarzelle aus, als über den Lichteinfall.
Dummerweise geht Sonnenlicht von 0.0001 lux (Neumondnacht) bis 100000
lux (pralle Sommersonne), und wenn du das in eine Spannung von maximal
umwandelst, bekommst du ein Messproblem mit den 0,000000005V die kein
A/D-Wandler auflösen kann.
Du musst dir also erst mal über den Messbereich und die gewünschten
Ergebnisse einen Kopf machen.
Vielleicht hilft bei der Lösung ein TSL230.
MaWin schrieb:> Welche Qualität willst du da messen?>
halt die Qualität, nicht die Quantität. Deshalb habe ich (da war ich
noch Gast...;-)) es explizit so in diesem Satz geschrieben...
Mir reicht die Aussage: Nacht, dicke Wolken, bewölkt, leicht bewölkt,
keine Wolken. Die Ergebnisse, die ich bisher mit der Solarzelle
erreiche, wenn sie denn mal in meiner Schaltung funktioniert, sind schon
mal gar nicht so schlecht und für meinen Zweck vollkommen ausreichend.
Dein Vorschlag mit dem TSL230 ist zwar bestimmt nicht schlecht, aber
über das Ziel hinausgeschossen, da die Geschichte auch ein
"Abfallprodukt" bei ein paar Experimenten mit I2C an einem Linux-PC
ist... (Der ATtiny25, dessen ADCs verwendet werden, arbeitet als
I2C-Slave --> http://bralug.de/wiki/BLIT2008-Board_ADC)
Ich werde mir mal die anderen Vorschläge durch den Kopf gehen lassen.
Wenn jemand noch einen Vorschlag hat, immer her damit.
Grüße & Danke Uwe
solarzelle schrieb:> Dabei beobachte ich, dass nach einiger Zeit (mehrere Stunden/Tage) die> ermittelten Werte plötzlich unsinnig werden (entweder das Maximum von> Aref überschreiten oder sich irgendwo in der Mitte einpendeln).
Beschreibe mal genauer, warum du die Ergebnisses als unsinnig empfin-
dest. Dass Aref überschritten wird, könnte ja auch daran liegen, dass
die Sonne zu hell und die Spannung der Solarzelle zu hoch war. Dass sich
der Wert irgendwo in der Mitte einpendelt, könnte ja bedeuten, dass die
Sonne nur mäßig hell gescheint hat.
Hast du mal gemessen, welche Spannung die Solarzelle bei maximaler Son-
neneinstrahlung liefert? Vielleicht war das schon zu viel für den Mikro-
controller, so dass er beschädigt wurde oder zumindest vorübergehend in
einen undefinierten Zustand geraten ist.
Auch wenn deine Methode, direkt die Spannung an der Solarzelle zu mes-
sen, ungenau und temperaturabhängig ist, hat sie einen entscheidenden
Vorteil: Sie hat selbst mit dem lausigen ADC des ATtiny einen Messbe-
reich von vielen Größenordnungen, da die Solarzelle bei dieser Beschal-
tung ihren Logarithmierer schon mitbringt. Da im Gegensatz dazu die
Strommessung an der Solarzelle linear ist, kannst du mit dem 10-Bit-ADC
maximal 3 Großenordnungen abzüglich Messrauschen abdecken, was u.U. zu
wenig ist.
Evtl. kannst du mit einer zusätzlichen Temperaturmessung und etwas
Software den Temperaturfehler wenigstens teilweise kompensieren. Für
ein "qualitative" sollte das reichen.
Yalu X. schrieb:> Beschreibe mal genauer, warum du die Ergebnisses als unsinnig empfin-> dest.>
Deshalb:
http://bergeruw.dyndns.org/~bergeruw/temp/adc_plot.png
bis 19.05. 01:30 Uhr war alles schick. 21:00 Uhr habe ich den Tiny kurz
stromlos geschaltet. (jetzt fällt gerade etwas Licht meiner
Schreibtischlampe auf die Zelle.)
Uwe
Logarithmier doch das verstärkte Signal. Dann kannst du deinen ADC über
einen sehr viel größeren Intensitätsbereich verwenden und mit deinen
10Bit nicht nur 3, sondern z.B. 6 Dekaden abdecken. Bei der bisherigen
linearen Version wirst du 100% eh nicht erzielen können, da dein Shunt
zu hohe Intensitäten nicht an den ADC-Eingang durchlassen darf. Zwischen
10 und bis zu deinem Maximum von 50% wirst du alles als "sehr hell"
empfinden. Abstufungen, die du wahrnehmen kannst / die für dich wichtig
sind, gehen dann nur noch von 0..10% und selbst da empfindet dein Auge
die Intensität viel eher in einer logarithmischen Skala.
nemon schrieb:> Logarithmier doch das verstärkte Signal.
Das Signal = gelieferter Strom der Solarzelle.
1. Gedanke: Da könnte man doch eine Diode hernehmen. Der Strom durch
eine Diode gehorcht im positiven Bereich einer e-Funktion, die von der
Spannung über der Diode abhängig ist. Also ist die Spannung eine
Logarithmusfunktion des eingeprägte Stroms.
2. Gedanke: Da könnte man doch die in der Solarzelle enthaltene Diode
diesen Job übernehmen lassen. Eine Solar-Einzelzelle entspricht in einem
einfachen Ersatzschaltbild einer Stromquelle mit Paralleldiode.
3. Gedanke: Da könnte man doch die Schaltung lassen wie sie ist,
vielleicht einen etwas hochohmigeren Spannungsteiler, um den ADC-Eingamg
nicht zu überfahren.
4. Dioden haben einen unschönen Nachteil: Temperaturabhängigkeit. Aber
die Temperatur der Diode kann man ja messen (DS18B20 oder DS18S20 oder
LM35 oder LM335), daraus die Thermospannung berechnen und so den Fehler
der Diodengleichung ausgleichen.
mfg mf
5. Wenn schon eine Diode als Logarithmierer, dann muß eine zweite dazu
die mit dem maximalen Strom durchflossen wird den die Solarzelle bei
maximaler interessierender Beleuchtung bringt, und aus dieser AREF
gewonnen werden (oder durch mit-messen rechnerisch kompensieren). Damit
hätte man die Temperaturabhängigkeit der Diode ausgeglichen. Wenn nun
diese zweite Diode einfach eine weitere Solarzelle wäre, müsste man sie
in thermischem Kontakt mit der ersten bringen, z.B. auf der Rückseite
abkleben, und gegen Sonnenlicht lackieren.
TSL235 wäre einfacher.
Uwe Berger schrieb:> Deshalb:>> http://bergeruw.dyndns.org/~bergeruw/temp/adc_plot.pngUwe Berger schrieb:>> Was ist die Versorgungsspannung deines AVRs?>> Was ist A_ref?>> beides 5V
Offensichtlich hat die Spannung der Solarzelle die Versorgungsspannung
des Controllers tatsächlich erreicht und vermutlich sogar deutlich über-
schritten. Das tut dem Controller nicht gut.
Abhilfe:
Anon Ymous schrieb:> Vielleicht hilft dir schon ein Spannungsteiler.
Dazu misst du am besten die Spannung der Solarzelle bei maximaler Son-
neneinstrahlung mit dem Voltmeter und dimensionierst den Spannungsteiler
entsprechend. Wenn du für den kleineren der beiden Widerstände des Span-
nungsteilers etwa 10 kΩ nimmst, ergibt das — zusammen mit den internen
Clamping-Dioden des ATtiny — eine Schutzschaltung für den Fall, dass die
Sonne irgendwann noch etwas heller als erwartet scheint.
Yalu X. schrieb:> Offensichtlich hat die Spannung der Solarzelle die Versorgungsspannung> des Controllers tatsächlich erreicht und vermutlich sogar deutlich über-> schritten. Das tut dem Controller nicht gut.
Auch bei der Spannungsmessung ließen sich böse Dinge, wie Überlastung
der Eingangsschutzdioden des µC natürlich verhindern, indem man einen
Widerstand zur Strombegrenzung in Serie schaltet. Dann schadet auch eine
höhere Spannung nicht.
Eine einzelne Solarzelle liefert aber nur 0.5 Volt.
Eine Überspannung (> VCC) kann nur auftreten, wenn ein ganzes Modul mit
einer Serienschaltung mehrerer Zellen dranhängt.
MoinMoin,
derzeit ist das Modul wieder ausgestiegen, habe die Schaltung aber noch
nicht modifiziert:
http://bergeruw.dyndns.org/~bergeruw/temp/adc_plot.png
Das Problem hat diesmal kurz vor 02:00 Uhr angefangen, da war es
definitiv dunkel....
Wenn man sich die Werte genau ansieht, scheint der ADC-Wert derzeit
zwischen Maximum (wahrscheinlich sogar mehr als 1023), 512 und 768 zu
pendeln. Das sind relativ markante Werte, wenn ich mit
Informatiker-Augen hinsehe...
Neben den messtechnischen Problem, was oben bereits diskutiert wurde,
habe ich vielleicht doch ein programmtechnisches Problem? Hier mal der
Quelltext des ADC-Moduls:
http://bralug.de/wiki-common/images/a/a0/I2c_adc.tar.gz
Grüße & Danke Uwe
MoinMoin,
ich will noch mal das Thema hoch holen und von meinen gemachten
Änderungen berichten und eine Frage stellen...
Die Schaltung habe ich bisher noch nicht geändert, vielmehr haben mich
die "informatiker-markanten" Werte interessiert, die der Tiny im
Fehlerfall ausgespuckt hat.
Dazu habe ich mich nun doch mal etwas mhr in Sachen ADC belesen und
(endlich mal) die Theorie, die hinter ADCL/ADCH, ADCW etc. steckt
möglicherweise verstanden...:-)
Nachdem ich die Zeilen:
1
ADCSRA |= (1<<ADSC);
2
while (ADCSRA & (1<<ADSC));
3
adc_val = ADCW;
4
ADCSRA=0;
5
USI_TWI_Transmit_Byte(adc_val%256);
6
USI_TWI_Transmit_Byte(adc_val/256);
durch:
1
ADCSRA |= (1<<ADSC);
2
while (ADCSRA & (1<<ADSC));
3
ADCSRA=0;
4
USI_TWI_Transmit_Byte(ADCL);
5
USI_TWI_Transmit_Byte(ADCH);
ersetzt habe, scheint die Geschichte wieder stabil zu sein (zumindestens
in den letzten fast 21h). Sieht so auch schicker aus und spiegelt das
besser wider, was ich eigentlich weiter brauche... Und nebenbei werden
auch ein paar Bytes im RAM und Flash gespart.
Was ich nicht ganz verstehe ist, warum es dies gewesen sein könnte? Der
ADC läuft nicht im "Freerunning"-Mode, sondern wird erst wieder mit dem
Setzen von ADSC im Programm angestossen. Hat jemand eine Erklärung für
mich (falls es das wirklich gewesen sein sollte)?
Grüße & Danke Uwe