Linux-Projekte für den Raspberry Pi
(in Python)
Voltmeter und mini Oscilloscope



Oscilloscope

Um mein Vorhaben zu verwirklichen, sollte der Signalverlauf ja als Kurve sichtbar gemacht werden. Also nochmal die Maus in die Hand und aus dem Voltmeter ein Oszilloscop entwickeln. Dabei war die schnelle Meßfolge noch das kleinste Problem. Kopfschmerzen bereitete mir das Timing. Will heißen, wo bekomme ich eine vernünftige Zeitbasis her? Hab zunächst versucht einen Takt über einen PWM-Pin abzugreifen. Aber es war schnell klar, PWM erzeugt keine regelmäßigen Impulse und selbst wenn, es ging nur bis einige hundert Hertz. Das konnte ich also knicken. Nach etlichen Versuchen habe ich dann den Befehl time() des time-Moduls verwendet.

Es ist nun so, daß die 'Istzeit'
gespeichert wird, wenn eine Messung des AD-Wandlers gestartet wird. In einer Meßschleife wird dann so lange die Zeit abgefragt, bis die Periode der gewünschten Zeitbasis abgelaufen ist. Und wieder von Vorne. So bekam ich eine ganz passable Anzeige hin bis zu einer Zeitbasis von ca. 2 Millisekunden. Je kürzer die Periodendauer gewählt wird, um so (Zeit) ungenauer wird allerdings die Darstellung. Aber es sollte ja auch kein Präzisionsgerät werden. Daher ist auch keine kürzere Zeitbasis als 1 Millisekunden vorgesehen.
Mit dem Pi 3 konnten dabei Frequenzen bis ca. 1,3 kHz dargestellt werden. Das allerdings nicht in der Entwicklungsumgebung (IDLE), sondern nur, wenn das Programm direkt, ohne grafische Oberfläche (LXDE) gestartet wurde. Dabei sind im höheren Frequenzbereich aber schon Toleranzen von 10 und mehr Prozent vorhanden.

Auch hier wurde wieder auf eine Menüzeile am unteren Grafikrand zurückgegriffen, in der diverse Einstellungen vorgenommen werden konnten. Diese wurde mit den bereits bekannten 2 Tasten bedient.

Auswahlpunkte der Menüzeile

Kanal

Eingangskanal des A/D-Wandlers

0 - 7

Zeitbasis

Zeitbasis für 1 Skalenstrich

0,001/ 0,002/ 0,005/ 0,01/ 0,02/ 0,05/ 0,1/ 0,2/0,5 und 1.0 Sekunden

Y-Versatz

Vertikale Verschiebung des Signals

-1.0 Volt … 0 Volt … +1.0 Volt

Meßstart

Messung starten

Nur Einzelmessungen sind möglich

ENDE

Programmende



Eine Synchronisation gibt es jedoch nicht. Die Y-Skala (Spannung) ist fest eingestellt auf 0 bis 5 Volt und die Zeitbasis geht von 1.0 Sekunden bis 1 Millisekunden. Es kann auch nur EIN Kanal angezeigt werden (aber dieser kann aus den 8 möglichen Kanälen ausgewählt werden). Speicherung und den ganzen Schnickschnack habe ich momentan nicht vorgesehen, aber das kann sich auch noch ändern.

Als Beispiel sei hier eine Darstellung gezeigt mit einer Frequenz von 250 Hertz. Diese wird durch die GPIO eines zweiten Raspberry erzeugt und ist nicht übermäßig stabil (Multitasking!). Wie zu sehen, liegt die Spannung so um die 3,0 Volt.

Durch ein RC-Glied wurde aus dem originalen Rechtecksignal der hier dargestellte abgewandelte Signalverlauf

Die Oberste Zeile zeigt Frequenz, niedrigste und höchste gemessene Spannung. Dabei ist die Anzeige der Frequenz aber nur ein Annäherungswert


Die unteren zwei Zeilen zeigen:

  • den gewählten Kanal des ADC Wandlers

  • die eingestellte Zeitbasis

  • den vertikalen Versatz des dargestellten Signals




Eine Zeitbasis von unter 1 Millisekunde wurde verworfen, da eine weitere Verkleinerung (auch beim RPi 3) keine höhere Auflösung der Darstellung ergibt.

Als Beispiel hier die Darstellung eines TTY Eingangssignals mit 9600 Baud und einer Zeitbasis von 0,2 Millisekunden

Laut Berechnung:

Impulsbreite = 1 / Bitrate -> 1/9600 = 0,000104166666667

wäre die minimale Taktbreite also etwas über 0,1 mSek und müßte damit einen halben horizontalen Skalenstrich breit sein.

Ist sie aber nicht!

Daher wurde die Zeitbasis auf minimal 1 Millisekunde begrenzt


Rechteckisignal


Das Programm zum Erzeugen des Rechtecksignals findet sich ___HIER___ , ist ganz kurz und ohne jegliche Fehlerroutine.

  • Zu Beginn kann man den GPIO-Port (Pin-Nummer!) auswählen.
    Den vorgeblendeten Wert(16) kann man mit 'enter' quittieren oder einen anderen Port auswählen.

  • Danach wird nach der Frequenz gefragt. Wurde diese eingegeben, wird unmittelbar die Ausgabe gestartet.

  • Gestopt wird die Rechteckerzeugung durch drücken von 'CTRL' + 'C'.
    Dadurch wird eine exception 'Keyboardinterrupt' ausgelöst (die einzige Exception, die überwacht wird).

  • Anschließend kann man eine neue Frequenz eingeben

  • oder das Programm mit der Eingabe von 'ende' verlassen.

Hinweise:

  • Die GPIO-Pinnummer wird nicht überprüft. Hier kann JEDER Wert stehen (auch völliger Unsinn)

  • Das Programm akzeptiert JEDEN Frequenz-Wert.

  • Bei der Frequenzabfrage erzeugt die Eingabe von 'nicht Ziffernzeichen' einen Programmfehler

  • Die Pulsweite ist nicht veränderbar und es gibt keine Ober- oder Untergrenzen.



Damit konnte ich mich nun meinem eigentlichen Problem, den SML-Daten des Stromzählers zuwenden.




Anekdote am Rande:

Um den Oszi zu testen habe ich lokal in einem Terminal eine Datei über die TTY-Schnittstelle am TX-Ausgang ausgegeben und parallel versucht, den TTY-Eingang (RX) in meinem Oszi- Programm am AD-Wandler darzustellen. Das hat leider nicht geklappt. So ging ich davon aus, daß AD-Wandler oder Programm das nicht konnten, die Frequenz zu hoch war, vielleicht die Spannung zu klein, es gab tausend Gründe.
Blieb mir nichts anderes übrig, als einen 'echten' Oszillographen zu kaufen, so einen digitalen, mit Speicher und Autoadjust und allem Pipapo. So einen der aussieht wie der Deckel einer Kühlbox ;-))) SCHÖÖÖNES Ding!

Ach ja, noch was:
Im Nachhinein hat sich herausgestellt, daß der AD-Wandler mit mini Oszi doch funktioniert hatten. Bei meinen Tests mit der TTY-Schnittstelle hatte ich diese nur nicht korrekt freigegeben! Hmpffffff.