Forum: Mikrocontroller und Digitale Elektronik Aufzeichnungsrate Datenlogger


von Colin Z. (codi)


Lesenswert?

Hallo,

Als relativer Arduino Anfänger beschäftigt mich der Gedanke einen 
Datenlogger zu bauen. Hierzu fehlt mir die Möglichkeit einzuschätzen wie 
schnell, also mit welcher Samplerate, der Datenlogger die Daten 
wegschreiben kann, wie man das beinflussen und abschätzen kann.
Zum einen gibt es oft eine Angabe im Datenblatt wie schnell der ADC 
arbeitet z.B. AVRMega328P 50 - 200khz, bedeutet das, dass ich einfach 
mit den z.B. 50Khz den ADC auslesen kann und die Daten auf eine SD Karte 
schreiben kann?

Als Beispiel:

void loop (){
Pin auslesen
Umrechnung der Spannung in Beschleunigung
file.print(Zeitstempel)
file.print(",")
file.print(Messwert)
}

Wenn der Loop läuft hängt doch die Frequenz mit der der Pin oder ggf. 
mehrere davon ab wie umfangreich das Programm ist oder nicht? Wie kann 
man abschätzen und ob ein µC schnell genug für eine angedachte Aufgabe 
ist und das ggf. beeinflussen?

Evtl. hätte ich gerne eine feste Samplerate von z.B. 50khz bei der 
Messung, wie kann man diese einstellen?

Danke schon mal!

: Bearbeitet durch User
von Cyblord -. (cyblord)


Lesenswert?

Du nimmst einen Timer. Der Timer schaltet eine Variable auf 1. Und zwar 
in einem von dir bestimmten Interval (z.B. deine 50 KHz). Dein Main Loop 
wartet darauf. Macht dann sein Ding. Setzt die Variable wieder auf 0.

: Bearbeitet durch User
von Sascha W. (sascha-w)


Lesenswert?

Colin Z. schrieb:
> Zum einen gibt es oft eine Angabe im Datenblatt wie schnell der ADC
> arbeitet z.B. AVRMega328P 50 - 200khz, bedeutet das, dass ich einfach
> mit den z.B. 50Khz den ADC auslesen kann und die Daten auf eine SD Karte
> schreiben kann?
auslesen schon, mit Timer am besten wie schon vorgeschlagen. Der Timer 
kann direkt die Messung starten und nach der Wandlung löst der ADC einen 
Interrupt aus. In der ISR setzt du ein Flag und damit löst du in der 
Hauptschleife deine Berechnung und Speicherung aus.
Daten mit 50k und dem Ausgabeoverhead auf die Karte zu bekommen dürfte 
sportlich werden da die Karten schon mal in unbestimmten Abständen eine 
größere Pause von durchaus paar 100ms einlegen. Da du aber bis zur 
nächsten Messung nur 0.02ms hast musst du das erst mal im RAM puffern.
Du solltest dir erst mal Gedanken zur Anforderung machen:
Kontinuierliche Aufzeichnung -> benötigt keine Zeitstempel (allenfalls 
Startzeit)
Du willst Beschleunigung messen -> dann nimm Messwerte mit 50kHz und 
prüfe zunächst ob ein gewisser Schwellwert überschritten ist, nur dann 
speicherst du den Wert incl. Zeitstempel

Sascha

von Nicht W. (nichtsowichtig)


Lesenswert?

Mit Arduino und SD-Karte sind da mit ein paar Tricks locker 3-5kHz drin, 
war mit Beschleunigungssensor und ca 50 abzuspeichernde Zeichen pro 
Zeile inkl Timestamp.

von Cyblord -. (cyblord)


Lesenswert?

Nicht W. schrieb:
> Mit Arduino und SD-Karte sind da mit ein paar Tricks locker 3-5kHz drin,

Mit einem Controller der 10-20 MHz macht ist das echt traurig. Der 
Arduino Overhead würde mich psychisch fertig machen. Mit solch einem 
Klotz am Bein könnte ich nicht mehr ruhig schlafen.

von Nicht W. (nichtsowichtig)


Lesenswert?

Cyblord -. schrieb:
> Nicht W. schrieb:
>> Mit Arduino und SD-Karte sind da mit ein paar Tricks locker 3-5kHz drin,
>
> Mit einem Controller der 10-20 MHz macht ist das echt traurig. Der
> Arduino Overhead würde mich psychisch fertig machen. Mit solch einem
> Klotz am Bein könnte ich nicht mehr ruhig schlafen.

Das klingt sehr interessant! Wieviel geht denn mit klassischer 
Programmierung ohne SD-Puffer???

von Siggi S. (Gast)


Lesenswert?

SD Karten brauchen immer in den unpassenden Momenten lange 
Denkpausen..

von Cyblord -. (cyblord)


Lesenswert?

Nicht W. schrieb:
> Cyblord -. schrieb:
>> Nicht W. schrieb:
>>> Mit Arduino und SD-Karte sind da mit ein paar Tricks locker 3-5kHz drin,
>>
>> Mit einem Controller der 10-20 MHz macht ist das echt traurig. Der
>> Arduino Overhead würde mich psychisch fertig machen. Mit solch einem
>> Klotz am Bein könnte ich nicht mehr ruhig schlafen.
>
> Das klingt sehr interessant! Wieviel geht denn mit klassischer
> Programmierung ohne SD-Puffer???

Ich würde schätzen da wäre man Faktor 5-10 schneller.

von Wolfgang (Gast)


Lesenswert?

Siggi S. schrieb:
> SD Karten brauchen immer in den unpassenden Momenten lange
> Denkpausen..

Bei einem vernünftigen Programm stellt man sich darauf ein und sieht 
einen entsprechenden Puffer vor. Dann gibt es keine unpassenden Momente.

von Axel S. (a-za-z0-9)


Lesenswert?

Colin Z. schrieb:
> Als relativer Arduino Anfänger beschäftigt mich der Gedanke einen
> Datenlogger zu bauen. Hierzu fehlt mir die Möglichkeit einzuschätzen wie
> schnell, also mit welcher Samplerate, der Datenlogger die Daten
> wegschreiben kann, wie man das beinflussen und abschätzen kann.

> z.B. AVRMega328P 50 - 200khz, bedeutet das, dass ich einfach
> mit den z.B. 50Khz den ADC auslesen kann

Nein.

Der ADC im ATMega328 kann mit einer Taktfrequenz bis 200kHz arbeiten. 
Aber eine Wandlung dauert 13 Takte. Das ergibt dann maximal 15500 
Meßwerte pro Sekunde. Auch wenn du jeden Meßwert als 16 Bits 
wegschreibst (10 Bit kommen aus dem ADC), dann ist das eine Datenrate 
von gerade mal 30KB/s. Da lacht die SD-Karte nur drüber.

> Als Beispiel:
>
> void loop (){
> Pin auslesen
> Umrechnung der Spannung in Beschleunigung
> file.print(Zeitstempel)
> file.print(",")
> file.print(Messwert)
> }
>
> Wenn der Loop läuft hängt doch die Frequenz mit der der Pin oder ggf.
> mehrere davon ab wie umfangreich das Programm ist oder nicht?

Teilweise. Die Funktion, die du als "Pin auslesen" umschreibst, wird bei 
Arduino den ADC starten und dann auf das Ende der Wandlung warten. Bei 
200kHz ADC-Takt sind das 65µs. Respektive 1040 Taktzyklen des ATMega328 
(der läuft mit 16MHz).

Der Rest des "Programms" wird vermutlich sehr viel weniger Zeit 
brauchen, so daß die resultierende Abtastrate vom ADC dominiert wird. 
Noch dazu wirst du so die maximale Abtastrate des ADC gar nicht 
erreichen können, weil die darauf beruht, daß der ADC automatisch immer 
eine neue Wandlung startet, wenn er fertig ist. Keine Ahnung ob Arduino 
dafür was bietet. Vermutlich nicht. Ist halt Spielzeug.

Wenn man es richtig programmiert (also in C oder C++ oder Assembler) 
ohne dafür auf die Arduino-Legosteine zurückzugreifen, geht das 
natürlich.

von Wolfgang (Gast)


Lesenswert?

Axel S. schrieb:
> Keine Ahnung ob Arduino dafür was bietet. Vermutlich nicht.
> Ist halt Spielzeug.

Wenn du keine Ahnung hast, solltest du es einfach mit Dieter Nuhr halten 
...

Arduino gibt einem Dank der dort verwendeten Programmiersprache 
jederzeit die Möglichkeit, eigene Funktionen zu schreib - jedenfalls 
wenn man aus dem Spielalter raus ist und verstanden hat, wie ein ATmega 
oder ein Cortex-M3 tickt.

von Axel S. (a-za-z0-9)


Lesenswert?

Wolfgang schrieb:
> Axel S. schrieb:
>> Keine Ahnung ob Arduino dafür was bietet. Vermutlich nicht.
>> Ist halt Spielzeug.
>
> Wenn du keine Ahnung hast, solltest du es einfach mit Dieter Nuhr halten

Schau mal in den Spiegel.

> Arduino gibt einem Dank der dort verwendeten Programmiersprache
> jederzeit die Möglichkeit, eigene Funktionen zu schreib

Aha. Und ist das dann noch Arduino?

Wenn - sagen wir mal - Rembrandt ein "Malen nach Zahlen" Set genommen 
hätte und alles außer der Leinwand weggeworfen hätte und auf die 
Rückseite eines seiner Werke gemalt hätte ... wäre das dann noch "Malen 
nach Zahlen"?

Eben.

von Pandur S. (jetztnicht)


Lesenswert?

Eine Frage waere noch, wieviel Messwerte den geschrieben werden sollen. 
Wenn's nicht allzu viele sind waere allenfalls eine andere Speicherung 
wie einen SD Karte passend. zB NOR-Flash, oder FRAM. Dort gibt's kein 
File system, welches unpassend ist.
Und ADC wandeln lassen und schreiben koennen ueberlappend geschehen.

von Marc E. (mahwe)


Lesenswert?

Schau dir Mal unilog an der arbeitet auch mit atmega wenn ich das 
richtig im Kopf habe.
Ist günstig dazu Logview  und du hast alles was du brauchst für viele 
Sachen.
Wenn das nicht reicht bau selber.

von Wolfgang (Gast)


Lesenswert?

Axel S. schrieb:
> Aha. Und ist das dann noch Arduino?

Meinst du, dass die Libraries die eingebunden werden, vom Himmel fallen?
Nein, bei Arduino steht es jedem frei, eine Library zu schreiben, wie es 
ihm gefällt. Arduino ist einzig, dass er das Kernprogramm normalerweise 
nie zu sehen bekommt, sondern immer nur die Funktionen loop() und 
setup() in irgendeiner Weise zur Verfügung stellen muss.

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.