Forum: Mikrocontroller und Digitale Elektronik Wie am einfachsten Messdaten abspeichern?


von Thomas H. (tumbleweed)


Lesenswert?

Hallo an die Community!

Ich bin gerade dabei die Messelektronik für den Nachbau von einen
Praktikumsversuch zu entwerfen der ursprünglich per Hand ausgewertet
wurde und habe sozusagen ein paar Features ergänzt. (Ich möchte das
ganze zum Erfahrung sammeln zuhause nachbauen).

Mein Hauptproblem beim Überschlagen der Anforderungen ist, dass ich
meine Messdaten von mehreren ADCs mit einer konstanten Datenrate von
rund 10 Mbit/s irgendwo abspeichern muss. Das ganze soll so ca. 10 min. 
durchlaufen können was Minimum zu stolzen 750 Mbyte Daten führt. Wo ich 
die Daten hinschaufel ist mir egal, schlussendlich muss ich die Daten 
auf einem PC auswerten, da zu rechenaufwendig für MCU.

Die Frage ist wohin am besten/einfachsten mit den Daten? Mit
entsprechendem Chip über FullSpeed USB oder Ethernet an den PC? Auf
SD-Karte speichern? Für meine bisherigen Projekte war keine so hohe
Datenrate notwendig, das ist für mich also Neuland.

Details:
*Die Daten stammen von Strom- und Spannungsmessungen sowie einem
CCD-Array und einem Zeitstempel der per Mikrocontroller erzeugt werden
soll
*möglicher Übertragungsweg zum PC: 1-2 Meter
*verwendeter Mikrocontroller: bin ich für fast alles offen, ich möchte
nur die Daten von den ADCs auf einem Speicher haben
*Datenformat: kann raw im Bitformat vorliegen da ich die Software zur
Auswertung selbst schreibe, .txt oder .csv ist natürlich auch nicht
schlecht, muss aber nicht sein
*Meine Erfahrung mit MCs: Arduino-Boards ;-) Atmega und Attiny MCUs ich 
arbeite mich aber auch gerne in andere MCU-Familien ein, ich möchte mit 
diesem Projekt hauptsächlich Erfahrung sammeln, allerdings ist der Rest 
auch schon recht umfangreich weshalb ich bei einer einfachen Lösung auch 
nicht nein sage :P

Ich weiß, dass es in dieser Richtung schon einige Beiträge gibt, mich
interessiert aber was sich am einfachsten realisieren lässt (hab mit
SD-Karten wenig Erfahrung, nur bestehenden Code an meine Bedürfnisse
angepasst, mit weitaus geringeren Datenraten).

Danke übrigends für die wirklich guten Tutorials und das Forum auf
dieser Seite. Ich habe mich zwar gerade erst angemeldet, mich hier aber 
schon öfters nach Infos umgesehen :)

Vielen Dank für eure Tipps!
grüße, tumbleweed

von Noch einer (Gast)


Lesenswert?

Nach meiner Erfahrung - binär ohne Filesystem auf SD-Karte schreiben. 
Beim Auslesen über USB oder UART die Daten im Mikrocontroller in einen 
Text konvertieren, den man direkt im Terminalprogramm anschauen kann.

von Thomas H. (tumbleweed)


Lesenswert?

@"Noch einer"
geht das von der Datenrate her aus? ich habe hier im Forum in einigen 
Beiträgen gelesen, dass weitaus erfahrenere Bastler als ich Probleme mit 
weitaus geringeren Datenraten hatten.

von Meister (Gast)


Lesenswert?

Ich tendiere zu Netzwerk. STM32F4 DISCOVERY Board + STM32F4 DIS BB Board 
und feddich :) Mit den Beispeilen von 
http://mikrocontroller.bplaced.net/ solltest du auch recht fix zum Ziel 
kommen.

von Thomas H. (tumbleweed)


Lesenswert?

@Meister
Ist natürlich fast ein bisschen übertrieben nur zum datenschaufeln, aber 
lässt sich sicher einfach realisieren
danke :)

von Wutzi (Gast)


Lesenswert?

Wie wäre es mit einem µC + Ethernet Phy & Mac  (da gibts sicher schon 
fertige Boards)? Da sollte das doch kein Problem sein. Die Daten kannst 
du dann per UDP zum Rechner schicken. 10Mbit ist da doch ein Klacks.

von Timmo H. (masterfx)


Lesenswert?

Wieso nicht einfach ein Raspberry PI und dann via Netzwerk oder direkt 
auf USB-Stick.
Klar ist zwar irgendwie Overkill, aber der Pi ist günstig und das 
Betriebssystem ist fertig. Da braucht man sich nur noch um das Auslesen 
und Schreiben/Senden der Daten kümmern. Ich würde zumindest nicht 
anfangen mir jetzt mühselig die nötigen Codeschnipsel für SD-Karte, 
Netzwerk etc. zusammenzusuchen und Tage damit verbringen bis auch alles 
miteinander vernünftig läuft.

: Bearbeitet durch User
von Thomas H. (tumbleweed)


Lesenswert?

Danke für die Beiträge :)
wie es aussieht ist die Mehrheit für eine Ethernetübertragung
da bin ich nicht abgeneigt, die Frage ist was verwendet man 
Mikrocontrollerseitig?

@ masterfx:
Raspberry Pi wär überhaupt kein Problem (bzw. ideal), den kann ich dann 
auch direkt die Auswertung machen lassen (lässt sich ja einfach mit 
Python o.ä. programmieren)
Die große Frage ist wie soll das Interface zwischen den Analog Digital 
Wandlern und dem PC bzw. Raspberry Pi aussehen. Die GPIO-Pins sind zu 
langsam bzw. zu unsicher da kein realtime OS. jedenfalls nach dem was 
ich bis jetzt gelesen hab. oder liege ich da falsch (ich lasse mich 
gerne eines besseren Belehren :)

von Thomas H. (tumbleweed)


Lesenswert?

@Wutzi
Danke, hab unter dem Stichwort schon einiges gefunden

von Georg (Gast)


Lesenswert?

Thomas H. schrieb:
> dass weitaus erfahrenere Bastler als ich Probleme mit
> weitaus geringeren Datenraten hatten.

Man kann mit allem Probleme haben, auch mit einem 5V-Netzteil. Aber jede 
billige Digitalkamera kann HD-Video auf SDC-Karten speichern, das ist 
das einzige Problem an der Sache und also offensichtlich lösbar.

Ich würde im Gegensatz zu vorherigen Vorschlägen auch unbedingt 
anstreben, eine Karte mit Dateisystem zu verwenden, denn dann muss man 
nicht auch noch Spezialsoftware zur Auswertung schreiben, man steckt die 
Karte einfach in irgendeinen Card Reader.

Ob Ethernet oder SDC, man braucht entsprechende Libraries. Aber für 
Ethernet braucht man auch noch eine Verbindung und einen PC.

Georg

von Programmierer (Gast)


Lesenswert?

Georg schrieb:
> Ich würde im Gegensatz zu vorherigen Vorschlägen auch unbedingt
> anstreben, eine Karte mit Dateisystem zu verwenden, denn dann muss man
> nicht auch noch Spezialsoftware zur Auswertung schreiben, man steckt die
> Karte einfach in irgendeinen Card Reader
Und auch nur so wird die Karte innerhalb ihrer Spezifikation betrieben, 
und nur so funktionieren die internen Algorithmen zum Wear Leveling, und 
nur so ist die Performance garantiert.

10 Mbit/Sec ist allerdings recht sportlich. Mit nem AVR, SPI und Copy & 
Paste von FAT32 Code ist's da nicht getan. Da würde ich eher zu zB einem 
STM32F4 und der Verwendung von SDIO und DMA raten, und einem schlauen 
Algorithmus der große Blöcke auf einmal schreibt. Das dauert aber länger 
als ein paar Tage... da ist R-PI oder Ethernet doch wesentlich 
einfacher.

von Ich (Gast)


Lesenswert?

FPGA + FT2232H ... geht wunderbar über USB 2.0

von Timmo H. (masterfx)


Lesenswert?

Thomas H. schrieb:
> Die große Frage ist wie soll das Interface zwischen den Analog Digital
> Wandlern und dem PC
Was hast du da denn für ein Interface an den ICs (SPI? Parallel? I2C)? 
Und wie viele Wandler sind es?
Der SPI von Raspberry kann bis zu 125 MHz glaub ich, sowie Interrupt und 
DMA.

von Thomas H. (tumbleweed)


Lesenswert?

@Georg @Programmierer:
Dass es lösbar ist steht ausser Frage :P für mich stellt sich die Frage: 
ist es für mich lösbar, aber das muss natürlich  ich selbst 
ausprobieren.
Danke übrigends für den Rat ein Dateisystem zu verwenden, habe mich noch 
nicht in die Spezifikationen von SD-Karten eingelesen. Ich bin für jeden 
Tipp Dankbar :)

Dann werde ich einmal den Rat annehmen Ethernet oder den RPi zu 
verwenden. Dazu bitte nochmals die Frage: Weiß jemand ob es möglich ist 
eine Datenrate von 10 Mbit/s über die GPIO-Pins (sei es parallel, über 
UART oder SPI) zu erreichen? Meine bisherige Recherche hat mich eher 
davon abgebracht.

vielen Dank allen :)

von Timmo H. (masterfx)


Lesenswert?

SPI ist kein Problem. Über GPIO gewackel sind max. 22 Mhz (Native 
library) bzw. ~4 MHz via wiringPi drin, siehe 
http://codeandlife.com/2012/07/03/benchmarking-raspberry-pi-gpio-speed/
(Natürlich unter Optimalbedingungen wenn er nichts anderes zu tun hat)

: Bearbeitet durch User
von Thomas H. (tumbleweed)


Lesenswert?

Timmo H. schrieb:
> (Natürlich unter Optimalbedingungen wenn er nichts anderes zu tun hat)

Das ist kein Problem, da ich sowieso geplant habe die Datenauswertung im 
Nachhinein zu machen. Danke für den Link! wie es aussieht muss ich meine 
fast nicht vorhandenen C-Kenntnisse auffrischen ;-) Wobei dort auf den 
ersten Blick nur das togglen von pins getestet wird, aber ich schaus mir 
noch genauer an.

von Peter (Gast)


Lesenswert?

Das Ganze funktioniert nur mit High-Speed USB (FX2 z.B.).
Auf PC-Seite implementierst Du eine virtuelle Datei (bis 2 GByte bei 
WIN32) und schreibst dann da rein.
Es empfiehlt sich mit mehreren Worker-Threads zu arbeiten: Einer liest 
von Deinem FX2, der nächste fängt schon mal an zu analysieren und ein 
weiterer zeigt die Daten an.
Es geht natürlich auch mit einem Thread, der die Aufgaben nacheinander 
abarbeitet. Aber das dauert dann auch entsprechend.

Gruß Peter

von Thomas H. (tumbleweed)


Lesenswert?

Peter schrieb:
> Auf PC-Seite implementierst Du eine virtuelle Datei (bis 2 GByte bei
> WIN32) und schreibst dann da rein.

Aha so läuft das, hab mich schon gewundert.

Wobei ich langsam dazu tendiere die RPi-Lösung zu wählen, dann hätte ich 
ein komplettes System für die Datenauswertung, schön handlich. hab 
gerade gesehen, dass der RPi bis 32 Mhz unterstützt:
http://elinux.org/RPi_SPI
das sollte eigentlich reichen :)

von Peter (Gast)


Lesenswert?

Kommen die Daten eigentlich kontinuierlich?

Macht es etwas, falls mal ein paar 100 kBytes zwischendurch verloren 
gehen?

von Jobst Q. (joquis)


Lesenswert?

Wieviele ADCs sind es denn?

Falls du Probleme mit der Gleichzeitigkeit von Auslesen der ADCs und 
Weiterleiten der Daten bekommst,könntest du ja auch die ADCs auf mehrere 
Raspis verteilen und erstmal nur ins RAM schreiben und dann übertragen 
oder speichern.

Oder gleich einen ähnlichen Kleinrechner mit mehr RAM verwenden, zB 
einen Banana pi mit 1GB oder Odroid mit 2GB.

von Thomas H. (tumbleweed)


Lesenswert?

Peter schrieb:
> Macht es etwas, falls mal ein paar 100 kBytes zwischendurch verloren
> gehen?

Es ist kein Problem wenn ein paar kByte hops gehen aber ein paar 100 
leider nicht. Ich muss die verloren gegangenen Bytes auch nicht 
nachsenden. Wichtig wäre nur dass ich dahinter komme welche Daten weg 
sind um das in der Auswertung zu berücksichtigen. (das könnte ich aber 
vielleicht über den Takt rekonstruieren wenn ich genau weiß wie lang 
mein Code braucht. Ich plane keine Interrupts zu verwenden)

von Thomas H. (tumbleweed)


Lesenswert?

Jobst Q. schrieb:
> Falls du Probleme mit der Gleichzeitigkeit von Auslesen der ADCs und
> Weiterleiten der Daten bekommst,könntest du ja auch die ADCs auf mehrere
> Raspis verteilen und erstmal nur ins RAM schreiben und dann übertragen
> oder speichern.

Ja, da bin ich auch gerade beim Überlegen.
Ich verwende 4 ADCs, einer wertet den CCD-Array von 2048 Pixel Länge und 
8 bis 12 Bit Auflösung aus. Das bedeutet diese Daten kommen in einem 
Bulk daher mit Pausen bei der Belichtung.
2 ADCs messen Spannungen (voraussichtlich 10 Bit mit vermutlich 500 
SPS).
1 ADC misst auch Spannungen mit rund 500 kSPS allerdings kommt da ein 
MCU dazwischen welcher die Daten vorauswertet. Da kommen voraussichtlich 
16 bis 32 byte 500 mal pro sec daher.
Ja ich weiß ;) nicht so übersichtlich wie ich es gerne hätte, aber das 
sind die Anforderungen. Ich dachte mir ich könnte die Daten irgendwo 
dazwischen buffern. Ich wollte nur erst wissen ob ich die notwendigen 10 
Mbit/s überhaupt wegschaffen kann.
Wie viel Elektronik ich verbaue ist platztechnisch komplett egal (kann 
auch ein komplettes Mainboard sein ;) es sollte sich nur für einen 
Hobbybastler im erträglichen Preisrahmen bewegen.

von Thomas H. (tumbleweed)


Lesenswert?

Jobst Q. schrieb:
> und erstmal nur ins RAM schreiben und dann übertragen

Glaube nicht dass das geht, ich vermute dass das Betriebssystem auch 
gerne seine Scheibe vom RAM hätte und ich will 10MBit/s über 10 Minuten 
übertragen, das wird eng. Aber ich weiß auch nicht ob mir als Buffer für 
den SPI-Modus des RPi der ganze RAM zur Verfügung steht (glaub ich 
nämlich nicht, aber da muss ich erst nachschauen). Ich vermute, dass ich 
lange vorher die Daten irgendwo ablegen und inzwischen MCU-seitig 
buffern muss.

von Georg (Gast)


Lesenswert?

Thomas H. schrieb:
> und inzwischen MCU-seitig
> buffern muss.

Das hilft dir nicht, höchstens um eine ungleichmässige Geschwindigkeit 
auszugleichen - aber über alles gesehen hast du eine Pipeline, in die du 
lange Zeit 10Mbit/s reinstopfst, und das geht nur gut, wenn durch alle 
Stufen die gleiche Datenrate bis zur endgültigen Speicherung 
durchgehalten wird. Wie schon Kohl sagt, wichtig ist was hinten 
rauskommt - buffern nützt da nichts bzw. nur sehr kurzfristig. Eher im 
Gegenteil, man muss das ganze System so schlank wie möglich ausführen, 
damit alles mit optimaler Geschwindigkeit durchläuft. Buffern = 
speichern und später wieder lesen kostet auch Zeit. Wenn du mehrere 
Zwischenpuffer einrichtest geht am Ende garnichts mehr.

Georg

von Falk B. (falk)


Lesenswert?

@ Thomas H. (tumbleweed)

>Ich verwende 4 ADCs, einer wertet den CCD-Array von 2048 Pixel Länge und
>8 bis 12 Bit Auflösung aus. Das bedeutet diese Daten kommen in einem
>Bulk daher mit Pausen bei der Belichtung.
>2 ADCs messen Spannungen (voraussichtlich 10 Bit mit vermutlich 500
>SPS).

Das ist schon alles ziemlich sportlich. Die Anteuerung geht nur, wenn 
sie Bare metal ohne Betriebssystem erfolgt, alles andere darfst du 
getrost vergessen.

>sind die Anforderungen. Ich dachte mir ich könnte die Daten irgendwo
>dazwischen buffern.

Kann und muss man, die Frage ist nur, wie groß der FIFO sein muss. 
Wieviel Zeit muss er maximal überbrücken?

> Ich wollte nur erst wissen ob ich die notwendigen 10
>Mbit/s überhaupt wegschaffen kann.

Das ist 1 MB/s, das ist nicht sooooo viel.

>Wie viel Elektronik ich verbaue ist platztechnisch komplett egal (kann
>auch ein komplettes Mainboard sein ;) es sollte sich nur für einen
>Hobbybastler im erträglichen Preisrahmen bewegen.

Ich würde einen aktuellen 32Bit ARM nehmen, der darf ruhig 100-200MHz 
CPU Takt und eine SD-Karte haben. Damit kriegt man 1MB/s locker weg, 
denn diese CPUs haben ein natives SDIO, das ist so schnell wie die 
SD-Karte es zuläßt (selbst die billigsten Karten schaffen heute 4MB/s).

Damit kann man die harte, zeitkritische ADC-Auswertung sehr hardwarenah 
gestalten, das schafft man.

Über High Speed USB (480 Mbit/s) kriegt man 10Mbit/s auch gut weg, da 
gibt es auch diverse Controller bzw. Evalboards. Aber Vorsicht, hier 
können dir ggf. die Interrupts des USB-Controlles dein Timing 
zerschießen!

von c-hater (Gast)


Lesenswert?

Thomas H. schrieb:

> Mein Hauptproblem beim Überschlagen der Anforderungen ist, dass ich
> meine Messdaten von mehreren ADCs mit einer konstanten Datenrate von
> rund 10 Mbit/s irgendwo abspeichern muss. Das ganze soll so ca. 10 min.
> durchlaufen können was Minimum zu stolzen 750 Mbyte Daten führt. Wo ich
> die Daten hinschaufel ist mir egal, schlussendlich muss ich die Daten
> auf einem PC auswerten, da zu rechenaufwendig für MCU.

Tja, da dürfte die primäre Frage sein, wie der/die µC an den PC 
angebunden sind.

Sind sie nicht? Dann solltest du das unmittelbar ändern und zwar auf 
Ethernet.
Weil: dann löst sich das Problem sofort, denn kein moderner PC hat ein 
Problem damit, derart lächerliche Datenmengen vie Ethernet 
entgegenzunehmen und in eine vollwertige Datenbank wegzuspeichern. Wenn 
ein µC die benötigte Datenrate nicht schafft: Nimmst du einfach mehrere 
(sie kosten ja fast nix mehr).

Alle können so einfach direkt in die Datenbank schreiben, die als 
Datenbasis für die Auswertung dienen soll.

Trivial.

von Frank K. (fchk)


Lesenswert?

Thomas H. schrieb:
> Hallo an die Community!
>
> Ich bin gerade dabei die Messelektronik für den Nachbau von einen
> Praktikumsversuch zu entwerfen der ursprünglich per Hand ausgewertet
> wurde und habe sozusagen ein paar Features ergänzt. (Ich möchte das
> ganze zum Erfahrung sammeln zuhause nachbauen).
>
> Mein Hauptproblem beim Überschlagen der Anforderungen ist, dass ich
> meine Messdaten von mehreren ADCs mit einer konstanten Datenrate von
> rund 10 Mbit/s irgendwo abspeichern muss. Das ganze soll so ca. 10 min.
> durchlaufen können was Minimum zu stolzen 750 Mbyte Daten führt. Wo ich
> die Daten hinschaufel ist mir egal, schlussendlich muss ich die Daten
> auf einem PC auswerten, da zu rechenaufwendig für MCU.

Dann liegt es ja am nächsten, die Daten direkt mit einem PC 
einzusammeln.

Schau mal, ob so etwas Dein Problem löst:

http://www.bluechiptechnology.co.uk/Product/PCIADC-Data-Aquisition-Card

So etwas in der Art gibts bis in den Gigasample-Bereich, aber dann wirds 
echt teuer.

fchk

von Thomas W. (Gast)


Lesenswert?

Georg schrieb:
> Wie schon Kohl sagt, wichtig ist was hinten
> rauskommt - buffern nützt da nichts bzw. nur sehr kurzfristig.

Ein Puffer mit z.B. 1GByte nützt ganz vorzüglich.

Da während der Messung insgesamt "nur" 750MByte anfallen, hätte die 
Mimik danach alle Zeit der Welt, um die Daten auf SD rauszuschreiben, 
Auszuwerten und übers Netzwerk in die Cloud (oder sonstwohin) zu 
schicken.

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.