neulich brauchte ich für das Elektrokoagulationsprojekt (viewtopic.php?f=3&t=64579) ein Speicheroszilloskop. Dort sollte ein Microcontroller auf Knopfdruck eine spezielle Folge von 10 ms Pulsen ausgeben und die korrekte Funktion sollte überprüft werden.
Deshalb habe ich folgendes Speicheroszilloskop zusammengebaut: Es besteht praktisch nur aus einem Arduino nano, der per USB an den PC angeschlossen wird und aus einem Drucktaster. Das Signal wird über die gelbe Klemme (A0) eingespeist. Und die ansteigende Signalflanke löst die Aufzeichnung aus. Das Ergebnis wird dann als xy-Wertepaare wiedergegeben und kann in Excel als Grafik dargestellt werden. Im Fall des Elektrokoagulationsgeräts sieht das Ergebnis dann wie in der Grafik oben aus: 5 Pulse a 10 ms. - das passt also
Der Schaltplan des Speicheroszilloskops ist ziemlich einfach:
Die Eingangsspannung kann 0 bis 5 V betragen und wird in 255 Schritte digitalisiert und als 1-Byte Wert weggespeichert (im Arduino). Direkt im Quellcode kann man angeben, wie lange (in Millisekunden) die Datenaufnahme sein soll. Das Programm teilt diese Zeit in 800 Schritte und sampelt immer 800 Schritte. Die minimale Samplezeit ist also durch die Geschwindigkeit des ADC (+Rechenzeit) gegeben und beträgt ca 150 us. Wenn man also die Samplingzeit auf 120 ms stellt, bekommt man eine höhere Auflösung für die ersten 120 ms:
In der nächsten Grafik ist rot unterstrichen, wo man die Samplingtime im Programmcode einstellen kann. Wenn man aus Zeitgründen nicht alle 800 Punkte ausgeben möchte, kann man showPoints < 800 wählen. Dann den Code kompilieren. Den serial monitor starten (rot unterstrichen). und bei der nächsten positiven Flanke am Eingang, wird die Aufzeichnung gestartet. nach der Aufzeichnung werden die Messwerte dann im Serialmonitor angezeigt. Von da aus kann man sie mit copy-paste in Excel transferieren um eine Grafik zu erstellen:
Und hier noch ein Beispiel mit einem 1 kHz Testsignal: und der minamalen Samplingzeit von 120 ms (und damit der höchsten Zeitauflösung).
links sind nur die ersten 4.5 ms angezeigt und rechts die vollen 120 ms und 800 Datenpunkte.
Wenn man den beschreibenden Text aus dem Quellcode löscht, belegen die 800 Messwerte nur ca. 50% es Speichers des Arduinos. Der limitierende Faktor bei diesem Gerät ist also mehr die Zeitauflösung als der Speicher. In einer nächsten Version könnte man noch versuchen anstelle des Befehls analogRead() den fast-analogRead zu verwenden. Dadurch könnte eine ca. 10-fach höhere Zeitauflösung möglich werden.
Viele Grüsse
ataio