Einen TCS230 für einen Blitzbelichtungsmesser einsetzen? Bei dem TCS230 handelt es sich um einen Lichtsensor, der die einfallende Lichtmenge proportional in eine Frequenz umwandelt. (1Hz - 1.2MHz Ausgangsfrequenz) Eingangsseitig von ca 0,1Lux - > 100.000Lux. Bisherige Messungen haben ergeben, dass der Sensor außreichend schnell ist um die Lichtmenge eines Blitzes (z.B. in einem Fotoaparat eingebaut) zu erfassen. Elementar ist dabei jedoch, dass bei der notwendigen Frequenzzählung aus Zeitgründen keine Bereichsumschaltung erfolgen darf. -> Reziproker Frequenzzähler notwendig 1Hz - 1,2MHz, mit 4-5 signifikanten Stellen. --> Größte Störquelle ist für das System das 50Hz Lichtflackern so dass über einen Integrationszeitraum von n* 10ms die Frequenz erfasst werden sollte - sofern die Mess-Frequenz es zuläßt. (gewählt 20ms) Das Timing habe ich als Datei angehängt. Konzeption: Atmega-88 oder -168 Timer0: 8Bit + 8Bit = 16 Bit - Zählt die Impulse des Sensors - mit Überlauf (8Bit) verlängert - Torzeit 20ms -> 16 Bit für 1,2 MHz ausreichend! - Überlauf max. alle 0,26ms - Sensorsignal kommt über T0 Timer1: 16Bit + 8 Bit = 24 Bit - Zählt fortlaufend mit Systemtakt (16MHz) - mit Überlauf (8Bit) verlängert - bei f_Sensor = 1Hz Torteit 1 Sek -> 24Bit ausreichend! - Überlauf alle 4ms - Auflösungsvermögen: 62,5ns - diret über Systemtakt (16MHz ohne Vorteiler) Das Sensorsignal wird an T0 und ICP1 Angeschlossen. Damit kann über Timer0 das Signal ausgezählt werden, der "Timecode" für die jeweiligen Ticks kommen über den Capture aus T1 und anschließendes Auslesen zustande. (Frage 1.) Ablauf: Die Auswertung soll durch ein Event angestoßen werden. (auslösen des Blitzes) Das Event wird über INT0 erfasst. INT0 --> Startzeit = CAPT1 + Überlauf_T1 Timer_0 + Überlauf auf "0" setzen Zeitnehmer 20ms starten (Frage 2.) INT0 deaktivieren INT_T0_Überlauf --> Zähler++ Wenn Zähler > 255 Fehler = 1 INT_T1_Überlauf --> Timer++ Wenn Timer > 255 Fehler = 2 INT_20ms --> INT_PIN_T0 aktivieren INT_PIN_T0 --> Endzeit = Capture + Überlauf Ergebniss berechnen: Frequenz = T0+Zähler /(Endzeit - Startzeit) Direkt im Anschluss findet die Refferenzmessung statt. Blitzlichtanteil = Messung1 - Messung2 ------------------------------------------------------------------ Frage 1.) ist es möglich die Capturefunktion des Timer1 auch ohne Interrupt zu nutzen? (bin mir da noch nicht sicher wie das DB zu interprätieren ist) Frage 2.) wie kann ich die 20ms mit hinreichender Genauigkeit ermitteln?(max. +/- 1 ms) kann der T2 über einen Teiler genutzt werden ohne T1 zu beeinflussen? Frage 3.) ist das ggf. bereits viel zu kompliziert gedacht und die Lösung viel einfacher :-)
zu 1) Man kann die ICP funktion auch ohne Interrupt nutzen. Es wird dann aber schon etwas schwieriger mehr als 16 Bit Auflösung hinzukriegen. zu 2) Eine Zeit von ca. 20 ms kann man z.B. mit dem Timer0 oder 2 bekommen. Wegen der Rundung wird man vielleicht nicht genau 20ms, sondern z.B. genau 21 ms hinbekommen, aber das sollte hier ja nicht stören. zu 3) In dem Ablauf braucht man die 20 ms gar nicht extra erzeugen, da könnte man die Zahl der Überläufe von Timer 1 nutzen. Die Input Capture Funktion hat einen extra Interrupt, der kann dann auch INT0 ersetzen. Wenn man schon mit ICP arbeitet, kann man auch in Software mitzählen - so vermeidet man den extra Interrupt für den Überlauf. Ein Problem hat man aber noch. Je nachdem wie die ISRs aussehen wird die maximale Frequenz der man noch folgen kann bei etwa 100 kHz ... 500 kHz liegen. Für eine Frequenz von 1 MHz wird es vermutlich nicht ganz reichen. Da müßte man dann einen zuschaltbaren Teiler haben.
ICP ohne Interrupt ist schon mal eine gute Nachricht :-) Für das 20ms Timing kommt vermutlich T2 zum Einsatz, beim Überlauf von T1 entsprechen 20ms 6 Überläufen, ggf. doch etwas ungenau - ich werde es trotzdem ausprobieren, denn es ist deutlich einfacher zu realisieren. Der INT0 soll den Zeitpunkt detektieren zu dem der Blitz gezündet hat (über eine eigene Photodiode) Wobei Du mich gerade auf eine Unzulänglichkeit im Konzept aufmerksam gemacht hast - es reicht nicht zu einem Zeitpunkt INT0 den ICP auszulesen um den Startzeitpunkt der letzten Signalperiode zu ermitteln, denn der Überlauf wurde nirgends festgehalten. d.h. ich müsste doch für jeden ICP einen Interrupt auslösen. Ein solches Konzept habe ich derzeit am laufen, komme damit aber nur auf 250kHz bei einem 20MHz Quarz. Alternativ mit einem kleinen Fehler leben und mit der nächsten Signalperiode mit dem Zählen beginnen. Über Google habe ich 2 Projekte mit ATMAGA R-F-Zählern gefunden, die in der Lage sind von 0,001 bis 1 MHZ zu zählen, welches Grundkonzept wird dort angewendet, Quellcode haben die Autoren leider nicht veröffentlicht.
hier die Interrupte bei 16MHz komme ich bis an 7 MHz obere und 1 HZ untere Frequenz heran - ohne jegliche Bereichsumschaltung. Auflösung immer hin 4 stabile Ziffern, wobei mein Generator nicht alzu sauber arbeitet und ich somit nicht sagen kann wer da wackelt. Den Vorschalg die 20ms aus T1 abzuleiten hat sich bewährt :-) besten Dank dafür. nun muss die Kontinuierliche Messweise "nur" noch per INT0 triggerbar gemacht werden.
1 | C-Code |
2 | |
3 | ISR(TIMER1_OVF_vect) { // Interrupt abarbeiten -> Überlauf des Timer_1 (16 Bit) [Referenzzeit] |
4 | mess_dauer++; // 8 Bit |
5 | ueberlauf_T1++; // 16 Bit |
6 | }
|
7 | |
8 | ISR(TIMER0_OVF_vect) { // Interrupt abarbeiten -> Überlauf des Timer_0 (8 Bit) [Signaltackte] |
9 | ueberlauf_T0++; // 16 Bit |
10 | }
|
11 | |
12 | |
13 | ISR(TIMER1_CAPT_vect) { // Interrupt abarbeiten -> immer wenn ein Signal-Zählimpuls kommt |
14 | TIMSK &= ~(1<<TICIE1); // CAPT0 ausschalten --> wird in ca 20ms wieder eingeschaltet (main) |
15 | ereignis = (ueberlauf_T0 << 8) +TCNT0; // Anzahl Signaltake zusammenführen |
16 | TCNT0 = 0; // Timer Signalzähler auf 0 setzen / nächste Zählrunde startet sofort wieder |
17 | ueberlauf_T0 = 0; // auch den Überlauf auf 0 setzen |
18 | zeit_low = ICR1; // capture-reg von T1 sichern |
19 | zeit_high = ueberlauf_T1; // Überlauf von T1 sichern |
20 | mess_status = messungfertig; // Daten fertig fuer Auswertung |
21 | } // Ausgewertet werden die Daten in (main) |
Ich komme bei meinem Zähler, der ICP nutzt ohne Vorteiler bis etwas über 330 kHz. Die ISR ist zwar optimiert (ASM), hat aber auch Teile um mehr als eine Flanke auszuwerten, und um PWM-verhältnisse messen zu können. Ohne diese Extras würde ich bis vielleicht 1 MHz kommen, wird aber knapp. Bei dem Code fehlt noch die Behandhandlung der eher seltenen kollisionen von ICP und Overflow. Hab gerade eben erst gemerkt das es um Blitze geht: Für die normale Helligkeitsmessung würde es so gehen, aber gerade nicht für einen Blitz. Bei einem Blitz ist die Helligkeit nicht konstant. Es hat also keinen Sinn die genaue Zeit zu den flanken zu bestimmen. Wenn das IC selber nicht übersteuert, kann man die Perioden Zählen, über ein Zeitfenster wo der Blitz ganz drin ist. Da reicht dann der Zählereingang. Wenn man mit 50 Hz bzw. 100 Hz Hintergrundlicht rechnen muß, könnte man z.B. alle 5 ms den Zählerstand merken, und dann sehen ob man irgendwo größere Stufen drin hat. Dann 4 mal 5 ms so wählen das der blitz sicher in der Mitte ist, und die Differenz zum Untergrund bestimmen. Für die Messung eines Blitzes sonst lieber eine normale Fotodiode nehmen, aber mit einem angepaßten Verstärker (Ladungsverstärker), der gleich über den Biltz integriert. Dann hat man so schnell keine Probleme mit Übersteuerung und kann ganz normal per AD wandler gemütlich messen.
Ulrich schrieb: > Bei dem Code fehlt noch die Behandhandlung der eher seltenen kollisionen > von ICP und Overflow. Overflow von T0 oder T1? Um den Blitz zu messen, muss die Frequenzmessung triggerbar werden. Die "gleitende" Variante könnte aber auch interessant sein. Die Dinger brennen innerhalb von ca. 1ms - 20ms ab. (ca. 1/60'stel) Die Gate-Zeit soll 10ms oder 20ms sein, niedrige Frequenzen dann halt notgedrungen etwas länger bis zur nächsten Flanke. Damit sollte die Netzfrequenz dann ausgemittelt sein. (hat sich bereits schön bestätigt, die Anzeige wird dann deutlich ruhiger)(passt auch schön zur Blitz-Abbrennzeit) Die Herausforderung ist jedoch sowohl schwaches Umgebungslicht, als auch den Blitz selbst zu erfassen, der Dynamikumfang umfast ca. 5 Dekaden auf der LUX Scala. Um das jedoch bewerten zu können muss ich vorher noch mit dem Programm weiterkommen.
Die Kollisionen kommen wenn fast gleichzeitig der ICP und der Timer1_overflow Interrupt autreten. Es kann dann passieren das fälschlicherweise der ICP Interrupt vor dem Overflow ausgeführt wird. Das ist allerdings ein recht seltenes Ereignis. Dauert ein Blitz tatsächlich bis zu 20 ms. Ich dachte immer die wären so im Bereich um 1 ms. Man müßte auf alle Fälle klären ob das Licht-Freq. Wandler IC auch nicht zwischenzeitlich übersteuert. Die Gefahr wäre mit einer Fotodiode und Ladungsverstärker geringer. Ein Problem dsa mit dem Triggern der Frequenzmessung hat, ist dass das Triggersignal vermutlich etwas verspätet kommt. Wenn man den Blitz extra erkannt hat, hat man mit dem anderen Sensor wahrscheinlich auch schon etwas vom Blitz verpaßt. Es sollte aber nicht so schlimm sein, wenn das Messintervall von 20 ms schon etwas vor dem Blitz beginnt. Man sollte also wenigsten vor dem Blitz schon mal die Daten aufzeichnen, um wenigstens mit der einen Flanke vor den eigentlichen Blitz zu beginnen. Die Idee wäre also vor dem Blitz schon den ICP Interrupt aktiv zu haben, und da jeweils die Zeit zu messen und zu speichern, ggf. zusammen mit dem Zählerstand von T0. Der Externe Interrupt (Trigger) könnte dann den ICP Interrupt erstmal ausschalten, die 20 ms verzögerung starten und die daten aus der ICP routine retten. Nach den 20 ms kann denn der ICP für eine Flanke iengeschatet werden und man hat die passenden Daten.
Der "Ent-blockierte" Überlauf ist inzwischen eingebaut, auch werden und die 16-Bit Überläufe nun voll ausgenutzt. --> soweit erst einmal erfolgreich. Blitze bennen verhältnissmäßig lange. "Normale" Blitzgeräte bis zu 10ms, leistutngsstarke Exemplare auch länger. Wird nicht die volle Leistung vom Blitz benötigt, wird die Leuchtzeit durch den Blitz verkürzt (Quench). Dann kommt 1ms oder kürzer gut hin. Die Leuchtsrärke nimmt nach dem Zünden zunächst koninuierlich zu, bis der Max. Strom durch die Blitzröhre erreicht ist, dann kommt die fallende Spannung im Ladungselko zum tragen und der weitere Verlauf folgt der Entladekure. (Scheitelpunkt etwa nach 1ms) Der Sensor hat eine Totzeit von 1us (lt. Datenblatt) Damit der Sensor nicht übersteuert wird, bekommt er ein Filter vorgesetzt. (zusätzlich zum IR-Cut Off) Eine Photodiode (sfh203) zusammen mit einem OPV soll die Triggerflanke detektieren und über den Analog-Komparator ggf. ein Übersteuern detektieren. Zunächst soll jedoch ein Taster die Messung anstoßen und dann über einen Transistor der Blitz gezündet werden. Damit sollte zumindest ein Teil der Dreckeffekte reduziert werden können.
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.