Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

argument podwójnej funkcji

Ostatnio zmodyfikowano 2016-01-06 01:48
Autor Wiadomość
matka5432
Temat założony przez niniejszego użytkownika
argument podwójnej funkcji
» 2016-01-05 22:58:42
Witajcie, na początku może wyjaśnię o co chodzi.

Jestem w trakcie tworzenia pewnego projektu mechaniczno-informatycznego. Mianowicie potrzebuję wykryć kąt pod jakim aktualnie ustawiona jest oś silnika. Na osi jest przymocowane kółko http://snag.gy/FpIVB.jpg  (wydrukowane na folli przezroczystej i wyciete. Na obrazku im bardziej białe tym bardziej przezroczyste). Dodatkowo przed i za kółkiem zamocowane są 2 czujniki przezroczysości (dioda + czujnik światła).
Przyjmijmy, że czujnik czerwony to C1 (na obrazku) a niebieski C2. Oba przyjmują wartość 0-100 (0 - zerowa przezroczystość 100 - 100% procentowa przezroczystość)

Podczas jednego pełnego obrotu osi otrzymuję następujący przebieg: http://snag.gy/ZXcqT.jpg
Wiadomo, że w rzeczywistości jest nieco bardziej zniekształcony i tutaj właśnie jest problem, bo w rzeczywistości mniej wiecej wygląda tak: http://snag.gy/qNzDY.jpg

Moje pytanie brzmi: W jaki sposób otrzymać kąt znając wartość C1 oraz C2?

Oczywiście miałem pewne pomysły, np
C/C++
jesli C1 < 50 to kat = C2 / 0.555
jesli C1 > 50 to kat = 360 - C2 / 0.555

W teori powinno działac, ale w rzeczywistości warunek "jesli C1 < 50 oraz jesli C1 > 50" nie dziala w dokladnym momencie bo jest pewien blad. Potem wpadlem na pomysly aby najpierw obliczyc w sposob, ktory opisalem przed chwila, oprocz tego obliczyc kat2 z zamiana C1 i C2 czyli w tym przypadku:
C/C++
jesli C2 < 50 to kat = C1 / 0.555
jesli C2 > 50 to kat = 360 - C1 / 0.555

nastepnie bralem srednia kat i kat2, wyniki byly sporo lepsze, ale jeszcze jest blad +- 5%. Na pewno nie da sie go wyeliminowac, ale z drugiej strony na pewno jest sposób, aby go zmniejszyc. Założe się, że mój sposób nie jest najlepszy.
P-142931
mateczek
» 2016-01-05 23:11:44
przy czym c1 i c2 przesunąć w zakres (-50 +50)

c1/c2 = tg(kąt)
P-142932
matka5432
Temat założony przez niniejszego użytkownika
» 2016-01-05 23:19:24
WoW :D Madre, nie wpadlem na to. Przetestuje i poinformuje o efektach :D


Niestety iloraz funkcji, które narysowałem, nie jest tangensem. Pomiedzy 0 a 45 stopni, kat jest lekko zanizony, a pomiezdy 45 a 90 - zawyzony.

Kolejny problem, to ify. Co 90 stopni bede musial stosować warunek, żeby "przeskoczyło" na inny wzór. Od 0 do 90 bedzie ten co podałeś. Pomiedzy 90 a 180 bede musiał od 180 odjąć wartość z tego samego wzoru itd.. a właśnie takiego przeskakiwania chciałbym uniknąć.
P-142934
1aam2am1
» 2016-01-06 01:13:40
Może.

double kat = C1/100.0*180.0;
if(C2 < 50){kat = 360.0 - kat;}

1. C1/100 Da nam w % wartość kota. Mnoże razy 180 Otrzymuje kąt.
2. If powoduje zmianę kąta jeżeli C2 jest niżej niż połowa czyli kąt jest większy od 180

Zobacz. Tak na szybko wymyślone
P-142944
matka5432
Temat założony przez niniejszego użytkownika
» 2016-01-06 01:48:16
1aam2am1 na początku właśnie mówiłem, ze próbowałem tego sposobu. Z tym, że ty napisałeś C2/100*180 a ja c2/0.555.Może tego nie widac, ale to jest dokładnie ten sam sposób. Owszem byłby dobry, gdyby nie zakłócenia.
Mi zależy na jakimś jednym matematycznym wzorze bez instrukcji warunkowych (if), do którego wstawiam C1 i C2 a on mi zwraca kat.

Zastanawiałem się również nad takim sposobem, że do tablicy tab[360][2] wstawiłbym wartości odpowiadające danemu kątowi, dla 2 funkcji (C1 i C2) np:
dla kata 45 stopni funkcja C1 przyjmuje wartosc 25, a C2 75.
tab[45][0] = 25;
tab[45][1] = 75;

po wpisaniu dwuch wartości program wyszukiwałby, któremu kątowi najbardziej odpowiadają. Ewentualnie można stworzyć tablice tab[3600][2] dla większej precyzji. Ale tutaj kolejny problem, używam mikrokontrolera do wszystkich obliczeń a nie chce go zamulić, fajnie było by jednak przełożyć ten pomysł na jakiś wzór.


Mój przykłąd z tablicami można porównać do zapisywania w pliku różnych kombinacji składników sumy, a obok ich wynik. Program zamiast obliczać wyszukiwałby wyniku w pliku. Wiadomo, że to jest bardziej pracochłonne niż po prostu dodać x+x i obliczyć :D


EDIT:
Ostatni sposób z tablicami działa wyśmienicie :D wymysliłem go pisząc ten komentarz xD, przydałoby się go jednak zamienić na wzór, bo mnie mocy obliczeniowej by zabierał ;)
P-142946
« 1 »
  Strona 1 z 1