Arduino-Oszilloskop - [Nano Version]

Arduino-Oszilloskop - [Nano Version]

Version: 1.0.0.0
letztes Update: 15.04.2013

INFO: UPDATES gibt es im Thread-Verlauf (einfach mal die Seiten durchscrollen)

Hi Leute,

Ich habe nach langem hin und her noch mal etwas neues geschrieben. Ich nenne es "Arduino-Oszilloskop [Nano Version]" und mit einer Dateigröße von ca. 54 KB ist es doch relativ schlank.
Im gegensatz zu meinem alten "Arduino-Control" ist dieses Programm mit einer neuen Programmiersprache geschrieben worden.

Mit diesen kleinen Oszilloskop kann man mit dem Arduino (bzw. mit dem reinen ATmega) Spannungsverläufe darstellen. Beim Arduino ist eine Zeitauflösung von 50µs problemlos möglich.
Das entspricht ca. 20000 Messwerte pro Sekunde.

Unterstützte Baudraten: 100 bis 1843200, wobei der Arduino bei mir bis zu 550K geschafft hat. Mit den verschiedenen Modis kann man auch periodische Signale triggern oder Signale bis zu 83 Minuten lang grafisch aufzeichnen. Die empfangenen Daten werden byteweise eingelesen und als Binärdaten interpretiert. 1 Byte entspricht ein Messwert, womit ein Messwert dem entsprechend eine Auflösung von 8 Bit (256 Werte) haben kann.

Das Programm ist für einfache Messungen bis in den unteren KHz-Bereich geeignet. :wink:

Arduino-Sketch und weitere Daten sind im Programm hinterlegt.

...eventuell kann es ja jemand gebrauchen :wink:
sollte es Downloadprobleme geben, dann schreibt am besten eine E-Mail an mich (SBond.softwareinfo@gmail.com), da ich so am schnellsten reagieren kann)

lg
SBond

Arduino_Oszilloskop.rar (175 KB)

Sehr interessant. Danke !

Stimmt, für einen Trend sind 8 bit ( Auflösung 1/256 ) in y - Richtung ausreichend, ein Geschwindigkeits-Gewinn sicher wertvoller.
Danke für den Tip mit der ADCSRA - Modifikation.

Am Quellcode der Windows - Seite wäre ich auch interessiert, gibt es da Probleme ?
Ist das Java, C#, oder C++ ?

weder noch :wink:

der Quellcode liegt nur als PureBasic vor. Die Programmiersprache ist sehr flott und relativ leicht erlernbar. Das ist jetzt auch mein ersten Programm, das ich damit geschrieben habe. Es waren 2 Tage arbeit und es sind nur knapp 800 Programmzeilen.

...so gesehen ist es nur ein kleines Testprogramm. Ich werde es definitiv weiter ausbauen (FFT, Frequenzmessung, mehr Kanäle, ...).

kannst du mit PureBasic was anfangen?

lg
SBond

Purebasic habe ich auch häufig genutzt, wäre am Quellcode auch interessiert. Es gibt auch eine freie (Test-)Version, die allerdings auf 600 Zeilen begrenzt ist.
Man findet zwar gelegentlich die Angabe 800 Zeilen, dieser Thread bestätigt jedoch die geringere Anzahl: DEMO Zeilen-limit - PureBoard

Wenn Du den folgenden Sketch auf dem Arduino einsetzt, wird die ADC-Geschwindigkeit praktisch nochmals verdoppelt und Du erreichst theoretisch 75kSps. Mit einem Leonardo oder Micro kriegst Du das vielleicht sogar über USB auf den PC.

// Definiert die Bitnamen (sbi -> SetBit = 1, cbi -> ClearBit = 0)
#ifndef cbi
#define cbi(sfr, bit) (_SFR_BYTE(sfr) &= ~_BV(bit))
#endif
#ifndef sbi
#define sbi(sfr, bit) (_SFR_BYTE(sfr) |= _BV(bit))
#endif


void setup() {

    // setzt den ADC-Divisor von 128 Bit auf 16 Bit
    // die Genauigkeit sinkt etwas, aber die Geschwindigkeit steigt um das 6,5-fache
    sbi(ADCSRA,ADPS2);
    cbi(ADCSRA,ADPS1);
    cbi(ADCSRA,ADPS0);
    sbi(ADCSRA,ADATE); // Auto Trigger Enable

    int dummy = analogRead(A0); // setzt die Analog-Register korrekt
    sbi(ADMUX, ADLAR); // damit kriegen wir die oberen 8 Bit direkt in ADCH
    sbi(ADCSRA, ADSC); // starte Konvertierung
    Serial.begin(250000);
}

void loop() {
  loop_until_bit_is_set(ADCSRA, ADIF); // warte bis Konvertierung abgeschlossen.
  sbi(ADCSRA,ADIF); // Lösche Interrupt Flag
  Serial.write(ADCH);
}

Hi,

...so den Quellcode habe ich mal angehangen.

@pylon: irgendwie klappt der sketch bei mir nicht. Die Zeile: "sbi(ADCSRA,ADATE); // Auto Trigger Enable" stoppt regelrecht die Loop-Funktion bei mir

...oder ich stelle mich zu blöd an. (getestet mit: Arduino Uno)

lg
SBond

Arduino-Oszilloskop [Nano Version].pb (24.9 KB)

kannst du mit PureBasic was anfangen?

Ich kann es lesen und ziemlich viel raten. :wink:

Danke, jedenfalls.

Das gleiche "Protokoll" vom Arduino (1byte/sample, sonst nix) allerdings mit 230400 und ohne ADC Beschleunigung, nutzt dieses PC Programm

irgendwie klappt der sketch bei mir nicht. Die Zeile: "sbi(ADCSRA,ADATE); // Auto Trigger Enable" stoppt regelrecht die Loop-Funktion bei mir

Entschuldige, ich hatte den Code zuerst nur für den ATmega328P und habe dann den Trick mit dem analogRead() gemacht, aber dabei die wichtige Reihenfolge vergessen. Der Auto Trigger darf erst nach dem analogRead() aktiviert werden, da der analogRead()-Call sonst nicht mehr zurückkehrt.
Ich hoffe, jetzt habe ich es richtig hingekriegt (habe keinen Arduino hier zum Testen):

void setup() {

    // setzt den ADC-Divisor von 128 Bit auf 16 Bit
    // die Genauigkeit sinkt etwas, aber die Geschwindigkeit steigt um das 6,5-fache
    sbi(ADCSRA,ADPS2);
    cbi(ADCSRA,ADPS1);
    cbi(ADCSRA,ADPS0);

    int dummy = analogRead(A0); // setzt die Analog-Register korrekt
    sbi(ADMUX, ADLAR); // damit kriegen wir die oberen 8 Bit direkt in ADCH
    ADCSRB = 0; // free running mode
    sbi(ADCSRA,ADATE); // Auto Trigger Enable
    sbi(ADCSRA, ADSC); // starte Konvertierung
    Serial.begin(250000);
}

geil.

das rockt ja richtig XD. Eine Zeitauflösung von ca 20,7µs ist doch eine tolle Sache.

gute 48,2K Samples/sek. knapp 2,5 mal mehr als vorher. Das sind doch schon ganz gute Werte. Ein günsigeres Oszi* wird mal wohl kaum bekommen :wink:
Für größere Messbereiche oder Wechselspannungen sind Operationsverstärker eine gute Ergänzung. vielen Dank für den Tipp :wink:

250KBaud sind wie man sieht nicht mehr wirklich ausreichend, aber man kann ja bis 1,8MBaud hochgehen.

Ich werde demnächst mit der Neuprogrammierung meiner Steuer- und Diagnosesoftware für den Arduino beginnen. Das hier ist auf jeden Fall ein guter Anfang yay

habe die neue Version mal hochgeladen.
viel Spaß damit ^^

Arduino-Oszilloskop - [Nano Version] - 1.0.0.1.rar (45.9 KB)

Wo wir gerade beim Thema sind: Was kann man alles mit einem "richtigen"
Oszilloskop machen?

Addi

Im Großen und Ganzen kannst du den zeitlichen Verlauf einer Spannung messen, ähnlich wie hier im vorgestellten Projekt. Daraus ergibt sich die Frage, was ein Oszilloskop besser und zusätzlich kann.
Zum einen kann man oftmals zwei Kanäle zeitgleich überwachen, teurere Geräte haben auch noch mehr Kanäle. Noch dazu sind Oszilloskope wesentlich schneller - hier im Projekt kann man mit Signalen im kHz-Bereich hantieren, das Oszi schafft dann schon (je nach Ausstattung) auch noch einen Sprung in den MHz-Bereich.
Natürlich sind die Eingänge des Oszilloskopes nicht auf 5V Gleichspannung beschränkt, man kann Kennlinien von unterschiedlichen Bauteilen aufnehmen usw..

Tolles Programm! Vielen Dank!

Schön wäre es, wenn das WIN-Programm links noch eine Skala hätte 0 - 5V. Das macht das Ablesen einfacher. Auch eine höhere Auflösung für den Bereich 0 - 1 V wäre schön.
Auch der Trigger mit Rising, Falling und Both wäre nett.

Jo, danke :wink:

Das Programm wird noch weiter ausgebaut. Diese "Nano-Version" war nur ein Test-Programm. Ich wollte nur prüfen, ob ich mit PureBasic mein vorhaben realisieren kann.
Es wird definitiv noch eine vernünfige Signalauswertung hinzugefügt, sowie die Unterstützung von mehreren Kanälen. Bin gerade dabei einen besseren Graph zu programmieren.

Es wird definitiv noch eine vernünfige Signalauswertung hinzugefügt, sowie die Unterstützung von mehreren Kanälen.

Das mit den mehreren Kanälen würde ich mir gut überlegen, Du verspielst alle Geschwindigkeit, die Du jetzt hast, denn der Arduino hat nicht mehrere ADC, sondern nur einen mit einem vorgeschalteten Multiplexer. Nach einem Umschalten dürfte der erste ausgelesene Wert unbrauchbar sein (Eigenkapazität) und mein Auto-Trigger funktioniert natürlich auch nicht mehr.

Ja, da hast du recht. Ein Geschwindigkeitsverlust würde sich nicht vermeiden lassen. Ich werde mal ein besseres Kommunikationsprotokoll schreiben, um die Kanäle ggf. zu steuern. Habe so etwas schon mal bei meinem alten "Arduino-Control" gemacht, allerdings auf "reiner Text"-Basis. Das funktioniert zwar, ist aber sehr ineffizient. Das neue Protokoll ist von der Funktion zwar schon fertig, aber noch nicht programmiert. Die Funktion als Oszi wird dabei nur gering eingeschränkt, da das Programm nur Befehle sendet, wenn ein Zustand geändert werden soll. (z.B. Kanäle hinzuschalten oder Auflösungen ändern). Je nach dem wie das Ergebnis ist, werde ich notfalls 2 Versionen anfertigen.

Aber momentan steht erst mal noch der reine Graph im Vordergrund, so wie einige Basis-Funktionen. Ich denke mal, dass ich Mittwoch die ersten Ergebnisse hochladen kann.

Einen Geschwinigkeitsverlust wegen einem zusätzlich Kanal fände ich nicht so gut. Ich weiß, dass viele nach mehr Kanälen schreien und ein 2. wäre sicherlich nett. Aber die Geschwindigkeit ist es, die Dein Projekt von anderen Arduino-Ozilloskopen (wie Scopino) abhebt.

Ja, wahrscheinlich hast du Recht. Ich konzentriere mich erst mal auf einen Kanal. Auch da gibt es dann ja noch viele spielereien (wie FFT, Impuls/Frequenz-Messung) die ich dann anschließend einbauen kann. "Scopino" ist auch recht interessant. Es macht immer wieder spaß, andere Werke anzuschauen und diese zu vergleichen.

Ich bin begeistert !

50 Hz Signale aufzeichnen ist ja nicht die Kunst, aber hier sieht man z.B. super Prellen eines Aus-Schalters auf der Trafo-Eingangsseite (quasi einen 12 V Trafo als Zündspule, der arme Arduino...), Nachtrag: und den Unterschied den ein kleiner 10nF Kondensator ( bei ca. 30k Widerständen ) macht.
Mit LTSpice sieht immer alles viel sauberer aus ...

Nach diesem Lob, meine Zusatzwünsche:

  • Schau dir doch bitte das mit dem Trigger nochmal an: Ist das wirklich nur die steigende Flanke ?
    (Wenn ich mein auf "128" getriggertes um 2.5V symmetrisches Signal ansehe, kippt das sehr häufig zwischen steigender und fallender Flanke hin und her )

  • Wie könnte man die Geschwindigkeit / horizontale Auflösung variieren, ohne den Arduino jedesmal umprogrammieren zu müssen ?
    Arduino sollte sich ein bisschen was vom PC sagen lassen, entweder nach Reset oder auch im laufenden Betrieb ( wenn ein Serial.available() nicht zu sehr bremst )
    a) dynamisch die Baudrate anpassen
    b) mit definierter Wartezeit zwischen Messungen

ja, das ist schon eine tolle Spielerei. Ich konnte bisher auch mein Programm sinnvoll verwenden. z.B. das Beobachten einer geregelten Fahrraddynamo-Spannung, mit der ich während der Fahrt ein Smartphone laden kann.

Das Programm ist gerade in Entwicklung. Ich arbeite täglich daran und der neue Graph ist fast fertig. Dadurch wird die Darstellung viel dynamischer und der Bereich lässt sich dann auch beliebig mit der Maus verschieben oder zoomen. Es ist momentan eine unschöne Arbeit, da alles schon sehr komplex geworden ist und viele Berechnungen gemacht werden müssen.

Die Version, die hier zur Verfügung steht, ist natürlich viel einfacher gestrickt. Auch der Trigger ist sehr einfach aufgebaut und führt daher noch sein Eigenleben, wenn schon ein leichtes Rauschen im dargestellten Signal ist.

Die Geschwindigkeit wird sich soweit auch steuern lassen. Ich werde später noch ein Protokoll einbinden, der wieder eine Kommunikation mit dem Arduino ermöglicht. Aber meine aktuellen Ziele sind erstmal die Fertigstellung des Graphen mit vernünftigen Basisfunktionen :slight_smile:

Ich hoffe, dass ich bis Wochenende eine neue Version hochladen kann. ...je nach dem, wo es noch Probleme gibt.

lg
SBond