Hallo zusammen,
für ein Forschungsprojekt soll ein Spektrometer mittels Arduino
gesteuert und ausgelesen werden.
Leider verstehe ich nicht wirklich wie die Steuerung genau funktioniert.
Es gibt dazu bereits einen Beispiel-Code im Netz. Wenn ich den
betrachte, dann habe ich den Eindruck, dass das Spektrometer über eine
bestimmte Anzahl an Pulsen auf dem CLK-Eingang gesteuert wird. Aber ich
check nicht ganz wie das genau funktioniert.
Hier das verwendete Spektrometer:
https://www.hamamatsu.com/content/dam/hamamatsu-photonics/sites/documents/99_SALES_LIBRARY/ssd/c12880ma_kacc1226e.pdf
Das Datasheet vom Spektrometer gibt zwar eine Timing-Übersicht, aber
daraus werde ich auch nicht schlau...
hier mal der Code. Vielleicht versteht ihr da mehr als ich!
Ich schreibe mal ein paar Fragen in den Code rein.
Danke für jede Hilfe!
1
#define SPEC_TRG A0
2
#define SPEC_ST A1
3
#define SPEC_CLK A2
4
#define SPEC_VIDEO A3
5
#define WHITE_LED A4
6
#define LASER_404 A5
7
8
#define SPEC_CHANNELS 288 // New Spec Channel
9
uint16_tdata[SPEC_CHANNELS];
10
11
voidsetup(){
12
13
//Set desired pins to OUTPUT
14
pinMode(SPEC_CLK,OUTPUT);
15
pinMode(SPEC_ST,OUTPUT);
16
pinMode(LASER_404,OUTPUT);
17
pinMode(WHITE_LED,OUTPUT);
18
19
digitalWrite(SPEC_CLK,HIGH);// Set SPEC_CLK High
20
digitalWrite(SPEC_ST,LOW);// Set SPEC_ST Low
21
22
Serial.begin(115200);// Baud Rate set to 115200
23
24
}
25
26
/*
27
* This functions reads spectrometer data from SPEC_VIDEO
28
* Look at the Timing Chart in the Datasheet for more info
29
*/
30
voidreadSpectrometer(){
31
32
intdelayTime=1;// delay time
33
34
// Start clock cycle and set start pulse to signal start
35
digitalWrite(SPEC_CLK,LOW);
36
delayMicroseconds(delayTime);
37
digitalWrite(SPEC_CLK,HIGH);
38
delayMicroseconds(delayTime);
39
digitalWrite(SPEC_CLK,LOW);
40
digitalWrite(SPEC_ST,HIGH);
41
delayMicroseconds(delayTime);
FRAGE: warum wird hier nicht nur das SPEC_ST auf High gesetzt sondern
vorher nochmal low-high-low gepulst?
1
//Sample for a period of time
2
for(inti=0;i<15;i++){
3
4
digitalWrite(SPEC_CLK,HIGH);
5
delayMicroseconds(delayTime);
6
digitalWrite(SPEC_CLK,LOW);
7
delayMicroseconds(delayTime);
8
9
}
10
11
//Set SPEC_ST to low
12
digitalWrite(SPEC_ST,LOW);
13
14
//Sample for a period of time
15
for(inti=0;i<85;i++){
16
17
digitalWrite(SPEC_CLK,HIGH);
18
delayMicroseconds(delayTime);
19
digitalWrite(SPEC_CLK,LOW);
20
delayMicroseconds(delayTime);
21
22
}
FRAGE: wieso wird hier gesampelt obwohl ja SPEC_ST auf low gestellt
wurde. bedeutet Spec_ST nicht "Start" und muss zum sampeln/messen
eigentlich ein sein?
FRAGE: wieso wird überhaupt einmal für 15 pulse und einmal für 85 pulse
gemessen? und weiter unten dann nochmal für 7 Pulse?
1
//One more clock pulse before the actual read
2
digitalWrite(SPEC_CLK,HIGH);
3
delayMicroseconds(delayTime);
4
digitalWrite(SPEC_CLK,LOW);
5
delayMicroseconds(delayTime);
6
7
//Read from SPEC_VIDEO
8
for(inti=0;i<SPEC_CHANNELS;i++){
9
10
data[i]=analogRead(SPEC_VIDEO);
11
12
digitalWrite(SPEC_CLK,HIGH);
13
delayMicroseconds(delayTime);
14
digitalWrite(SPEC_CLK,LOW);
15
delayMicroseconds(delayTime);
16
17
}
18
19
//Set SPEC_ST to high
20
digitalWrite(SPEC_ST,HIGH);
21
22
//Sample for a small amount of time
23
for(inti=0;i<7;i++){
24
25
digitalWrite(SPEC_CLK,HIGH);
26
delayMicroseconds(delayTime);
27
digitalWrite(SPEC_CLK,LOW);
28
delayMicroseconds(delayTime);
29
30
}
31
32
digitalWrite(SPEC_CLK,HIGH);
33
delayMicroseconds(delayTime);
34
35
}
36
37
/*
38
* The function below prints out data to the terminal or
Küvette schrieb:> für ein Forschungsprojekt soll ein Spektrometer mittels Arduino> gesteuert und ausgelesen werden.>> Leider verstehe ich nicht wirklich wie die Steuerung genau funktioniert.
Ich würde Dir ja gerne helfen - aber deinen Job auch noch nebenher zu
machen übersteigt meine zeitlichen Möglichkeiten.
"Datenblätter vorlesen" bringt auch nichts - also mach deine
Hausaufgaben mal besser selbst...
Jester schrieb:> also mach deine> Hausaufgaben mal besser selbst...
also wenn ich nicht schon seit Stunden daran sitzen würde, hätte ich
hier nicht gefragt. Ich bin absolut kein Programmierer und für mich ist
das alles neu.
Ich dachte ich finde hier vielleicht jemand der so nett ist, mir ein
paar Tips zu geben.
Ich verlange von niemandem "meinen Job" zu machen.
Das Datenblatt hab ich schon rauf und runter gelesen. Leider steht da
außer dieser Timing-Tabelle nichts drin, was die Steuerung des
Spektrometers betrifft. Zumindest erkenne ich das nicht. Bin für
Hinweise dankbar!
Der "Beispielcode aus dem Netz" weicht in mehreren Punkten von den
Angaben des Datenblattes ab; welche der beiden Informationsquellen
erscheint Dir zuverlässiger?
Das Datenblatt liefert eigentlich alle erforderlichen Informationen,
auch wenn einem die Zusammenhänge manchmal erst auf den zweiten Blick
klar werden.
Für die Steuerung des Ablaufes muß man den Takt CLK und eine Art
"Frame-Clock" ST anlegen. Die fallende Flanke von ST ist der Bezugspunkt
für alle zeitlichen Betrachtungen: Die gewünschte Integrationsdauer der
im Spektrometer verbauten CMOS-Zeilenkamera bestimmt, wieviele
CLK-Perioden vorher die steigende Flanke von ST stattgefunden haben muß.
Mit der fallenden Flanke von ST beginnt man sinnvollerweise auch die
Impulse am TRG-Ausgang des Spektrometers zu zählen, denn mit dem 89.
Impuls beginnt auch die sequentielle Ausgabe der Inhalte der 288 Zellen
der Kamerazeile (als Analogspannung). Nachdem der 288. Wert ausgegeben
worden ist, wird mit dem nächsten TRG-Impuls das Signal EOS für zwei
TRG-Taktperioden high.
Empfehlung: Lege den Code aus dem Netz erstmal zur Seite und fange an,
ein eigenes Programm zur Steuerung des Spektrometers auf Basis des
Datenblattes zu erstellen. Wenn noch keine Hardware zum Spielen
vorliegt, ist der Vorschlag, das Demoboard zu kaufen, genau richtig.
Viel Erfolg!
Küvette schrieb:> wie die Steuerung genau funktioniert.> Es gibt dazu bereits einen Beispiel-Code
Und funktioniert der? Tut sich was? Erzeugt der ein Timing, das dem im
Datenblatt entsprichcht?
> FRAGE: wieso wird überhaupt einmal für 15 pulse und einmal für 85 pulse> gemessen? und weiter unten dann nochmal für 7 Pulse?
Für mich sieht der Code aus, als ob er so hingebastelt worden wäre, dass
er "funktioniert".
Küvette schrieb:> Bin für Hinweise dankbar!
Du musst nur 2 Signale erzeugen, der Rest kommt alles vom Sensor zurück.
Das kann ja nicht so schwer sein.
> Leider steht da außer dieser Timing-Tabelle nichts drin
Och, da steht schon einiges mehr drin. Auch ein Rechenbesipiel.
Küvette schrieb:> FRAGE: warum wird hier nicht nur das SPEC_ST auf High gesetzt sondern> vorher nochmal low-high-low gepulst?
Sieh das Operation Example im Datenblatt an.
Küvette schrieb:> Leider verstehe ich nicht wirklich wie die Steuerung genau funktioniert.> Es gibt dazu bereits einen Beispiel-Code im Netz. Wenn ich den> betrachte, dann habe ich den Eindruck, dass das Spektrometer über eine> bestimmte Anzahl an Pulsen auf dem CLK-Eingang gesteuert wird. Aber ich> check nicht ganz wie das genau funktioniert.
Wenn sowas ist, würde ich erstmal die "Kollegen" fragen, also die, die
Ahnung haben müssten. Notfalls auch von der Nachbarfakultät. Das ist
immer besser als stundenlang Postings zu schreiben und - wer hätte das
gedacht? - das Netzwerk wird größer. Einfach mal loslaufen und sich
durchfragen, sich "durchverbinden" lassen (frag mal Timo im Raum W224.2
...). Der Mensch hilft gerne!
Küvette schrieb:> hier mal der Code. Vielleicht versteht ihr da mehr als ich!> Ich schreibe mal ein paar Fragen in den Code rein.
Da wird ja nur rumgeclockt. Impulse an den Sensor senden und was
einlesen. Und das Zeug funktioniert?
Küvette schrieb:> FRAGE: warum wird hier nicht nur das SPEC_ST auf High gesetzt sondern> vorher nochmal low-high-low gepulst?
Das sind vllt. irgendwelche notwendigen Vorgehensweisen, beispielsweise
um den Sensor zu aktivieren.
Küvette schrieb:> FRAGE: wieso wird hier gesampelt obwohl ja SPEC_ST auf low gestellt> wurde. bedeutet Spec_ST nicht "Start" und muss zum sampeln/messen> eigentlich ein sein?
K. A. wofür SPEC_ST steht. Aber vllt. ist den Pin aktiv low.
Küvette schrieb:> FRAGE: wieso wird überhaupt einmal für 15 pulse und einmal für 85 pulse> gemessen? und weiter unten dann nochmal für 7 Pulse?
Das sollte in der Beschreibung vom Protokoll vom Sensor stehen, wie die
Kommunikation läuft (wecken, Initialisierung, noch weitere
Initialisierungen, messen, .... , Ende. Irgendwie sowas.)
Küvette schrieb:> also wenn ich nicht schon seit Stunden daran sitzen würde, hätte ich> hier nicht gefragt. Ich bin absolut kein Programmierer und für mich ist> das alles neu.
Das ist Forschung. Neues erforschen und dazu gehört auch ein
Sensorprotokoll und wie das alles läuft und zusammenhängt. Den Horizont
erweitern. Ja, das hält alles auf und die Zeit läuft ab....
Da ist ein CMOS Zeilensensor drin, welchen Du auslesen musst. Zu
Zeilensensoren und dem Auslesen solcher (Stichwort "Eimerketten") findet
sich einiges an Literatur, welches dem Verständnis dienen sollte.
Der Rest sind der für die Spektroskopie erforderliche "Schlitz" sowie
ein Beugungsgitter im Chip-Format.
Mikrowilli schrieb:> Für die Steuerung des Ablaufes muß man den Takt CLK und eine Art> "Frame-Clock" ST anlegen. Die fallende Flanke von ST ist der Bezugspunkt> für alle zeitlichen Betrachtungen:
OK! Danke! so langsam verstehe ich das Prinzip das dahinter steht.
Mikrowilli schrieb:> Die gewünschte Integrationsdauer der> im Spektrometer verbauten CMOS-Zeilenkamera bestimmt, wieviele> CLK-Perioden vorher die steigende Flanke von ST stattgefunden haben muß.
Aha!
Integration time is equal to the high period of start pulse + 48 cycles
of clock pulses, so it will be 1.2 μs + 9.6 μs = 10.8 μs.
Also die high period + 48 pulse gibt dann die Integragtionszeit.
Im Beispiel-Code wären das dann also die 15 Pulse?
Also 15 + 48?
Sehe ich das richtig?
Mikrowilli schrieb:> Mit der fallenden Flanke von ST beginnt man sinnvollerweise auch die> Impulse am TRG-Ausgang des Spektrometers zu zählen, denn mit dem 89.> Impuls...
Im Beispiel Programm wird das ja nicht gemacht mit dem TRG zählen und
so. Wenn ich das richtig sehe, wird da einfach nach dem ST-Low Signal
der CLK bis zum 89 Puls gezählt und dann ausgelesen.
Ich hab einen Aufbau hier und ja, es funktioniert. Der Monitor gibt auf
jedenfall Werte aus. Die verändern sich auch je nach Belichtung des
Spektrometers.
Der Beispiel Code kommt übrigens von hier:
https://github.com/groupgets/c12880ma
Was mir jetzt noch ein Rätsel ist, sind die 7 Pulse am Ende.
Versteht ihr das?
Küvette schrieb:> Was mir jetzt noch ein Rätsel ist, sind die 7 Pulse am Ende.> Versteht ihr das?
Da wirst du wohl mal das Datenblatt des verwendeten CCD zu Rate ziehen
müssen.
Manche CCD haben ein paar lichtunempfindliche Dummy-Zellen vor den
aktiven Zellen und bauen mit den Vorimpulsen eine
Nullpunkts-Referenzspannung für den Leseverstärker bzw. den ADC auf.
Die Nachtrabanten dürften nötig sein um die Pipeline des ADC zu leeren
und den letzten Messwert auszugeben.
Küvette schrieb:> für ein Forschungsprojekt soll ein Spektrometer mittels Arduino> gesteuert und ausgelesen werden.
Was für ein Arduino?
Kontrolliere das Timing auf jeden Fall mit einem Oszi/LA.
Die Verwendung von digitalWrite() und mikrosekundengenaues Timing nach
Datenblatt mit delayMicroseconds() vertragen sich nicht ohne weiteres
weil digitalWrite() etliches an Overhead enthält.
Wolfgang schrieb:> Was für ein Arduino?
Das Board dürfte egal sein. Man könnte das Programm für den Controller
darauf auch mit einer anderen Programmiersprache erstellen.
Du hast aber Recht: Die Arduino-"Bibliothek" hat einen verhältnismäßig
großen Overhead.