Skocz do zawartości

Atmega8. Sinusy i cosinusy.


Pomocna odpowiedź

Napisano

Witam serdecznie.

Mam pewne pytanie, jak dużym obciążeniem dla mikroprocków jest obliczanie sinusów czy też cosinusów, co de facto jest tym samym...? (Jak rozumiem taka możliwość w ogóle istnieje?).

Mam bowiem zadanie cyfryzacji wyników pomiarów z pewnego przyrządu. Układ pomiarowy mierzący kąt został już przeze mnie wykonany. Teraz się zastanawiam czy wyniki pomiarów przedstawić na LCD (co wymagało by obliczenia równania z dwoma sinusami) czy też wysłać wyniki (kąt) po RS np do excella i tam wykonać obliczenia i wizualizację. Oczywiście można by zrobić obie te rzeczy, jednak tu właśnie pytanie, na ile funkcje matematyczne są dla mikroprocesora obciążające.

Pozdrawiam.

Mazur.

mikroprocesor licząc sinusa będzie korzystał z szereg Maclaurina, więc albo będzie liczył wolno i niedokładnie, albo bardzo wolno i mniej niedokładnie 😉 Zwykle rozwiazuje się to w ten sposób, że tablicuje się ćwiartkę sinusa w pamięci programu. Niestety ATmega ma mało pamięci, ale możesz np. zapisać 1571 16b próbek (czyli zajmiesz 3.07kB pamięci) uzyskując dokładność 0.001 radiana, jeszcze dokładniej możesz próbować estymować liniowo.

  • Pomogłeś! 1

A miało by sens wprowadzenie na sztywno współczynników wielomianu aproksymującego sinusa w przedziale 0-2pi obliczonych wcześniej np w matlabie, żeby mikrokontroler musiał wykonać tylko kilka prostych dodawań i mnożeń oraz odpowiednio przygotować argument?

OldSkull

Dzięki bardzo za odpowiedź.

Zaciekawiła mnie opcja z tą ćwiartką sinusa, czy dobrze kombinuję, że wtedy w zależności od argumentu czytasz tablicę w lewo albo w prawo, lub też to samo tylko ze znakiem ujemnym?

Pozdrawiam.

Sinus w przedziale <-1, 1> jest bardzo nieefektywny

ponieważ wymaga zmiennej zmiennoprzecinkowej (float).

Rozwiązaniem może być przeskalowanie do przedziału <0, 255>

Wtedy można to przeliczać w excelu

lub na potrzeby wyświetlenia wartości na LCD można tylko raz użyć zmiennej typu float

a wszystkie operacje matematyczne można wykonać na int8.

Dobrym rozwiązaniem wydaje mi się może być tablicowanie w EEPROMie wartości

sinusa ze zmiennym krokiem a wartości pośrednie linearyzować.

Trzeba ustalić optymalną liczbę punktów i ewentualnie błąd linearyzacji.

Pozdrawiam

Zuk

mazur89, dokładnie tak.

Zuk, najlepiej przeskalować i zapisać jako liczba stałoprzecinkowa. Polecam 16b, gdyż jest większa dokładność i większa wygoda przy przybliżaniu. Nie rozumiem dlaczego EEPROM - odczyt z niego nie jest zbyt szybki, poza tym zapisana wartość nie będzie się zmieniać, a dodatkowo jest go niewiele w procesorze. Lepiej zapisać w pamięci programu.

OldSkull zgadzam się z Tobą, jednak

takie moje zboczenie, że unikam zmiennych innych niż 8b,
oczywiście nie zawsze tak można więc zgadzam się - 16b da większą dokładność

-kwestia potrzeby

Oczywiście można także w pamięci programu.

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...