Jump to content

Recommended Posts

Posted

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

 

  • 2 weeks later...
Posted

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

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...