Ein Langzeit-Datenlogger

Elektronik-Labor  Projekte  Mikrocontroller  TLScript  








Hier geht es wieder um die Franzis-Solarwindmühle, die aber diesmal ohne den Motor und nur mit der eingebauten LED in der höchsten Helligkeitsstufe arbeitet. Nun soll eine Langzeitmessung der Spannung durchgeführt werden. Mich interessiert, ob der Speicherkondensator mit 15 F im Mittel ausreichend aufgeladen wird, auch wenn die LED über Nacht aktiv bleibt. Der Messbereich für die Spannungsmessung beträgt 5 V.

Die Messung soll mit 8 h/Div aufgezeichnet werden, sodass mehr als drei Tage erfasst werden. Damit der PC nicht die ganze lange Zeit eingeschaltet bleiben muss, habe ich ein 9V-Steckernetzteit an Vin angeschlossen. Der Arduino hat ja für diesen Zweck einen 5V-Regler. Das hat den weiteren Vorteil, dass die Referenz des AD-Wandler sehr genau bei 5 V ist, während die USB-Versorgung über den PC und einen Hub eher nur bei 4,5 CV liegt.

Für die ersten Versuche sollten die Messungen wesentlich schneller ablaufen. Die laufende Messung mit insgesamt 256 Bytes wird mit einer LED an D0 angezeigt. Das Programm wird mit Byte-Kommandos gesteuert:

1: Alles löschen
2: Messung starten
3: Messung auslesen

Eine besondere Anforderung ist, dass man Zwischenergebnisse auslesen darf, um den korrekten Verlauf zu überprüfen. Falls nämlich bei einer Langzeitmessung irgendetwas schief läuft, dauert die ganze Sache noch länger. Ich kann also mit dem Kommando 3 zu jeder Zeit nachsehen, wie weit die Messung schon gekommen ist. Dazu wird während der eigentlichen Messung ab L2 mit Input A auf Signale vom PC gelauscht. Wenn ein Byte kommt, wird das Auslesen ab L5 ausgeführt und danach weiter gemessen. Weil der Datapointer B bei Auslesen verändert wird, muss er am Ende des Auslesevorgangs aus dem Zähler C rekonstruiert werden, damit die Messung an der richtigen Stelle fortgeführt werden kann.


             Rem Logger
              L1:
0x09FF  Pdir = 255
0x0800  Pout = 0
0x2023  Jmp L9:

                Rem Log
              L2:
0x0200  B = 0
0x03FF  C = 255
              L4:
0x0801  Pout = 1
0x3C00  A = AD0
0x3B00  [B+] = A
0x3500  A = B
0x1964  Delay ms = 100
0x4100  Input A
0x220D  If A=B Jmp L13:
0x2110  Call L5:
              L13:
0x2505  C*Jmp L4:
0x0800  Pout = 0
0x4800  Ret
 
             Rem Read
              L5:
0x0200  B = 0
0x04FF  D = 255
0x1A03  Delay s = 3
              L6:
0x3A00  A = [B+]
0x4200  Print A
0x1902  Delay ms = 2
0x2613  D*Jmp L6:
0x3700  A = C
0x3400  B = A
0x01FF  A = 255
0x2B00  A = A - B
0x3400  B = A
0x4800  Ret
              Rem Clear
              L7:
0x04FF  D = 255
0x0200  B = 0
0x0100  A = 0
              L8:
0x3B00  [B+] = A
0x2620  D*Jmp L8:
0x4800  Ret

               Rem PC
              L9:
0x0100  A = 0
0x19C8  Delay ms = 200
0x4100  Input A
0x0201  B = 1
0x222D  If A=B Jmp L10:
0x0202  B = 2
0x222F  If A=B Jmp L11:
0x0203  B = 3
0x2231  If A=B Jmp L12:
0x2023  Jmp L9:
              L10:
0x211D  Call L7:
0x2023  Jmp L9:
              L11:
0x2103  Call L2:
0x2023  Jmp L9:
              L12:
0x2110  Call L5:
0x2023  Jmp L9:

Beim ersten Praxistest kam noch ein Problem ans Licht. Wenn ich den PC während einer Messung neu anschließe und die Schnittstelle öffne, führt der Arduino einen Reset aus. Damit wird das ganze Programm neu gestartet und dabei der Datenbereich gelöscht. Das wäre auch passiert, wenn ich erst nach drei Tagen ausgelesen hätte. Was nun? Dann kam mir die Erinnerung an ein ähnliches Problem mit dem Arduino. Die Lösung war, dass ich den Reset-Pin gegen +5V schalte und damit jeden automatischen Reset unterdrücke. Getestet,  funktioniert. Nur die Reset-Taste darf ich jetzt nicht mehr drücken, denn damit würde die Betriebsspannung kurzgeschlossen.

Die Wartezeit zwischen zwei Messpunkten beträgt nur 100 ms, sodass mit insgesamt 25 Sekunden ein schneller Test möglich wird. Hier wurde eine Kondensatorentladung mit 100µF und 100 kΩ als Testobjekt verwendet. Etwa zur halben Zeit wurde das Zwischenergebnis ausgelesen. Im TLScript-Fenster wurde das Kommando 3 gesendet und dann das Programm mit Stop angehalten, sodass genügend Zeit bleibt, ins TestLab-Fenster zu wechseln und den Plotter zu starten. Dort wurde mit das Programm mit Go fortgeführt, damit die bis dahin gemessenen Daten geplottet wurden.

 

Die Messung wurde automatisch fortgeführt, bis am Ende die LED ausgeschaltet wurde. Erneutes Auslesen zeigte dann den gesamten Inhalt des Speichers. Man sieht einen Sprung, der durch die vom Auslesevorgang verursachte Messpause verursacht wurde. Das ist aber für echte Langzeitmessung kein Problem, und bei schnellen Messungen ist das Zwischenergebnis weniger wichtig.



Für die echte Messung mit acht Stunden pro Skalenteil musste ich nur noch die Wartezeit anpassen. Bei 50 Messpunkten pro Skalenteil beträgt die Wartezeit 8 * 60 min / 50 = 9,6 min oder 9 Minuten, 36 Sekunden. Deshalb musste zwei Wartezeiten eingesetzt werden, Delay min = 9 und Delay s = 36.  Im Messzeitraum gab es durchgängig starke Bewölkung und Regen. Die Messung zeigte, dass der Kondensator nicht nachgeladen wurde. Die Spannung sank in drei Tagen von anfangs 2,75 V bis auf 2,69 V. Man kann erkennen, dass die Spannung zunehmend langsamer abnahm. Damit ist eine wichtige Frage beantwortet: Die Dimensionierung der Schaltung stellt tatsächlich sicher, dass der Kondensator auch unter schwierigen Bedingungen nicht unter 2,5 V entladen wird. Um diese mühsam gefundenen Daten auch in numerischer Form festzuhalten, wurden sie dann als LiC1.dat gespeichert.
 
Während der zweiten Messung gab es dagegen sonnige Abschnitte, durch die der Kondensator zwischenzeitlich nachgeladen werden konnte. Maximal wurden 2,90 V  erreicht.



Die letzte Messung wurde ganz ohne die LED-Last durchgeführt. Auch da gab es nur wenig Sonne, aber der LiC wurde bis 3 V aufgeladen.



              Rem Logger2
              Rem 8h/div
              L1:
0x09FF  Pdir = 255
0x0800  Pout = 0
0x2024  Jmp L9:
              Rem Log
              L2:
0x0200  B = 0
0x03FF  C = 255
              L4:
0x0801  Pout = 1
0x3C00  A = AD0
0x3B00  [B+] = A
0x3500  A = B
0x1A24  Delay s = 36
0x1B09  Delay min = 9
0x4100  Input A
0x220E  If A=B Jmp L13:
0x2111  Call L5:
              L13:
0x2505  C*Jmp L4:
0x0800  Pout = 0
0x4800  Ret
....
(gekürzt

 


Elektronik-Labor  Projekte  Mikrocontroller  TLScript