Go Down

Topic: Wie gehe ich mit vielen Messwerten im Hintergrund um? (Read 2258 times) previous topic - next topic

desert-fox

Hallo zusammen,

ich steuer meinen Arduino Mega über ein VB.NET Programm an. Immer wenn er einen Befehl bekommt, führt er einen Befehl über die zweite serielle Schnittstelle aus. Dann dauert das etwa 150ms bis der nächste Befehl kommt. Ich möchte in diesen 150ms den analogen Eingang x-mal lesen und frage mich, wie ich da am geschicktesten vorgehe. Ich weiß, dass ich dafür kein delay() nutzen kann, da das Programm dann unterbrochen wird. Also werde ich die verstrichenen millis() zählen und alle 5ms in die Funktion für das Lesen des analogen Eingans durchlaufen. Ich frage mich nur, wäre es geschickter einen Buffer im Arduino zu füllen und nach einer zeit von 10sek komplett auszulesen, oder sollte man lieber jeden ermittelten analogen Wert direkt über die serielle Schnittstelle auslesen?

Ich hoffe ihr könnt ein wenig folgen was ich hier vorhabe :-)

Danke für eure Vorschläge!

Serenifly

Soweit ich weiß werden da normalerweise Puffer verwendet, da es zu langsam ist jeden Wert einzeln rauszuschicken.

Die Luxus-Lösung wäre eventuell ein Ringpuffer

JuergenR

Hallo,

wie viele Werte sind es?
wie groß sind die Werte (byte, int, ..)?
Mit welcher Baudrate wird die serielle Schnittstelle betrieben?

Hintergrund: bei 9600bd, 8n1 benötigt 1 Byte in etwa 1ms...

Grüße,
Jürgen

kurti

Hallo,


Ich hoffe ihr könnt ein wenig folgen was ich hier vorhabe :-)
Danke für eure Vorschläge!


also ehrlich gesagt: ich kann Dir nicht folgen.

Aus meiner Praxis:
überdenke als erstes die Anzahl der Analogwerte.
Macht es überhaupt Sinn, so viele Werte einzulesen ?
Reicht vielleicht eine Messung in 150 ms ?
( oder noch wesentlich weniger )
Eine Temperatur eines Lagers beispielsweise einzulesen macht öfter als alle 10 Sekunden keinen Sinn.

Reicht Die eventuell ein Mittelwert ( z.B. 10 Messungen addieren und durch 10 dividieren ) ?

ohne Deine Anwendung zu kennen ist eine Aussage unmöglich.

Gruss
Kurti
Zitat Jurs: falsche Verkabelung ist sowieso immer wenig förderlich für das Funktionieren der Hardware



hier könnte Ihre Werbung stehen

desert-fox

#4
Jun 18, 2013, 11:04 am Last Edit: Jun 18, 2013, 11:45 am by desert-fox Reason: 1
Hallo zusammen,

danke für die Antworten!

Ich habe mich für den Buffer entschieden

unisigned long buffer[800][2];

Der Buffer wird alle 10ms mit einem gemittelten Messwert aus 25 einzelnen Messwerten eingeschrieben. Es handelt sich hierbei um eine Stromaufnahme in einer Taktzeit von ca 150ms. Um die Stromaufnahme sauber zu dokumentieren, reichen mir nicht 1 Messwert aus. Mit 15 Messwerten auf 15ms kann man da schon mehr anfangen.

Edit:
Und hier das Ergebnis meiner Messung.


Y-Achse: Angabe in mA
X-Achse: millis()

Serenifly

#5
Jun 18, 2013, 02:18 pm Last Edit: Jun 18, 2013, 03:40 pm by Serenifly Reason: 1
Ein Long hat 4 Byte. 1600 longs sind 6,4 kB.

Der Mega macht das mit seinen 8kB RAM gerade so, je nachdem was da sonst noch läuft, aber du solltest vielleicht deine Speicherauslastung beachten. Wenn er nur die Werte misst und raus-schickt sollte es aber funktionieren :)

Andererseits, was willst du da mit longs? int reicht doch wenn du nur von 0-1023 (die DAC Auflösung) messen willst. Klar addierst du mehrere Werte auf, aber die Division begrenzt sie wieder. Ein long zum Berechnen und danach wieder in einen int schreiben (wobei 1023*25 auch in einen unsigned int passt, aber vielleicht willst du das ja mal anpassen). Das halbiert auch die Übertragungszeit.

desert-fox

Hey,

danke für die Info!! Ich hatte ursprünglich den int drin stehen gehabt und hatte negative millis(). Daraufhin habe ich mich einfach dazu verleiten lassen das unsigned davor zu hauen ohne mir überhaupt über die Auswirkungen im Klaren zu sein.

Hab es jetzt auf Int umgestellt und funktioniert natürlich auch 1A :-)

Danke!

Serenifly

#7
Jun 18, 2013, 05:25 pm Last Edit: Jun 18, 2013, 09:19 pm by Serenifly Reason: 1
Da ist dir dein normaler signed int nach 32,767 übergelaufen. Ein unsigned int erweitert den Bereich aber schon auf 65,535 :)

Wenn du da größere Millis speichern willst, würde ich zwei getrennte Arrays nehmen. Eins mit unsigned int und eins mit unsigned long. Immer noch besser also zweimal long.

Go Up