Pages: [1] 2 3 ... 5   Go Down
Author Topic: Arduino-Oszilloskop - [Nano Version]  (Read 12395 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Jr. Member
**
Karma: 11
Posts: 50
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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. smiley-wink

Arduino-Sketch und weitere Daten sind im Programm hinterlegt.

...eventuell kann es ja jemand gebrauchen smiley-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 (174.54 KB - downloaded 277 times.)
« Last Edit: July 03, 2013, 08:45:58 am by SBond » Logged

Germany
Offline Offline
Faraday Member
**
Karma: 59
Posts: 3091
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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++ ? 
Logged

Offline Offline
Jr. Member
**
Karma: 11
Posts: 50
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

weder noch smiley-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
Logged

Germany
Online Online
Edison Member
*
Karma: 48
Posts: 2345
Arduino rocks
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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: http://forums.purebasic.com/german/viewtopic.php?f=20&t=16921
Logged

Mein Arduino-Blog: http://www.sth77.de/ - letzte Einträge: Teensy 3.0 - Teensyduino unter Window 7 - Teensyduino unter Windows 8

Switzerland
Offline Offline
Faraday Member
**
Karma: 112
Posts: 5286
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.

Code:
// 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);
}
Logged

Offline Offline
Jr. Member
**
Karma: 11
Posts: 50
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.91 KB - downloaded 73 times.)
Logged

Germany
Offline Offline
Faraday Member
**
Karma: 59
Posts: 3091
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Quote
kannst du mit PureBasic was anfangen?

Ich kann es lesen und ziemlich viel raten.   smiley-wink

Danke, jedenfalls.

Das gleiche "Protokoll" vom Arduino (1byte/sample, sonst nix) allerdings mit 230400 und ohne ADC Beschleunigung, nutzt dieses PC Programm
 
« Last Edit: April 17, 2013, 08:02:29 am by michael_x » Logged

Switzerland
Offline Offline
Faraday Member
**
Karma: 112
Posts: 5286
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Quote
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):

Code:
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);
}
Logged

Offline Offline
Jr. Member
**
Karma: 11
Posts: 50
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

geil.

das rockt ja richtig  smiley-lol. 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 smiley-wink
Für größere Messbereiche oder Wechselspannungen sind Operationsverstärker eine gute Ergänzung. vielen Dank für den Tipp smiley-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*
Logged

Offline Offline
Jr. Member
**
Karma: 11
Posts: 50
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

* Arduino-Oszilloskop - [Nano Version] - 1.0.0.1.rar (45.92 KB - downloaded 109 times.)
Logged

Offline Offline
Full Member
***
Karma: 5
Posts: 193
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Addi
Logged

  / \    _|  _| o
 /--\ (_| (_| |

Germany
Online Online
Edison Member
*
Karma: 48
Posts: 2345
Arduino rocks
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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..
Logged

Mein Arduino-Blog: http://www.sth77.de/ - letzte Einträge: Teensy 3.0 - Teensyduino unter Window 7 - Teensyduino unter Windows 8

germany, cologne
Offline Offline
Newbie
*
Karma: 1
Posts: 47
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged

Offline Offline
Jr. Member
**
Karma: 11
Posts: 50
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Jo, danke smiley-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.
Logged

Switzerland
Offline Offline
Faraday Member
**
Karma: 112
Posts: 5286
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Quote
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.
Logged

Pages: [1] 2 3 ... 5   Go Up
Jump to: