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