Forum: Mikrocontroller und Digitale Elektronik Spektrometer Steuerung mittels Arduino


von Küvette (Gast)


Lesenswert?

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_t data[SPEC_CHANNELS];
10
11
void setup(){
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
void readSpectrometer(){
31
32
  int delayTime = 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(int i = 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(int i = 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(int i = 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(int i = 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 
39
 * processing plot
40
 */
41
void printData(){
42
  
43
  for (int i = 0; i < SPEC_CHANNELS; i++){
44
    
45
    Serial.print(data[i]);
46
    Serial.print(',');
47
    
48
  }
49
  
50
  Serial.print("\n");
51
}
52
53
void loop(){
54
   
55
  readSpectrometer();
56
  printData();
57
  delay(10);  
58
   
59
}

von Jester (Gast)


Lesenswert?

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...

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Küvette schrieb:
> Danke für jede Hilfe!
Ein fertiger Ingenieur würde sich jetzt das EVAL-Board C13016 kaufen, um 
immer wieder mal einen Blick auf das Hersteller-Design werfen zu können. 
Das scheint übrigens nur auf den ersten Blick teuer:
https://de.rs-online.com/web/p/entwicklungstools-sensorik/2009489

Mit dem Ding kann man einfach mal messen, was da auf den Signalen so 
abläuft und was die Software draus macht. Denn immerhin ist der Sensor 
an sich ja auch schon nicht sooo arg billig:
https://de.farnell.com/hamamatsu/c12880ma/mini-spektrometer-5-bis-50-c/dp/3134750

: Bearbeitet durch Moderator
von Küvette (Gast)


Lesenswert?

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!

von Mikrowilli (Gast)


Lesenswert?

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!

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Angehängte Dateien:

Lesenswert?

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.

von K. H. (hegy)


Lesenswert?

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....

: Bearbeitet durch User
von Hugo H. (hugo_hu)


Lesenswert?

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.

: Bearbeitet durch User
von Küvette (Gast)


Lesenswert?

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?

von Hp M. (nachtmix)


Lesenswert?

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.

: Bearbeitet durch User
von Wolfgang (Gast)


Lesenswert?

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.

von STK500-Besitzer (Gast)


Lesenswert?

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.

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.