Forum: Mikrocontroller und Digitale Elektronik ILX554 Problem


von Thomas B. (nichtessbar)


Lesenswert?

Hallo,

ich versuche gerade ein PC-Spektrometer zu bauen (wie hier: 
http://www.mikrocontroller.net/articles/Digitales_PC-Spektrometer) und 
jetzt stehe ich bei der Ansteuerung des Linear-CCD ILX554.

Er liefert bei völliger Dunkelheit Werte, die stimmen können, und wenn 
man mit Licht drauffährt, dann wird die Spannung der einzelnen 
Pixelausgaben niedriger (weil er ja invertiert arbeitet). Schön und gut, 
das würde darauf hindeuten, dass alles wie gewünscht läuft. Wenn ich 
jetzt allerdings die Hälfte des Sensors abdecke (schwarzes Isolierband, 
5 lagig ^^) und die anderen mit einer LED bestrahle, liefert er mir über 
alle Pixel einen annähernd gleichen Wert, was von den Lichtverhältnissen 
nicht sein kann, wenn die Hälfte hell und die andere dunkel ist.

Das Einlesen an sich funktioniert richtig, am Oszi sieht der 
Pixelverlauf genau gleich aus wie die gelesenen Werte, daran liegts also 
nicht.

Integrationszeit ist in etwa 2ms, zum Auslesen brauch ich allerdings 
fast 250ms (noch 10 Bit ADC, würd definitiv schneller gehen wenn 
gefordert)

Hier der Code  (in C da das restliche Projekt in der Sprache ist und ich 
nur ungern mischen möchte):

Die Variable values ist global definiert short-Array. CLK liegt auf PD5 
und ROG auf PD6. S/H aktiviert (Masse)
1
void ilx554_init()
2
{
3
  DDRD |= 0x60; // set output
4
  PORTD |= 0x60; // CLK and ROG to high
5
  // oszimessung
6
  DDRD |= 0x10; 
7
  PORTD &= 0xEF;  
8
}
9
10
void ilx554_measure()
11
{
12
  
13
  int i;
14
  // dummy readout
15
16
  PORTD |= 0x10; // für oszi
17
  // rog pulse
18
  PORTD &= 0xBF;
19
  _delay_ms(0.005); // pulsdauer
20
  PORTD |= 0x40;
21
  
22
  _delay_ms(0.005); // delay bis arbeitsbegin
23
24
  for(i=0;i<2090; i++)
25
  {    
26
    PORTD &= 0xDF; // low, active
27
    // clk pulse
28
    _delay_ms(0.0005); // for schleifen ausgleich
29
    
30
    PORTD |= 0x20;    
31
  } 
32
  
33
    PORTD &= 0xEF; // für oszi
34
35
}
36
37
void ilx554_getvalues()
38
{
39
  int j = 0;
40
  int i;
41
  PORTD |= 0x10; // für oszi
42
  // rog pulse
43
  PORTD &= 0xBF;
44
  _delay_ms(0.005); // pulsdauer
45
  PORTD |= 0x40;
46
47
  _delay_ms(0.005); // delay bis arbeitsbegin
48
49
  // dummy readout
50
  for(i=0; i<32; i++)
51
  {      
52
      PORTD &= 0xDF; // low, active
53
      // clk pulse      
54
      _delay_ms(0.0005);
55
      PORTD |= 0x20;
56
  }
57
    
58
59
  for(i=0;i<2048; i++)
60
  {
61
    if((i%4)==0)
62
    {
63
      PORTD &= 0xDF; // low, active
64
      values[j] = readADC(3);
65
      j++;      
66
      PORTD |= 0x20; // back high 
67
      _delay_ms(0.270); // ausgleichen von ADC-Messung
68
69
    }
70
    else
71
    {
72
      PORTD &= 0xDF; // low, active
73
      // clk pulse      
74
      _delay_ms(0.0005);
75
      PORTD |= 0x20;
76
    }    
77
  } 
78
79
  for(i=0; i<32; i++) // noch einige pixel nachher
80
  {
81
      PORTD &= 0xDF; // low, active
82
      // clk pulse      
83
      _delay_ms(0.0005);
84
      PORTD |= 0x20;
85
  }
86
87
  PORTD &= 0xEF; // für oszi
88
}

Aufgerufen wird dann bei der Messung:

ilx554_measure();
ilx554_getvalues();

Hat irgendjemand eine Idee nach was ich suchen soll bzw. was da falsch 
ist... dachte erst er ist überbelichtet, aber da sich ja bei Belichtung 
die Sensorwerte ändern bin ich von dem wieder abgekommen.

Rauskommen bei keinem Licht tut ~0x700 (was etwa 3.4V entspricht), bei 
Beleuchtung mit einer LED und obiger Integrationszeit gehts auf 0x613 
runter.

Habs auch schon probiert mit diversen Dummy-Readouts vor und nach der 
Messung, hat alles nix geändert

von Klaus F. (kfalser)


Lesenswert?

Steht in dem Artikel nicht, dass man mit der Auslesezeit unter 110 ms 
bleiben sollte?
Und funktioniert ein delay_ms(0.0005) überhaupt noch wie gewünscht? Das 
sind ja 0.5 us, selbst bei einem 16 MHz Quarz sind das nur 8 Taktzyklen. 
Da braucht wahrscheinlich Ein- und Aussprung in die Funktion mehr Zeit.

von Thomas B. (nichtessbar)


Lesenswert?

ein- und aussprung sind mit berücksichtigt, habs am Oszi so gemessen 
dass es auf 50% Tastverhältnis (lt. Datenblatt ja gefordert) hinkommt, 
und da funktioniert das blendend ... musste ich machen, weil die 
FOR-Schleife ja auch a paar Zyklen braucht, um die auszugleichen ;)

jop, ich schreibs grade eben um auf 8-bit-ADC, die schaffen ja dann 
einiges schneller, allerdings denk ich ist's noch in Ordnung weil mir 
die Spannung in den Registern nicht wegsackt wenns ganz finster ist... 
Aber könnt a Möglichkeit sein, geb ich zu.

von Thomas B. (nichtessbar)


Lesenswert?

ok, geändert, auslesezeit 115ms, dürft noch passen hoff ich, restliche 
Situation unverändert =(

von Thomas B. (nichtessbar)


Lesenswert?

update... Auslesezeit ~11ms, habs jetzt mal so schnell wie möglich 
gemacht... ändert nichts grml

von Klaus F. (kfalser)


Lesenswert?

- Der Sensor sollte laut Datenblatt 2.85 V (nicht 3.4 V) bei Dunkelheit 
haben.
- Bei Übersteuerung/Belichtung sinkt die Spannung um 1 V -> ~1.8V
Der Ausgelesene Wert 0x613 ist viel zu groß.
- Ist Sample/Hold aktiviert?

von Thomas B. (nichtessbar)


Lesenswert?

hm, darf ich fragen was für ein Datenblatt du hast, ich hab eins mit 14 
Seiten und da steht fast nichts brauchbares drinnen, könntest mir deins 
evtl. zukommen lassen?

Sample und Hold ist aktiviert, dh. auf Masse gelegt, ja.

sehr geil... jetzt hab ich mal versorgung getrennt und wieder 
angesteckt, jetzt kommt 0x511 raus und nichts ändert sich mehr, egal ob 
ich belichte oder nicht ^^ irgendwo is da ein höchst komischer hund 
begraben...

von Klaus Falser (Gast)


Lesenswert?

Das Datenblatt habe ich mit google gefunden, hat auch 14 Seiten und ist 
wahrscheinlich das selbe wie deines.
Ob nichts brauchbares drinnensteht, das interpretiert jeder 
wahrscheinlich anders.

Hast Du kein Oszi, mit dem Du die Signale anschauen kannst?

Apropos : Die Dinger sind meist empfindlich auf ESD (Berührung) und 
gehen schnell kaputt.

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.