STM32: Visualisierung von Daten in Echtzeit

OP #7665852
Lesenswert?

Hallo zusammen,

ich suche eine Möglichkeit, Daten, die in Form eines Arrays in einer µC-Firmware (STM32G4xx) vorliegen, in Echtzeit graphisch auf dem PC darzustellen. Es handelt sich z.B. um die Amplitude eine DFT, oder ähnliches. Eine serielle Schnittstelle zur Datenübertragung wäre nur umständlich zu benutzen, wesentlich einfacher wäre es über ST-Link (inkl. SWO).

Bisher habe ich für so etwas öfter mal Stm32Viewer benutzt, allerdings wäre es m.W. da ur sehr umständlich, damit ganze Arrays darzustellen. Einzelne Variablen über die Zeit ist sehr komfortabel.

Weitere Anforderung: die Visualisierungs-SW muss unter Linux laufen.

Danke für alle Hinweise!

#7666000
Lesenswert?

Weitere Anforderung: die Visualisierungs-SW muss unter Linux laufen.

Keine Grosse Sache.

Ich hab mir das vor ein paar Jahren mal selber geschrieben, einfach vom Compiler ein Mapfile mit den Adressen der Variablen erzeugen lassen.

Dann schnell ein Tool mit Qt zusammengeklickt das die Daten an den Adressen mit den Seggertools aus der MCU rausliesst. Wahr eigentlich ziemlich einfach...

Vanye

#7666162
Lesenswert?

Raoul D. schrieb:

Du bist sicher einer der Gründe, warum dieses Forum in der realen Welt oft als "Arschlochforum" bezeichnet wird.

Für die Antwort hast du aber lange gebraucht. Jetzt wissen wir aber auch, wieso du aus der "realen Welt" hier hergefunden hast...

Wenn man deinen ersten Post liest, lässt sich vermuten, dass es sich dabei um einen der typischen Freitagsposts handelt. Es gibt Entwickler, die nicht mit sowas wie Debuggern aufgewachsen sind. Die machen sowas per serieller Schnittstelle (die meisten Arduino-Benutzer sind auch darauf angewiesen).

Da Du ja offensichtlich schon damit Erfahrung hattest, hättest du meine Kommentar entweder freundlich beantworten oder einfach überscrollen können.

Viel Erfolg noch mit deinem P(r)ojekt.

OP #7670189
Lesenswert?

Etwas ernüchternde Bilanz:

  • BetterSerialPlotter
  • bei einem Datenstrom mit einer Spalte läuft es eigentlich ganz gut, allerdings beginnt der Plot immer im letzten Drittel des Fensters, ab und zu Abstürze

  • bei einem zweispaltigen Datenstrom stürzt es sofort ab.

  • Teleplot

bei hoher Datenrate (921600Bd) werden viele Werte unterschlagen

  • Serialplot

Sehr stabil und schnell, kann nur leider keine xy-Plots.

Daher nochmal die Frage:

hat jemand noch einen Tipp explizit ergänzt um xy-Plots?

#7670609
Lesenswert?

Das Einfachste dürfe sein, die Daten per st-trace oder seriell per picocom zu empfangen und in 'gnuplot' zu "pipen":

1
picocom -q -b 921600 --imap=lfcrlf /dev/ttyUSB0 | gnuplot

In der firmware dann den Datenstrom erzeugen:

1
outln("set title 'ESC'");
2
outln("plot '-' w lines");
3
... Daten
4
outln("e");
#7670703
Lesenswert?

Habe das auch mal mit Matlab und der seriellen bei 115k gemacht. Lief gut und die FFT zur Kreuzkorrelation war auf Matlab super einfach in einer Zeile. Habe auf Linux auch ausgeliefert, aber Matlab kostet halt Lizenzen und man kriegt anschliessend dauernd Werbung um Updates zu kaufen.

Persönliche Seite #7670743
Lesenswert?

J. V. schrieb:

Habe das auch mal mit Matlab und der seriellen bei 115k gemacht. Lief gut und die FFT zur Kreuzkorrelation war auf Matlab super einfach in einer Zeile. Habe auf Linux auch ausgeliefert, aber Matlab kostet halt Lizenzen und man kriegt anschliessend dauernd Werbung um Updates zu kaufen.

Wenn man die Daten auf dem Rechner hat lässt sich das gleich auch gut mit Python erreichen. Die Performance von einem Matlab Script / Applikation erreicht man damit auch.

Persönliche Seite #7670782
Lesenswert?

Raoul D. schrieb:

Alex E. schrieb:

Ich werfe nochmal https://github.com/klonyyy/STMViewer in den Ring. Das sollte alles können was der TO will.

Steht schon im Eingangspost, auch wenn ich den Namen nicht ganz richtig hatte ;-)

Aber: STMViewer kann das leider (noch) nicht, also, ein ganzes Array schritthaltend darzustellen.

Hast du das auch mit dem TraceViewer probiert. Oder meinst du das du ein Array and Daten hast die du Zeitgleich also als eine Kurve darstellen willst?

Ich habe sowas intern über etwas Code gemacht. Array zwischenspeichern und dann auf einen tmp variablen abspielen so das der Trace das senden konnte.

Ist leider ein Umweg aber dieses dumpen von Kurven oder Oberflächen ist mir im STM32 Bereich bisher nicht untergekommen. Im Linux, ROS Bereich gibt es da einiges. Das hilft dir aber konkret nicht.

OP #7670790
Lesenswert?

Alex E. schrieb:

Hast du das auch mit dem TraceViewer probiert.

Der TraceViewer macht ja auch einen zeitlichen Verlauf der Tracedaten, die auf den TraceChannels kommen. Das ist auch manchmal spannend, aber das ist gerade nicht das Problem ...

Oder meinst du das du ein Array and Daten hast die du Zeitgleich also als eine Kurve darstellen willst?

Ja, ich möchte eben nicht den Wert eines skalaren Objektes über der Zeit darstellen, sondern eines Arrays (1-dimensionales Objekt).

In diesem Fall sind des die Amplituden der DFT-Werte. Also, ein Diagramm mit bspw. 1024 Werten, jeder Wert a_i stellt die Amplitude bei einer Frequenz f_i = (fs / 2) * i / 1024 dar. Und dieses ganze Diagramm wird dann mit einer bestimmten Wiederholrate updated, eben wie man üblicherweise ein Spektrum darstellt, über der Frequenz und nicht über der Zeit.

Ein Wasserfalldiagramm braucht es natürlich nicht zu sein.

#7670832
Lesenswert?

Raoul D. schrieb:

In diesem Fall sind des die Amplituden der DFT-Werte. Also, ein Diagramm mit bspw. 1024 Werten, jeder Wert a_i stellt die Amplitude bei einer Frequenz f_i = (fs / 2) * i / 1024 dar. Und dieses ganze Diagramm wird dann mit einer bestimmten Wiederholrate updated, eben wie man üblicherweise ein Spektrum darstellt, über der Frequenz und nicht über der Zeit.

Schnapsidee. Die DFT macht der PC schneller als der µC und die Datenrate bleibt auch gleich.

Wie auch immer: Die serielle Verbindung kann eh immer nur Daten hintereinander übertragen, also musst Du Dein Array eben in ein Datentelegramm verpacken. Notfalls mit mit printf() oder als Array mit Pausenzeichen oder oder oder.

OP #7671055
Lesenswert?

Walter T. schrieb:

Schnapsidee. Die DFT macht der PC schneller als der µC und die Datenrate bleibt auch gleich.

Ach ... auf die Idee bin ich noch gar nicht gekommen ;-) Dann kurzerhand die DFT-Werte wieder zurück übertragen, damit der µC weiterrechnen kann ... Hammer!

Walter T. schrieb:

Wie auch immer: Die serielle Verbindung kann eh immer nur Daten hintereinander übertragen, also musst Du Dein Array eben in ein Datentelegramm verpacken. Notfalls mit mit printf() oder als Array mit Pausenzeichen oder oder oder.

Klar, besser würde ich 32768 Drähte anschließen, damit ich meine Werte parallel übertragen kann.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren