Martin Posted June 23, 2016 at 11:23 AM Posted June 23, 2016 at 11:23 AM Hallo, ich verwende gerade den Data Logger des Brick Viewers 2.3.4 (unter Linux auf einem Wandboard) um ein Distance US Bricklet (http://www.tinkerforge.com/de/doc/Hardware/Bricklets/Distance_US.html) mit Distance Value 1 und unterschiedlichen Moving Average Length Werten auszulesen: Moving Average Length 0 20160623_115450;Distance US Bricklet;nZ1;Distance Value;1089; 20160623_115451;Distance US Bricklet;nZ1;Distance Value;1083; 20160623_115452;Distance US Bricklet;nZ1;Distance Value;1080; Moving Average Length 10 20160623_115522;Distance US Bricklet;nZ1;Distance Value;10995; 20160623_115523;Distance US Bricklet;nZ1;Distance Value;10993; 20160623_115524;Distance US Bricklet;nZ1;Distance Value;10993; Moving Average Length 20 20160623_115553;Distance US Bricklet;nZ1;Distance Value;5489; 20160623_115554;Distance US Bricklet;nZ1;Distance Value;5489; 20160623_115555;Distance US Bricklet;nZ1;Distance Value;5489; Moving Average Length 100 20160623_115620;Distance US Bricklet;nZ1;Distance Value;1093; 20160623_115621;Distance US Bricklet;nZ1;Distance Value;1088; 20160623_115622;Distance US Bricklet;nZ1;Distance Value;1086; Der Sensor ist stationär montiert und die Unterschiede können kaum von der Messung selbst oder unterschiedlicher Mittelwertbildungen stammen. Woher kommen diese starken Schwankungen? Im Source code (https://codeload.github.com/Tinkerforge/distance-us-bricklet/legacy.zip/master) findet man unter Tinkerforge-distance-us-bricklet-fbe5634/software/src/ in distance-us.h #define MOVING_AVERAGE_DEFAULT 20 #define MOVING_AVERAGE_MAX 100 so dass ein Wert >100 wohl kaum Sinn macht. Betrachtet man distance-us.c sieht man, dass BC->moving_average_sum und BC->moving_average[] im constructor mit 0 initialisiert werden (ab Zeile 100): BC->moving_average_sum = 0; BC->moving_average_tick = 0; BC->moving_average_num = MOVING_AVERAGE_DEFAULT; for(uint8_t i = 0; i < MOVING_AVERAGE_MAX; i++) { BC->moving_average[i] = 0; } In distance_from_analog_value wird die neue Summe dann ausgehend von der alten berechnet (ab Zeile 159): if (BC->moving_average_num > 0) { BC->moving_average_sum = BC->moving_average_sum - BC->moving_average[bC->moving_average_tick] + analog_data; BC->moving_average[bC->moving_average_tick] = analog_data; BC->moving_average_tick = (BC->moving_average_tick + 1) % BC->moving_average_num; ret_value = (BC->moving_average_sum + BC->moving_average_num/2)/BC->moving_average_num; } else { ret_value = analog_data; } Müsste da in set_moving_average (Zeile 190) bei einer Änderung von BC->moving_average_num nicht auch BC->moving_average_sum zunächst einmal wieder neu berechnet werden? void set_moving_average(const ComType com, const SetMovingAverage *data) { BC->moving_average_num = data->average; if(BC->moving_average_num > MOVING_AVERAGE_MAX) { BC->moving_average_num = MOVING_AVERAGE_MAX; } BA->com_return_setter(com, data); } Bei einer Änderung von BC->moving_average_num sollten die fehlenden Werte addiert/überschüssigen Werte subtrahiert werden, um die neue Summe zu berechnen oder einfach alles neu berechnet werden. Ansonsten wird ab der Änderung von einer falschen Summe der älteste Wert subtrahiert und der neueste addiert... Genau genommen sind die Werte in der Anfangsphase zudem noch verfälscht, da evtl. noch Nullwerte eingehen und der Mittelwert für BC->moving_average_num natürlich erst berechnet werden kann, falls so viele Werte vorliegen. BC->moving_average_num müsste also schrittweise heraufgesetzt werden. Aber im Gegensatz zu einem "Summenproblem" verschwindet so ein Fehler nach kurzer Zeit von selbst... Aber wahrscheinlich habe ich das auf die Schnelle nur nicht richtig gesehen... Zum Schluß noch eine weitere Frage zum Data Logger: Wie kann ich das Speichern der Bricklet-Bezeichung in jeder Zeile 20160623_115450;Distance US Bricklet;nZ1;Distance Value;1089; deaktivieren? 20160623_115450;nZ1;Distance Value;1089; reicht mir völlig aus, da ja über die ID nZ1 ja bereits eindeutig spezifiziert ist, um welches Bricklet es sich handelt und so ein unnötiges Datenvolumen vermieden werden kann. Zudem wäre eine kürzere Bezeichnung als Distance Value wünschenswert. Danke, Martin Quote
photron Posted July 1, 2016 at 03:55 PM Posted July 1, 2016 at 03:55 PM Stimmt, das funktioniert nicht wie es soll. Da fehlt Logik in set_moving_average. Teste mal bitte die angehängt Version, die sollte das Problem beheben. Bezüglich Data Logger CVS Ausgabe: Ich setze mir mal einen kompakten Ausgabemodus auf die TODO Liste bei dem statt Device Name und Value Name jeweils deren ID Nummern verwendet werden.distance-us-bricklet-203.bin Quote
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.