CCD-Lineal: Womit es gegessen wird


In diesem Artikel möchte ich meine Erfahrungen mit der Verwendung eines linearen CCD-Fotodetektors vorstellen. Eine solche CCD-Linie kann beim Entwurf eines provisorischen Spektrometers, eines Barcodelesers, eines Laserstrahl-Positions- oder Abweichungssensors, eines Scanners für Foto oder Film und vielem mehr verwendet werden. In meinem Fall war es ein Laserscanner, den ich im Netzwerk nicht beschreiben kann.

Was ist ein ladungsgekoppeltes Gerät?

Wenn es um CCD geht, meinen sie meistens verschiedene Fotodetektoren. Seltener sind dies Speichervorrichtungen: Schieberegister, Verzögerungsleitungen. Im Kern erinnert dieses Gerät etwas an den Speicher auf zylindrischen magnetischen Domänen, nur auf Silizium - mit Hilfe einer Wanderwelle eines elektrischen Feldes, das von einem Elektrodensystem erzeugt wird, bewegen sich Klumpen von Ladungsträgern, die sich früher in ihm gebildet haben, durch den Halbleiter. So erhalten wir ein Schieberegister, das eine extrem einfache Struktur aufweist und sich nicht nur eine Folge von digitalen Einheiten und Nullen, sondern auch ein analoges Signal merken kann.

In den CCD-Bildempfängern wird genau diese Fähigkeit dieser Struktur verwendet, um die unter jedem der Pixel der Struktur akkumulierten Ladungen sequentiell auszugeben. Darüber hinaus erzeugt dasselbe Gatesystem, das zum Bewegen der Ladungen während der Belichtung verwendet wird, Potentialtöpfe, in denen sich diese Ladungen ansammeln (oder diese Löcher entstehen während der Bildung der Struktur - ähnlich den eingebauten und induzierten Kanälen des MOS-Transistors). Komplexere Strukturen umfassen ein Widerstandstor, entlang dessen eine glatte Potentialsteigung gebildet wird (so sind die Hamamatsu S11155 CCD-Leitungen angeordnet), sowie die Trennung von Ladungsakkumulations- und Ladungsübertragungszonen - die akkumulierten Ladungen der gesamten Leitung werden zuerst auf die Pufferleitung übertragen und anschließend vorgeschoben Ausfahrt entlang der letzten.
Die Einfachheit der internen Struktur führt zu einer komplexen Verwaltung. Selbst die einfachste Version der CCD-Leitung erfordert die Erzeugung eines zwei- oder dreiphasigen Signals komplexer Form mit unterschiedlichen Spannungspegeln mit steilen Kanten (mit einer hohen Eingangskapazität von 1000 pF oder mehr), die relativ zueinander verschoben sind. Lineale vom Typ Hamamatsu S11155 benötigen bis zu acht verschiedene Signale mit unterschiedlichen Hoch- und Niederspannungspegeln auf beiden Seiten von Null.
Glücklicherweise haben einige Unternehmen (zum Beispiel Sony) eine Linie herausgebracht, in der all diese Komplexität direkt auf dem Chip gebildet wird. Und für ihre Arbeit müssen Sie nur zwei Signale erzeugen: den sich öffnenden elektronischen Verschluss für die Dauer der Belichtung und die Uhr. In unserem Design ist dies genau die ILX554-Linie: Sie ist (in der Regel gebraucht, aber recht funktional) bei den Chinesen auf Aliexpress leicht zu kaufen.

Schauen wir uns das Datenblatt an

Und wir sehen, dass nur 6 der 22 Pins beteiligt sind. Dies sind + 5V-Stromversorgung, ROG- und CLK-Eingangssignale, Vout-Ausgangssignal, SHSW-Modus-Auswahleingang und Masse. Und das ist alles.
ROG ist die elektronische Verschlusssteuerung (und der Beginn der Ladungsübertragung von der lichtempfindlichen Leitung zum direkten Schieberegister). Er hat ein aktives Level - Null. Um die Matrix freizulegen, muss sie auf Null gedrückt und so lange wie nötig gehalten werden - von 5 μs bis zu mehreren Sekunden. Warten Sie dann beim Loslassen mindestens 3 μs (während dieser Zeit funktioniert die Ladungsübertragungsschaltung). Die ganze Zeit am Eingang von CLK halten wir ein hohes Niveau. Und dann können Sie die Zeile lesen und auf den CLK-Eingang einen Mäander mit einer Frequenz von mehreren zehn Kilohertz bis 2 MHz anwenden. In diesem Fall wird bei jeder Differenz von Eins zu Null das nächste Pixel zur Ausgabe verschoben. Es gibt 2088 solcher Pixel in der Aufstellung, von denen 2048 lichtempfindlich arbeiten (in Wirklichkeit sind es mehrere, aber die äußersten Pixel sind teilweise verdeckt). Datashit empfiehlt, mindestens 2090 CLK-Impulse für einen korrekten Betrieb an die Matrix anzulegen.
Und wie es gepusht wird, hängt davon ab, was am Eingang von SHSW ist. Wenn es sich um eine logische Einheit handelt, erzeugt der Ausgang ein ziemlich kompliziertes Signal:

Wenn der CLK von Null auf Eins geht, tritt außerdem ein Zurücksetzen auf, und von Eins auf Null wird ein Nutzsignal ausgegeben.
Und bei Null am SHSW-Eingang wird die eingebaute Abtastspeicherschaltung eingeschaltet, was dieses Signal zu einem einfachen schrittweisen Videosignal vereinfacht, bei dem bei jedem neuen Übergang von CLK zu Null der Signalpegel des nächsten Pixels einfach erscheint und für die gesamte Periode des CLK-Signals gehalten wird.
Der nützliche Bereich des Ausgangssignals kommt von einem bestimmten Dunkelpegel, der laut Datenblatt 2,85 V beträgt, aber in Wirklichkeit kann er unterschiedlich sein (in meiner Leitung - ungefähr 3 V), und wenn er gesättigt ist, fällt der Ausgangssignalpegel auf 1,5-2 B. B.
Im Allgemeinen ist das alles, was wir über diese Linie wissen müssen.

Einschlussschaltung


Es ist einfach und offensichtlich. Wir erzeugen CLK- und ROG-Signale programmgesteuert mit MK, und Schmitt-Trigger am Eingang sind die einfachste Möglichkeit, von 3,3 V auf 5 V umzuschalten. Tatsache ist, dass diese Leitungen in den Leitungen keine Puffer enthalten und dass die Matrixschaltungen ordnungsgemäß funktionieren Sie müssen ihnen einen Mäander mit einer vollen Skala von null bis fünf Volt und einer guten Steilheit der Fronten vorlegen. Die im Diagramm angegebenen NC7SZ14M5X sind sehr praktische einzelne Schmitt-Invertierungsauslöser mit steilen Fronten und erhöhter Tragfähigkeit, die ich häufig in meinen Projekten verwende.
Bei Verwendung von DA1 "beschleunigt" der Videosignalpegel aus der Aufstellung auf den Bereich, in dem der ADC arbeitet, während der "Stand" von ungefähr 1,5 V, der dem Sättigungspegel entspricht, entfernt wird. Da die Differenz zwischen der Signalamplitude und dem "Stand" -Wert zwischen verschiedenen CCD-Arrays stark variiert, sollten die Widerstände R1 und R3 ausgewählt werden, indem das Ausgangssignal in den erforderlichen Bereich "gelegt" wird. Es sollte beachtet werden, dass nicht nur die Verschiebung, sondern auch die Verstärkung vom Widerstand R1 abhängt. Sie müssen ihn also zuerst auswählen.
L1 und L2 sind Ferritperlen oder kleine Drosseln für 1-2 μG der Baugröße 0805 oder 0603. Widerstände und Kondensatoren werden von gleicher Größe verwendet. Die Schaltung wird durch Aufputzmontage auf einer doppelseitigen Platine montiert. Ich bringe das Board-Layout nicht mit, da ich noch viele Dinge drauf habe.

Software-Implementierung auf MK

Die MK-Aufgabe besteht darin, ein ROG-Signal mit hohem Pegel zu erzeugen (Wechselrichter nicht vergessen!) Von der erforderlichen Dauer, dann eine kurze Pause (3-10 μs) und danach eine Folge von 2090 Impulsen mit hohem Pegel, die durch gleiche Pausen in der Dauer getrennt sind. Während dieser Impulse (oder Pausen), einige Zeit nach der Vorderseite, wird der Pixelbeleuchtungswert unter Verwendung eines integrierten oder externen ADC gemessen. Nach dem Lesen des Frames müssen Sie auch bis zu einem neuen ROG-Impuls pausieren - die gleichen 3-10 μs. Nach dem Einschalten der Stromversorgung und, wie sich herausstellte, nach einer langen (mehr als 100 ms) Nichtbenutzung des Lineals müssen Sie es „reinigen“, indem Sie ein paar Mal eine kostenlose Standardimpulsfolge an den CLK anlegen.
Auf STM32 ist es ratsam, dies alles bei einem Timer-Interrupt zu tun. Durch Einstellen des Timers zum Erzeugen von Interrupts mit einer Frequenz, die einer doppelten Pixelfrequenz entspricht, wird jede Timeroperation in einen Interrupt umgewandelt, in dem wir abwechselnd Null oder Eins an den Port ausgeben. Wenn wir Null ausgeben, lesen wir die Messwerte vom ADC. Und nachdem wir 2090 Zyklen gezählt haben, stoppen wir den Timer. Um das nächste Bild zu lesen, müssen Sie den Zykluszähler auf Null zurücksetzen, den Timer starten und warten, bis alles gezählt ist.
So etwas wie in diesen Codefragmenten gezeigt.

bool clkState = false; bool frameOk = true; uint16_t pixCount = 0; uint16_t ccdFrame[2090]; inline uint16_t readADC1(void) //            { . . . } void Delay(unsigned int Val) //     { for( ; Val != 0; Val--) __NOP(); } void readCCD(void) //   - { pixCount = 0; //    frameOk = false; //   TIM_Cmd(TIM6, ENABLE); //   while(frameOk == false); // ,     } // ...    ... // void TIM6_IRQHandler(void) /*      -     CLK       */ { if (TIM_GetITStatus(TIM4, TIM_IT_Update) != RESET) { if(clkState == true) //   (.0)      { clkState = false; GPIOB->ODR &= ~GPIO_ODR_ODR_1; //      Delay(3); //  ,        ccdFrame[pixCount] = readADC1(); } else //   (.1) { pixCount++; clkState = true; GPIOB->ODR |= GPIO_ODR_ODR_1; //      } if(pixCount >= 2090) //    ,      { pixCount = 0; frameOk = true; TIM_Cmd(TIM6, DISABLE); } TIM_ClearITPendingBit(TIM4, TIM_IT_Update); } } 


Und hier ist das Ergebnis
Das Ergebnis ist nicht schlecht. Trotz der Tatsache, dass der eingebaute ADC keine Eigenschaften aufweist, entsprechen seine Rauscheigenschaften vollständig dem Rauschen der CCD-Leitung. Die Amplitude des Rauschpfades des dunklen Signals mit einer Akkumulationszeit von etwa 1 ms beträgt ~ 3-4 Quantisierungspegel, und bei Verwendung eines externen 14-Bit-ADC mit hervorragenden Eigenschaften sind die Ergebnisse nur geringfügig besser. Mit zunehmender Beleuchtung nimmt das Rauschen aus einem einfachen Grund zu: Die Anzahl der Photoelektronen in jedem der Pixel ist nicht so groß (nach meinen Berechnungen etwa 30.000 bei Sättigung). Für die besten Geräte erreicht dieser Wert 200.000.
In der folgenden Tabelle sehen Sie ein Beispiel für ein vom Lineal registriertes „Bild“, auf dem sich vor dem Hintergrund der beleuchteten Wand ein dunkler Ständer befindet, auf dem eine Glashohlkugel mit einem Durchmesser von 1 cm, die im Inneren befestigt ist, mit schwarzer Lösung gefüllt ist. Ein Peak ist eine Reflexion von der Außenfläche dieser Kugel. Das Rauschen in hellen Bereichen ist die Struktur der Wand selbst, die durch Flecken vom Laser verstärkt wird und von Bild zu Bild stationär bleibt. Das reale Leitungsrauschen ist viel geringer.
Bild


Andere ähnliche Linien
Einige andere 2048-Pixel-Schwarzweiß-SONY-CCD-Leitungen von ILX511, ILX551 (letztere haben eine andere Pinbelegung und erfordern zwei Versorgungsspannungen - 5 und 9 V), die sich in der transversalen Pixelgröße (von 14 bis 200 Mikrometer) unterscheiden, funktionieren genauso. und spektrale Empfindlichkeit (ILX554A ist rot- und IR-empfindlich, ähnlich wie Index B hat eine verringerte Empfindlichkeit im IR-Bereich und ist nahe an der Empfindlichkeit für das Auge, und ILX511B ist blauerempfindlicher). Ihre dynamischen Eigenschaften sind unterschiedlich: Der Dynamikbereich des ILX551B erreicht aufgrund der geringen Pixelgröße 6000 (unsere Linie erreicht diese DD mit kurzen Verschlusszeiten von ca. 10 μs).

* * *
Dieser Artikel beschreibt den Anschluss der vielleicht am einfachsten zu verwendenden CCD-Leitung. Diese Einfachheit ist auf die Tatsache zurückzuführen, dass die ganze Komplexität in ihr unter der Haube verborgen ist. Ohne die eingebauten Treiber müsste ich viele mehrstufige Signale erzeugen.
Leider weist eine solche CCD-Linie mit eingebauten Treibern nach modernen Maßstäben nicht die besten Eigenschaften auf. In dieser Zeile beträgt der dynamische Bereich, definiert als das Verhältnis des Sättigungssignals zum dunklen Signal, 333: 1 und definiert als das Verhältnis des Sättigungssignals zum minimalen Signal, das vor dem Hintergrund des Rauschens erfasst wird - etwa 1000: 1. Solche Geräte sind jedoch nicht nur schwer zu bedienen, sondern oft auch schwer zugänglich (dasselbe Hamamatsu erfordert komplexe bürokratische Formalitäten beim Kauf seiner CCD-Arrays und anderer Fotodetektoren aufgrund des doppelten Zwecks dieser Produkte). Eine derart hohe Leistung ist jedoch nicht immer erforderlich, und für viele Zwecke sind die Parameter dieser Geräte durchaus akzeptabel.

Source: https://habr.com/ru/post/de457762/


All Articles