www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik ILX554 Problem


Autor: Thomas Bergmüller (nichtessbar)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich versuche gerade ein PC-Spektrometer zu bauen (wie hier: 
http://www.mikrocontroller.net/articles/Digitales_...) 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)
void ilx554_init()
{
  DDRD |= 0x60; // set output
  PORTD |= 0x60; // CLK and ROG to high
  // oszimessung
  DDRD |= 0x10; 
  PORTD &= 0xEF;  
}

void ilx554_measure()
{
  
  int i;
  // dummy readout

  PORTD |= 0x10; // für oszi
  // rog pulse
  PORTD &= 0xBF;
  _delay_ms(0.005); // pulsdauer
  PORTD |= 0x40;
  
  _delay_ms(0.005); // delay bis arbeitsbegin

  for(i=0;i<2090; i++)
  {    
    PORTD &= 0xDF; // low, active
    // clk pulse
    _delay_ms(0.0005); // for schleifen ausgleich
    
    PORTD |= 0x20;    
  } 
  
    PORTD &= 0xEF; // für oszi

}

void ilx554_getvalues()
{
  int j = 0;
  int i;
  PORTD |= 0x10; // für oszi
  // rog pulse
  PORTD &= 0xBF;
  _delay_ms(0.005); // pulsdauer
  PORTD |= 0x40;

  _delay_ms(0.005); // delay bis arbeitsbegin

  // dummy readout
  for(i=0; i<32; i++)
  {      
      PORTD &= 0xDF; // low, active
      // clk pulse      
      _delay_ms(0.0005);
      PORTD |= 0x20;
  }
    

  for(i=0;i<2048; i++)
  {
    if((i%4)==0)
    {
      PORTD &= 0xDF; // low, active
      values[j] = readADC(3);
      j++;      
      PORTD |= 0x20; // back high 
      _delay_ms(0.270); // ausgleichen von ADC-Messung

    }
    else
    {
      PORTD &= 0xDF; // low, active
      // clk pulse      
      _delay_ms(0.0005);
      PORTD |= 0x20;
    }    
  } 

  for(i=0; i<32; i++) // noch einige pixel nachher
  {
      PORTD &= 0xDF; // low, active
      // clk pulse      
      _delay_ms(0.0005);
      PORTD |= 0x20;
  }

  PORTD &= 0xEF; // für oszi
}

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

Autor: Klaus Falser (kfalser)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Thomas Bergmüller (nichtessbar)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Thomas Bergmüller (nichtessbar)
Datum:

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

Autor: Thomas Bergmüller (nichtessbar)
Datum:

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

Autor: Klaus Falser (kfalser)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Thomas Bergmüller (nichtessbar)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Klaus Falser (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.