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
desert-fox:
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.
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.
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.
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
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.