|
Linux-Projekte
für den Raspberry Pi
(in Python realisiert)
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
|
Menüpunkt
|
Beschreibung
|
Werte(Liste)
|
|
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.