PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : CCD-Zeile TSL1402



ekylix
06.01.2009, 23:13
Hi @ all

habe diese CCD-Zeile gefunden und möchte diese mit meinen Mega168 ansteuern.

http://www.eureca.de/pdf/optoelectronic/taos/TSL1402R.pdf

Nun weiß ich gar nicht wie ich das so recht anstellen soll.
Habe bis jetzt nur mit analogen Sensoren (Näherugsschaltern) gearbeitet ohne Takt.

Jetzt muß noch ein Taktgeber dazu? CLK?
Und schon weiß ich nicht was ich machen soll.
Muß man da den Controllertakt nutzen?

Außerdem möchte ich gern wieder ein analoges Ausgangssignal an einen meiner Ports empfangen (AO1 und AO2).

Für was sind serial input und serial output da (SI und SO) ?

Ich hoffe ihr könnt mir helfen meinen Horizont zu erweitern und mir eventuell erklären wie diesen Sensor am einfachsten beschalten kann.

Danke schonmal im vorraus

MfG Freddy

lokirobotics
07.01.2009, 13:28
Hallo ekylix,

ich hab mir das Datenblatt mal kurz angeguckt.
Also der Sensor scheint in zwei "Bänke" zu je 128 Pixeln unterteilt zu sein. Die Pixel werden nacheinander über AO1 (Bank1) und AO2 (Bank2) ausgelesen. AOx gibt dann eine Spannung zwischen 0 und 4,8V (oV->Schwarz, 2V->normal Weiß, 4,8V->?maximal erfassbare Helligkeit?) aus. Die kannst du ganz normal über deinen ADC-Pin einlesen. Mit CLK gehst du die einzelnen Pixel einer Bank durch. CLK kann mit maximal 8MHz getaktet werden, du könntest also theoretisch den Controllertakt verwenden. Es wäre jedoch besser, du erzeugst den Takt selber, sodass du weißt, welchen Pixel du gerade ausließt.

Serial In dient dazu, dem Sensor zu sagen, dass ein neuer Auslesevorgang stattfinden soll.
Serial Out wird zur Kaskadierung von mehreren Sensoren benutzt.

Das auslesen scheint recht einfach zu sein. Als erstes gibst du einen High-Impuls an SI1, dann toggelst du CLK und setzt SI1 wieder auf 0. Danach liest du nacheinander die ersten 128 Pixel ein. Also CLK auf 1, sampeln, CLK0, CLK1, sampeln...
Wenn du die ersten 128 Pixel eingelesen hast, ließt du die zweite Bank ein. Dazu machst du das gleiche nur dass du beim ersten Takt SI2 toggelst.
Laut Datenblatt kannst du SO1 auch an SI2 anschließen. Wenn die erste Bank ausgelesen wurde erzeugt SO1 einen High-Puls, womit du sofort die zweite Bank auslesen kannst. Du musst nur den einen zusätzlichen Takt beachten, in dem nicht gesampelt wird. SO2 könntest an SI1 eines weiteren Sensors anschließen und so Sensoren kaskadieren. Zusätzlich solltest du AO1 und AO2 miteinander verbinden. So brauchst du auch nur einen Portpin zum Einlesen (siehe Datenblatt Fig.9).

Ich hoffe, ich hab mich einigermaßen verständlich ausgedrückt und wünsche dir viel Erfolg beim Experimentieren.
Das ist ein sehr schöner Sensor, ich denke ich besorg mir auch so einen :D

MfG Loki

ekylix
07.01.2009, 19:18
Hallo loki,

danke für deine Antwort.

Leider stehe ich immernoch etwas auf dem Schlauch,

Mein Controller ist mit 20MHz getaktet also etwas zu schnell für den Sensor.
Nun würde ich gern einen Takt von 8MHz erzeugen wie mach ich denn das ?
Indem ich einen Port in einer Schleife ständig von High auf Low schalte?
Oder muß ich da Timer nutzen (damit habe ich noch nicht gearbeitet)?
Wie stell ich den auf 8MHZ ein?

Würde ihn gern seriell beschalten (Fig.9).

Wie sieht dann so ein eingelesenes Signal aus?

MfG Freddy

lokirobotics
07.01.2009, 20:07
Es ist beides möglich, kommt darauf an, wie der Rest deines Programmes aussieht. Wenn du nur den Sensor auslesen willst um z.B. Barcodes zu scannen, bzw. du keine Zeitkritischen Sachen hast, kannst du das alles (z.B.) in einer for-Schleife machen.
Einfach einen Zähler von 0 bis 255 hochlaufen lassen und bei jedem Durchgang folgendes machen:
1. CLK high
2. delay(1µs)
3. AO auslesen (AO1 und AO2 am gleichen Portpin)
4. CLK low
5. delay(1µs)

Die Werte kannste ablegen und dann auswerten.
Durch die delays verhinderste, dass du den Sensor zu schnell Taktest.
Beim ersten Durchlauf SI vor dem CLK auf High setzen.

Die delays sollten nicht weiter ins Gewicht fallen. Wenn du den Sensor allerdings sehr oft abfragst und die Zeit wichtig ist, würde ich das ganze über einen Interrupt machen.
Dazu musst du einen Timer so Takten, dass er >alle 1µS einen Interrupt erzeugt (Timer1 mit Compare z.B.). In der Interruptroutine checkst du, ob CLK high oder low ist.
Bei High liest du AO ein und legst den Wert ab und erhöhst deine Laufvariable um eins.
Bei Low checkst du, ob es Zeit für einen neuen Impuls an SI ist. Wenn ja, dann SI auf high und die Laufvariable zurücksetzen. Dann auf jeden Fall CLK auf high.

Das sollte eigentlich funktionieren, ich hoffe ich hab nichts übersehen (sowohl hier als auch im Datenblatt).
Was mir selber noch nicht ganz klar ist, ist das mit dem Integrating. Ich denke in der Zeit macht der Sensor sein Sample and Hold. Ich glaube allerdings nicht, dass wir da was beachten müssen.

Ich würd mich über ein Feedback freuen, obs funzt oder nich.

PS. Ich weiß ja nich, was die Sensoren bei eureca kosten, aber haste schon mal bei Pollin reingeguckt? Da gibts CCD-Zeilen aus Scannern für 3,95€ von 1200 bis 3200dpi
1200dpi (http://www.pollin.de/shop/detail.php?pg=NQ==&a=MjAwOTk4OTk=)
2400dpi (http://www.pollin.de/shop/detail.php?pg=NQ==&a=MDAwOTk4OTk=)
3200dpi (http://www.pollin.de/shop/detail.php?pg=NQ==&a=MTAwOTk4OTk=)

Die Funktionieren eigentlich genauso, nur dasse halt ne viel größere Auflösung haben und 3 Zeilen haben (RGB).[/quote]

ekylix
07.01.2009, 20:40
Danke Loki,

werde es einfach mal probieren Learning by doing.

Ich werde dir meine Ergebnisse mitteilen.