Forum: Mikrocontroller und Digitale Elektronik TCS230 + Rezip. Frequenzzähler = Blitzbelichtungsmesser?


von Michael B. (hottube)


Angehängte Dateien:

Lesenswert?

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 :-)

von Ulrich (Gast)


Lesenswert?

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.

von Michael B. (hottube)


Lesenswert?

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.

von Michael B. (hottube)


Lesenswert?

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)

von Ulrich (Gast)


Lesenswert?

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.

von Michael B. (hottube)


Lesenswert?

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.

von Ulrich (Gast)


Lesenswert?

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.

von Michael B. (hottube)


Lesenswert?

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
Noch kein Account? Hier anmelden.