Forum: Mikrocontroller und Digitale Elektronik Messwerte über UART an PC übertragen


von noob (Gast)


Lesenswert?

Ich stehe vor einem lästigen Problem welches ich gerne eliminieren 
würde: Ich habe ein SoC (Zynq) welches ich als Reglerplattform benutzen 
will. Beim Programmieren und Einstellen von Reglern habe ich des öfteren 
das Problem, dass ich gewissen physikalische Grössen mit einem Scope 
messen kann, der Zusammenhang mit diversen FPGA/CPU-internen Grössen 
(Messwerte und davon abhängige) aber interessant wäre und diese Grössen 
im Normalfall nicht zugänglich sind. Ich suche also eine Möglichkeit, 
diese Grössen im Betrieb mitzuloggen und nachträglich an einen PC zu 
schicken, damit ich sie mit den Daten vom Scope vergleichen kann, habe 
dabei aber nicht so wirklich einen Plan wie ich dabei am effizientesten 
vorgehen soll.
Ich dachte dabei daran, die Daten vorher in einem Array mitzuschreiben 
(fixe Samplingfrequenz durch Timer-Interrupt) und das Array dann per 
UART an den PC zu schicken um die Daten zu plotten.
Die Fragen die sich mir jetzt stellen:
- Wie implementiert man das Loggen der Daten am einfachsten? Die 
simpelste Methode wäre in meinen Augen, einfach für jede Variable ein 
Array mit entsprechender Länge vorzusehen und die Daten nacheinander 
dort reinzuschreiben. Bei 20 kHz Samplingfrequenz kommen pro Sekunde 
dann 80000 Byte zusammen (für eine float Variable). Ich bin mir sicher, 
dass dies funktionieren würde, allerdings erscheint mir die Methode 
etwas brutal. Ausserdem muss ich damit de facto jede Variable doppelt 
anlegen (-> unübersichtlich und fehleranfällig?) und ich weiss nicht, 
wie sehr die Laufzeit der Regler-ISR sich freut wenn bei jedem Aufruf 
grössere Arrays beteiligt sind. Ist diese Holzhammer Methode akzeptabel 
oder gibts hier was besseres (programmiert wird in C)?
- Gewisse Dinge laufen im FPGA mit Samplingfrequenz > 10 MHz. Als Lösung 
sehe ich hier, den Datastream in ein FIFO zu schreiben und die Daten per 
DMA ins RAM zu kopieren. Hier stellt sich für mich die Frage, wie ich 
die Daten in meinem C-Programm verwerten kann bzw. wie das Programm mit 
dem betreffenden Speicherbereich umgehen soll. Soll ich diesen per 
malloc() vorher reservieren, die DMA-Unit schreibt die Daten rein und 
das Programm liest sie anschliessend aus?
- Wie kann ich die Daten am effizientesten zum PC übertragen? Ich habe 
nur eine UART Schnittstelle und über diese bis jetzt nur ein Terminal 
welches mit Putty kommuniziert laufen lassen. Wie ich Bytes über UART 
rausschicken kann ist mir bekannt, allerdings benötige ich am PC ein 
Programm das die Daten in eine Datei schreibt. Hier gibt es bestimmt 
fertige Lösungen, nur was bietet sich für sowas an?

von Gustl B. (gustl_b)


Lesenswert?

Genau das mache ich mit einem kleinen Zustandsautomaten.
Zuerst wird gewartet bis über UART ein Byte empfangen wurde. Das Byte 
sagt aus welcher Quelle und wie viele Daten aufgenommen werden sollen.
Dann werden die Werte in einen Speicher geschrieben.
Ist die Anzahl der angeforderten Werte aufgenommen wird der 
Speicherinhalt über UART ausgegeben.

Zur Datenrate:
Einen BlockRAM kann man mit mehreren 100 MByte/s beschreiben. Da braucht 
man kein DMA oder so. Und externes RAM braucht man auch nur wenn es 
große Datenmengen sind. Und dann ist das Auslesen über UART eher 
suboptimal.
Ich verwende ich FPGA dazu keine CPU und nur etwas wenig HDL. Wenn du 
einen Taktdomänenübergang hast dann ist ein FIFO sinnvoll,sonst brauchst 
du den eigentlich nicht.

Aber du kannst auch einen FIFO nehmen. Vor der Datenaufnahme resetten, 
dann reinschreiben bis der voll ist und dann auslesen bis er wieder leer 
ist.

von A. S. (Gast)


Lesenswert?

Überlege Dir, was Du so in etwa willst. Wenn Du 100.000 Messwerte 
übertragen willst, ist das kein Problem. Mit ASCII in eine Textdatei, da 
brauchst Du nichtmal ein Programm.

Malloc eher nur einmal zum Programmstart, besser static.

Ob du Daten 2 oder 3 Mal hälst spielt keine Rolle. Bring es zum laufen, 
sammle Erfahrung und dann optimiere wenn Du das brauchst.

von Pandur S. (jetztnicht)


Lesenswert?

Allenfalls einen Mehrkanal DAC zB einen LTC1665, 8 kanal 8 bit, 
montieren und die interessierenden Werte darueber rausgeben, zum mit dem 
Oszilloskop zuschauen. Wenn man sich so einen steckbar macht muss er 
auch nicht im endgueltigen Produkt dabei sein, und trotzdem die 
Moeglichkeit bieten.

Beitrag #6395607 wurde von einem Moderator gelöscht.
von Gustl B. (-gb-)


Angehängte Dateien:

Lesenswert?

Ernsthaft? Er hat doch die Werte schon schön digital im FPGA. Einen UART
hat er ebenfalls. Da braucht es nur ein paar Zeilen VHDL und am PC z. B.
ein kleines Pythonscript und schon kann er das wie ein Oszilloskop
verwenden.

Im Anhang das VHDL aber ohne die UART und ADC Komponenten. Der nimmt 16
Bit Werte und schickt die dann zum PC. Das erste Byte sind die MSBs, das
zeite Byte die LSBs.
Es schickt auf Anfrage, also man sendet ein Byte zum FPGA, davon ist das
obere Nibble die Anzahl der aufzunehmenden Samples von 2**8 bis 2**15.
Das untere Nibble wählt den ADC/Quelle aus.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.