Skocz do zawartości
szyss

sharp, funkcja dla pomiaru odległości, za dużo zajmuje

Pomocna odpowiedź

Witam, znalazłem w necie funkcje podającą pomiar z sharpa 20-150cm w mm

Funkcja działa dobrze jednak zajmuje około 20% pamięci atmegi8

nt sharp_scan(void)
{
#define p1 -11.395
#define p2 105.11
#define p3 -385.15
#define p4 710.25
#define p5 -690.56
#define p6 333.08
double pomiar;
double wynik;

pomiar=dana[1]*0.01953;
wynik=10.0*(p1*pow(pomiar,5)+p2*pow(pomiar,4)+p3*pow(pomiar,3)+p4*pow(pomiar,2)+p5*pomiar+p6);
return (unsigned int)(wynik);

}

jeśli do zmiennej pomiar wpiszemy bezpośrednio napięcie np: 1.7V to prawie nie widać różnicy w zajmowanej pamięci, ale zdaje mi się tak tylko iż kompilator to wylicza, ale jak jest na prawdę to nie wiem

Jeśli ktoś ma mniej pamięciochłonna funkcję lub jakąś drobną poradę to byłbym wdzięczny;-)

Pozdrawiam i dziękuję

Udostępnij ten post


Link to post
Share on other sites

Prawdopodobnie najwięcej zajmuje biblioteka liczb zmiennopozycyjnych.

Lepszym rozwiązaniem jest stablicowanie wyników, a następnie interpolowanie. Dokładność jest oczywiście mniejsza, ale powinna wystarczyć.

Najprościej jest zrobić tak:

1) wybierasz liczbę punktów (czyli dokładność), np. 32

2) dzielisz przedział wyników na 32 równe (tak jest najłatwiej) części

3) w excelu wyliczasz ile wynosi wynik dla każdego przedziału

4) wyniki wstawiasz do programu jako tablicę liczb unsigned int

Następnie odczytujesz dane z czujnika (dana[1]) i na jej podstawie wybierasz gotowy wynik z tablicy.

Lepszą dokładność uzyskasz dodając interpolację wyników.

Udostępnij ten post


Link to post
Share on other sites

Tutaj link jak można określić zasięg widzenia SHARP artykuł

Przykład dla SHARP 10-80 cm.

Taki sposób odbryłem na forum Arduino.

Kolejny przykład to

  • Lubię! 1

Udostępnij ten post


Link to post
Share on other sites

Proponuję, zamiast liczb zmiennoprzecinkowych, zastosować format stałoprzecinkowy, szesnastobitowy. Na przykład 5.11, kodowane w U2. To powinno pomóc: http://pl.wikipedia.org/wiki/Kod_sta%C5%82opozycyjny . Dla procesora będą to zwykłe zmienne int i na takich też będziesz działał. Kwestia tylko interpretacji.

Udostępnij ten post


Link to post
Share on other sites

Zrób to po prostu na if'ach, czyli podziel sobie zasięg na kilka stref i tyle oprogramuj 😉

Udostępnij ten post


Link to post
Share on other sites

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Anonim
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.


×
×
  • Utwórz nowe...