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
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
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
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.
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.
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???
SD Karten brauchen immer in den unpassenden Momenten lange Denkpausen..
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.
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.
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.
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.
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.
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.
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.