squelch napisał: wiem że jakieś nadpróbkowanie tu jest ale jak to możliwe? Przecież dodaje 128 próbek i dzielę przez 128
Liczy średnią, najprawdopodobniej nadpróbkowuje. Z programu nie da się wywnioskować danych wejściowych, można tylko domniemywać. Przez 128? A dlaczego nie przez 4?
tmf napisał: Otóż jeśli używasz float, to masz możliwość zapisu tych dodatkowych bitów i to jak dzielisz jest bez większego znaczenia
Ja bym nie był takim optymistą

Zawsze jak widzę liczby zmiennoprzecinkowe dzwoni mi dzwonek w głowie, czasem brzmi jak przewracający się garaż blaszak. Na AVR nigdy nie używałem takich liczb. Więc zrobiłem test z ciekawości. Suma 128 sztuk pewnie nie da dużego błędu, lecz w przypływie twórczości programista zsumował sobie 65536 próbek :] Efekt:
wartość mierzona, średnia, różnica, ilość próbek, i błąd procentowy:
4200 4196 4.10 iter 65536 diff 0.097598 %
4201 4204 -2.75 iter 65536 diff -0.065437 %
4202 4204 -1.93 iter 65536 diff -0.045958 %
4203 4205 -1.60 iter 65536 diff -0.038059 %
4204 4207 -2.60 iter 65536 diff -0.061929 %
4205 4207 -1.66 iter 65536 diff -0.039573 %
4206 4207 -1.33 iter 65536 diff -0.031658 %
4207 4208 -0.51 iter 65536 diff -0.012198 %
4208 4208 -0.43 iter 65536 diff -0.010118 %
4209 4208 0.51 iter 65536 diff 0.012181 %
Więc jeśli nasza temperatura ma 40 stopni, to nie otrzymamy realnej rozdzielczości 0.01 stopni.
Taki sam wynik otrzymuje na x86 z gcc kompilowany z opcją -O0 lub -O1, kompilacja z opcją -O2 sprawia że wynik jest jakby bezbłędny, pewnie kompilator optymalizuje do jednostki zmiennoprzecinkowej większej precyzji jaka jest w x86.
Program testowy, można sobie zobaczyć, może ma jeszcze jakieś błędy.
Dla AVR trzeba sobie dopisać uart i transmisje w funkcji send.
Zaloguj się, aby zobaczyć kod