Digitales PC-Spektrometer

Aus der Mikrocontroller.net Artikelsammlung, mit Beiträgen verschiedener Autoren (siehe Versionsgeschichte)
Wechseln zu: Navigation, Suche

Digitales PC-Spektrometer im Eigenbau

Einleitung

Spektrometer sind aus der modernen Wissenschaft nicht mehr wegzudenken. Astronomen, Chemiker, Physiker, Biologen, etc. sind oft auf die Analyse von Spektrum Analysern und Spektrometern angewiesen. Ich hatte nun kürzlich die Gelegenheit ein kommerzielles PC-Spektrometer zu benutzen, um damit in einem Laser-Labor Laserstrahlen auf die Bandbreite hin zu untersuchen. Das sehr teure Messgerät koppelte Licht per Lichtleiter ein, und zeigte dann am PC-Monitor das Spektrum live an. Bei der Arbeit kam mir die Idee, so ein Live-PC-Spektrometer nachzubauen. Spektrometer werden in unterschiedlichsten Bauformen auch in der Hobbyastronomie angewendet, um verschiedene Himmelskörper spektroskopisch zu vermessen. Natürlich kann man damit auch die Qualität von Energiesparlampen, angeblichen "Vollspektrumlampen", Aquariumbeleuchtungen, etc. vermessen. Ausserdem ist das Prinzip echt interessant, und man kann viel experimentieren. Nach einigen Tests und viel Ausprobieren hat es auch schlussendlich geklappt: ein funktionierendes PC-Spektrometer war konstruiert.

Hier stelle ich nun das Prinzip, den Bau, die Schaltung und den Code vor, sodass jedermann das Gerät nachbauen, und nach Belieben benutzen, verbessern, anpassen und verändern kann.

Viel Spass beim Lesen und Nachbauen !

Spectrum Energiesparlampe.jpg

(Dies ist das Spektrum einer herkömmlichen Schreibtisch-Energiesparlampe, X-Achse wird nach rechts kurzwelliger (rechts = blau / links = rot))

Das Prinzip

Es geht bei diesem Selbstbau-Projekt darum, ein optisches Spektrometer zu konstruieren, das eine beliebige Lichtquelle analysiert, und das Spektrum live am PC-Bildschirm anzeigt. Diese Geräte gibt es schon (teuer) im kommerziellen Handel mehr oder weniger ausgereift.

Funktionsweise

Durch einen Spalt fällt das Licht durch ein Gitter, Prisma, oder wird von einem Gitterspiegel reflektiert. Das Licht wird dadurch in seine Spektralanteile aufgesplittet, und fällt auf einen Linien-CCD. Der CCD wird von einem µC ausgelesen, und schickt die Daten an den PC. Auf dem PC läuft eine selbstgeschriebene Software, die die Daten im Empfang nimmt, und in ein Diagramm zeichnet, das man dann speichern kann. Natürlich kann man mit den Daten beliebige Messungen machen, oder beliebig am PC weiterbearbeiten.

Die Bauteile

Die Bauteile, die ich verwendet habe, sind folgende. Der Code und das PC-Programm sind darauf ausgelegt. Sicher kann man das Gerät auch mit anderen CCD's, Controllern, Optiken, etc. realisieren.

...braucht man: ..habe ich verwendet: ..bekommt man bei:
Controller ATmega8 z. B. Reichelt, oder andere Elektronikfirma
Beugungs/Brechungs - optik Gitterspiegel (aus Monochromator) ebay, oder Optikfirma, wie z. B. Edmund optics
Gehäuse Karton, Lichtdicht verklebt, oder Holzkistchen hat man bestimmt irgendwo rumfliegen, selberbauen
PC-Connection seriell, per MAX232-Converter (oder FDTI-USB-UART-Chip) auch Reichelt (Max232), oder USB-UART-Platinchen von FTDI (recht billig)
CCD Sony ILX554B Framos
PC Windows-PC mit serieller (oder USB) Schnittstelle ...hat jeder

Desweiteren ist eine Steckplatine ganz nützlich, dann braucht man noch die Bauteile zur Beschaltung des Mikrocontrollers und des MAX232's, aber das ist ja alles im AVR-Tutorial erklärt.

Die Schaltung

Die Schaltung ist so einfach wie möglich gehalten. Ein ATmega8 ist das Herzstück, er ist in der Standardbeschaltung mit einem 16Mhz Quarz betrieben. Der Vout-Ausgang des CCD's geht in den ADC0 (PortC 0). Der ROG-Pin des CCD's geht an PORTB 0 und der CLOCK-PIN des CCD's an PORTB 1 des Mikrocontrollers.

Die Programmierung des µC's und der PC-Software

Ich programmiere AVR's in Assembler. Die PC-Software zum Empfangen der seriellen Daten erstellte ich mit Delphi.

Delphi

Ich benutzte die Version Delphi 2005. Diese ist kostenfrei im Internet erhältlich. Um den COM-port abzufragen benötigt man die comport library 3.1. Nützliche Links dazu:

Forumsbeitrag: wie steuer ich den RS232-port mit Delphi an?

http://www.delphipraxis.net/topic102188_uart+terminalprogramm+zur+kommunikation+mit+atmega8+c.html&highlight=

Hier kann man die Komponente runterladen

http://sourceforge.net/projects/comport/

Hier mal ein Screenshot des Programms:

Screenshot diligent spectrum.jpg

Assembler

Der Assemblercode hat verschiedene Aufgaben: - Initalisiere den ADC, event. LCD, und das UART - Setze die Steuerbits des CCD's - Wandle die einzelnen analogen Pixelwerte des CCD's in digitale um - speicher sie im SRAM zwischen - wenn der CCD ausgelesen ist, sende sie an den PC - fange von vorne an mit einem Auslesevorgang

Hier ist das Timing skizziert (siehe Datenblatt):

Timing spektrometer.jpg

Das Problem beim Auslesen des CCD's bestand hauptsächlich darin, die Auslesezeit genau enzustellen. Macht man sie zu kurz, wird der CCD zu wenig belichtet (kommt nicht oft vor:-) macht man sie zu lang, belichtet der CCD über.

Dabei muss man unterscheiden zwischen der Auslesezeit, und der Belichtungszeit. BELICHTET wird der CCD grundsätzlich immer, die Ladung der belichteten Pixel wird bei dem NEGATIVEN ROG-Impuls in das Ausleseregister geladen. Dort ist die Ladung erstmal sicher, und kann theoretisch beliebig langsam ausgelesen werden. Aber nur theoretisch. Das Ausleseregister entlädt sich auch nach einer gewissen Zeit. Mann muss deshalb nach dem neg. Rog-Impuls die Dummy-Pixel so schnell als möglich durchrattern. Bei mir hat sich erwiesen, das ein kompletter Auslesevorgang 110ms dauern darf. Die Dummy-Pixel-Clock-Perioden dauern deshlab 2µs (32zyclen bei 16Mhz). Ein auszulesendes-Pixel-clock-Signal braucht für die High (und für die Low-Zeit) 110µS. Damit benötigt die komplette Ausleseroutine wie in der Datenblattskizze oben gezeigt, 110ms.

In dieser Zeit ist der CCD natürlich wieder dolle belichtet worden. deshalb wird vor der nächsten Ausleseroutine eine "Dummy-Ausleseroutine" gestartet: Diese macht nichts anderes als 2100 sehr kurze Rechtecksignale in die Clock-Leitung zu schicken, und danach den Rog-Pin wieder Low zu machen - damit wurden die Pixel neu belichtet, und zwar mit der perfekten Belichtungszeit! Man müsste diese Rechtecksignal-Frequenz jetzt praktisch verändern, um die Belichtungszeit anzupassen. Bei mir hat sich erwiesen, dass eine Gesamt-Belichtungszeit von 4,2ms gute Ergebnisse bringt.

Zum eigentlichen Auslesen der 2048 Pixel: Es werden immer 3 Pulse schnell als "dummy" rausgeschickt, dann eine High-Low-Peridode mit wirklicher Messung. Sowit lese ich jeden 4.Pixel aus (ATmega8 hat zu wenig SRAM, langsamen ADC). Bei dem 4. Rechtecksignal wird nur in der High-Phase der gemessene Wert tatsächlich gespeichert. Da die High-Zeit aber genau gleich der Low-Zeit sein muss, messe ich einfach zweimal per ADC den Vout-Ausgang des CCD's. Somit sind die gleichen Zeiten gewährleistet. Gespeichert wird der Wert dann nur in der High-Zeit. (Der Befehl ST X+, adcwert benötigt vernachlässigbar wenig Zeit). Hier das Stückchen Code, das 512 mal wiederholt wird:


cbi CCD_PORT, clk

rcall kurz  ; braucht 16 Zyclen = 2µs

sbi CCD_PORT, clk

rcall kurz


cbi CCD_PORT, clk

rcall kurz

sbi CCD_PORT, clk

rcall kurz


cbi CCD_PORT, clk

rcall kurz

sbi CCD_PORT, clk

rcall kurz


cbi CCD_PORT, clk

rcall messe  ; braucht gemessene 110 µs

sbi CCD_PORT, clk

rcall messe_und_save ;braucht auch gemessene 110 µs


Den weiteren Code erläutere ich hier nicht in jeder Einzelheit. Dazu gibts die Code-Kommentare, ausserdem ist er recht simpel. Viel kann man direkt aus dem AVR-Tutorial übernehmen (Initalisierung der ADC's, UARTS)

Natürlich habe ich nicht jedes SRAM-Init-Stückchen selbst eingetippt, deswegen sind Codeteile hier aus dem Forum kopiert und werden wiederverwendet:

##### Die nachfolgenden Links sind leider tot, die Dateien findet man teilweise im Thread #####

Hier also der komplette Assembler-Code für ein einfaches, funktionierendes, live PC-Spektrometer:

Assembler-Code und .hex-File

Hier das Programm "Diligent Spectrum", das Daten über COM1 empfangen und in ein Spektrum-Bild einzeichnen kann. Man kann die Spektren auch als Bild speichern, die Bildindizes werden automatisch erhöht. Funktioniert mit dem obigen Assembler-Programm. Das Proggi ist eine einfache .exe-Datei, die von mir selbst geschrieben wurde, sie hat bei mir nie Probleme verursacht.

Diligent_Spectrum_V1.0.exe

Falls jemand weiterentwickeln will oder etwas ändern, etc. ist hier der Projektordner von Delphi, mit Bedienungsinformationen, allen Source-dateien usw.

Delphi 2005 Projektordner

Der optische Aufbau

Hier eine Skizze des Aufbaus von Innen. Die einzelnen Bauteile sind oben genauer erläutert:

Schema spektrometer.jpg

Hier muss jeder sehen, wie er seinen Linien-CCD-Chip anordnet, dass er maximal von dem Spektrum beleuchtet wird. Dabei muss extrem auf Streulicht geachtet werden. Die Linien-CCD's sind meistens sehr empfindlich. Bei mir tats ein Schuhkarton, der rundherum mit schwarzem Tonpapier abgeklebt wurde. In dem Karton habe ich ein Rohr (1cm Durchmesser) geklebt, durch das dann das Licht fällt. Auf die Rohröffnung habe ich ein Stück Tonpapier geklebt, mit einem etwa 1mm breiten horitontalen Spalt. Auf dieses Pappstückchen mit dem Spalt habe ich nochmal ein kurzes Rohrstückchen (etwa 1,5cm lang) geklebt, darauf nochmal einen Spalt, und das ganze dann nochmal. So habe ich drei Spalte hintereinander, das ist eine unglaublich gute Streulichtabsorbtion. Das Licht fällt dadurch annähernd parallel durch die drei Spalte. Ich habe dadurch aber nur ein Schattenbild auf dem Gitter erzeugt. Der Gitterspiegel im Karton wirft das Licht dann fokussiert auf eine Kartonwand, an der die CCD-Platine klebt. Die restliche Elektronik ist außen.

Hier ein Bild des Spektrometers im Rohbau, beim Testen einer blauen LED:

Spektrometer-eingang.jpg

Weitere Bilder und Beispielspektren

Thread im Forum

Konstruktionsmöglichkeiten für die Zukunft

Ich plane weitere Verbesserungen, um das Spektrometer noch genauer und schneller zu machen:

- ATmega644 mit 4096 Bytes SRAM erlaubt alle 2048 Pixel zwischenzuspeichern, und erhöht somit die Auflösung (mit dem ATmega8 kann ich maximal 512 Pixel auslesen). Außerdem läuft der 644 mit 20Mhz-Quarzen, bedeutet die Aktualisierung kann noch schneller werden, ebenso die Baud-Rate.

- externer ADC, z. B. ADC0803 oder ADC0820 Damit wird die conversion viel schneller. Der AVR-ADC braucht bei 16Mhz ca. 110µs für eine Komplett-Messung, der ADC0803 gemessene 20µs.

- Linsen zur Strahlaufweitung/Abbildung des Spalts Damit kann man die komplette Gitterfläche nutzen, um die optische Auflösung zu erhöhen. Das geht natürlich mit einem besseren Gehäuse einher. Dabei will ich auch den Fokus perfekt einstellen.

- Kalibrierung des Spektrometers anhand bekannter Spektrallinien Ich werde einige Messungen mit Natriumdampflampen oder Laserpointern durchführen, um das Spektrometer zu kalibrieren. Idealerweise wird dann jedem Pixel eine ganz bestimmte Wellenlänge zugewiesen.

- Belichtungszeit-Steuerung vom PC aus Damit kann man exakter messen, und hat es leichter, verschieden helle Lichtquellen zu untersuchen. Ist nur eine kleine Code-Veränderung am PC-Programm, ebenso im Assembler. Man muss eben nur die Clock Frequency und einige ähnliche Werte parametrisieren.




--Moritzz 02:18, 12. Aug. 2008 (CEST) moritzgreif@gmx.net