Ansteuerung von (linearen) CCD Sensoren
In fast jedem Scanner oder Faxgerät findet sich ein lienarer CCD Sensor mit einigen tausend Pixel Auflösung. Die Ansteuerung eines solchen ist eigentlich relativ einfach.
CCD
Module sehen nicht nur teuer aus, meistens sind sie es sogar. Nach obenhin gibt
es eigentlich keine Preisgrenze...
Nach unten hin gibt es eine: Nämlich kostenlos. So bekommt man die CCDs
nämlich aus alten Scannern, Faxgeräten, Barcodescannern, Kameras usw.
Das Auslöten der meist >20 poligen ICs ist meist relativ aufwendig,
da CCD Sensoren aufgrund ihrer Abmessungen relativ empfindlich sind. Hier muss
man sich mit Entlötlitze oder ähnlichem etwas gedulten.
Um das Auslöten kommt man selten herum, da die Bezeichnung dummerweise
auf der Unterseite des CCDs aufgedruckt ist.
Die Ansteuerung ist bei jedem CCD anderst. Für das genaue Timing sollte man dieses im Datenblatt nachlesen. Weiterhin gibt es bei CCDs alle möglichen Zusatz"features" im CCD: Angefangen bei Sample&Hold Stufen (die ich meist abschalte, da ich die Klemmwerte für die Offsetkompesation benötige) über elektronische Shutter (meist Integration Clear Gate genannt), bis hin zu einem Multiplexer der die RGB Daten an einem umschaltbaren Pin ausgibt. Bei größeren CCDs gibt es manchmal 2 Ausgänge pro Farbe (Odd/Even) um die Daten schneller auslesen zu können.
Die Betriebsspannung der CCDs liegt meist bei 12V. Einige CCDs kommen auch mit 5V aus. Die Taktsignale benötigen bei heutigen CCDs meist 5V. Ältere benötigen dagegen meist 12V. Genau Informationen findet man nur im Datenblatt.
Im folgenden gehe ich nur auf einige typische Signale aus CCDs von NEC und Toshiba ein, da diese relativ weit verbreitet sind.
NEC CCDs:
Die
Messzeit des CCDs wird durch die Zeit zwischen zwei TG Impulsen bestimmt. Während
dieser Transferphase muss der Schiebetakt gestoppt werden, und Phi1 daher auf
high liegen. Die Reset und Clamp Signale (RB und CLB) müssen weiterhin
angelegt werden. Die Zeit zwischen Anhalten des Taktes und dem Ausleseimpuls,
sowie die Dauer sollten dem Datenblatt entnommen werden. Meist sind es einige
Mikrosekunden.
Nach diesem Transfer stehen die Daten nun im Schieberegister zur Verfügung.
Mit jedem Schiebetakt wird ein Pixel weiter geschoben. Wird ein Reset Signal
angelegt (RB, Low aktiv) wird der aktuelle Wert gelöscht und das CCD auf
den nächsten Pixel vorbereitet. Mit dem Reset Clamp Impuls (CLB, low aktiv)
wird der Ausgang gelöscht und somit auf Schwarzpegel (= maximale Spannung
gesetzt). Diesen Wert kann man nutzen um eine automatische Offset und Pegelanpassung
an den ADC Messbereich vorzunehmen. Mit der fallenden Flanke von Phi1 wird der
nächste Pixelwert ausgegeben.
Toshiba CCDs:
Die
Messzeit des CCDs wird durch die Zeit zwischen zwei SH Impulsen bestimmt. Während
dieser Transferphase muss der Schiebetakt gestoppt werden, und Phi1 daher auf
high liegen. Die Reset und Clamp Signale (RS und CP) müssen für 1
Takt weiterhin angelegt werden. Während des Transfers müssen aber
auch diese inaktiv sein. Die Zeit zwischen Anhalten des Taktes und dem Ausleseimpuls,
sowie die Dauer sollten dem Datenblatt entnommen werden. Meist sind es einige
Mikrosekunden.
Nach diesem Transfer stehen die Daten nun im Schieberegister zur Verfügung.
Mit jedem Schiebetakt wird ein Pixel weiter geschoben. Wird ein Reset Signal
angelegt (RS, high aktiv) wird der aktuelle Wert gelöscht und das CCD auf
den nächsten Pixel vorbereitet. Mit dem Reset Clamp Impuls (CP, high aktiv)
wir der Ausgang gelöscht und somit auf Schwarzpegel (= maximale Spannung
gesetzt). Diesen Wert kann man nutzen um eine automatische Offset und Pegelanpassung
an den ADC Messbereich vorzunehmen. Mit der fallenden Flanke von Phi1 wird der
nächste Pixelwert ausgegeben.
Hinweis: Einige CCDs liefern pro Takt 2 Pixelwerte, also je einen pro Pegel.
In diesem Fall müssen RS und CP einmal pro Pegel von Phi aktiviert werden.
Die
Offsetanpassung des CCDs an den Messbereich des ADCs wird über eine AC
Kopplung mittels Kondensatoren gemacht.
Wenn der CCD die maximale Ausgangsspannung liefert, wird der ADC Eingang mit
dem oberen Ende des Messbereichs (in diesem Fall 5V) verbunden. Der Kondensator
läd sich nun auf die Offset Spannung auf. Anschließend werden die
Schalter wieder geöffnet und am CCD der nächste Pixel ausgegeben.
Die nun anliegende Spannung ist auf jedenfall niedriger und liegt somit innerhalb
des Messbereichs des ADCs.
Um den korrekten Farbwert zu erhalten, muss der gemessene Wert nur invertiert
werden.
Das
Datenblätt empfielt für die Ausgangssignale des CCDs einfache Pufferverstärker,
da die CCD Ausgänge relativ hochohmig sind (ca. 1kOhm). Sitzt der ADC aber
direkt neben dem CCD, und besitzt der ADC hochohmige Eingänge, kann dieser
Puffer meist entfallen.
Eventuell kann es hilfreich sein, an die ADC Eingänge kleine Kondensatoren
(ca. 100pF) anzuschließen, da die meisten ADCs mit Sample&Hold Stufe
während der Sample Phase kurzzeitig niederohmig werden (Eingangswiderstand
teilweise unter 10kOhm). Außerdem wirkt der Kondensator als Tiefpass und
beseitigt hochfrequente Störungen.
Da
die Taktleitungen des CCDs große Schieberegister treiben müssen,
weißen die Eingänge meist sehr große Kapazitäten (teilweise
über 1nF) auf. Deshalb werden daher direkt in der Nähe des CCDs leistungsfähige
Treiber mit Serienwiderständen empfohlen. Teilweise habe ich sogar schon
1,5A MOSFET Treiber an den CCD Eingängen gesehn. Heutige Mikrocontroller
liefern an den Ausgängen meist genug Strom um die CCD Eingänge direkt
treiben zu können, vor allem wenn die Taktrate nicht allzu hoch ist.
Dies spart Bauteile und Platz auf der Platine.
Mit
all diesen Einsparungen, reichen 2 Spannungsregler, ein Mikrocontroller mit
ADC Eingängen und einige Kondensatoren und Widerstände zum Betreiben
eines CCDs aus:
Der uC (in diesem Fall
ein AVR: ATmega8 mit 16MHz) erzeugt die Steuersignale für den CCD und wandelt
im Hintergund die Ausgangsspannungen des CCDs in digitale Werte um, die anschließend
zum PC übertragen werden.
Hier sieht man ein Farb CCD mit je 5300 Pixeln Auflösung mitsamt der Ansteuerschaltung
und Optik auf einem Schrittmotor montiert.
Dies ergibt einen schönen rundum Scanner, wie man auf folgendem Bild sehen kann:
Die Senrechten Störugen sind Überbelichtungen des CCDs, was ein schönes blooming ergibt (Überlaufen der Werte in benachbarte Zellen.)
Hier noch einige Hinweise, die mir aufgefallen sind:
- Nach jedem Transfer
der Daten ins Schieberegister (mittels TG bzw. SH) müssen alle Pixel komplett
ausgelesen werden, sonst addieren sich die Daten der nichtausgelesenen Pixeln
zu den neuen Werten.
- Die Belichtungszeit liegt bei einem CCD mit einer 1cm Linse davor bei indirektem
Tageslicht bei etwa 10ms.
- Ohne Linse oder sonstigem
Filter wird das CCD extrem Licht empfindlich und überbelichtet sehr schnell.
- Wenn im Signal Sprünge auftreten (die ersten paar gemessenen Werte haben
minimal mögliche Spannung, danach springt die Spannung plötzlich zu
normalen Werten) dann ist die Zeile überbelichtet.
- Rot, grün und blau sind unterschiedlich empfindlich. Meist ist rot am
empfindlichsten, und blau am wenigsten empfindlich. Bei dem CCD das ich verwendet
habe (uPD3797), liefert rot ziemlich genau die doppelte Spannung wie grün
und blau.
- Das Auslesetiming ist nicht wirklich kritisch, die Frequenzen können
in weitem Bereich variieren.
- Nachdem der Takt eingeschaltet wird, benötigt das CCD einige 10 Zeilen
bis es brauchbare Daten liefert. Der Takt (Schiebtakt, RB, CLB, usw.) sollte
daher, falls möglich, immer laufen.
- Die Ausgangssignale benötigen eine Offset und Verstärkungsanpassung,
z.B. über Schwarzpixel oder über eine AC Kopplung mit Klemmung wie
oben dargestellt. Außerdem sind die Farben mit den Rohdaten etwas blaß.