Skocz do zawartości

Jak w programie używać dokładnych enkoderów ?


klonyyy

Pomocna odpowiedź

Ok już rozumiem.

Ogólnie całość będzie zastosowana w robocie miniusmo - myślisz, że będą mi potrzebne dokładne dystanse itp czy prędkości i opieranie się na tym co "widzi" robot w danym momencie ? Bo o ten dystans zapytałem mając na myśli jak robot ma się cofnąć gdy zobaczy linię, przecież nie będzie się cofał aż zobaczy przeciwnika, bo zakończy się to wypadnięciem po drugiej stronie, jeśli go nie zauważy - musi mieć mniej więcej zadany dystans o jaki ma się cofnąć.

Dzięki za zainteresowanie tematem!

pozdrawiam

Link do komentarza
Share on other sites

Zamiast mierzyć odległość możesz zaprogramować tak, żeby sie cofał przez np 300ms, a później zaczął znowu szukać przeciwnika. Do tego enkodery nie są potrzebne.

Link do komentarza
Share on other sites

@klonyyy 1100 impulsów na obrót to nie jest wcale tak dużo, więc nie przejmuj się wielkością zmiennych. Na stm32 int ma 32 bity. 1 bit na znak, więc zostaje Ci 31 bitów w każdą stronę, czyli dokładnie 2 147 483 648 impulsów, albo ok. 2 milionów obrotów. Zakładając nawet, że masz jakiś szybki silnik, powiedzmy 1000rpm, daje to 2000 minut (33h) działania do przepełnienia licznika 🙂 Jeśli to za mało zawsze jest long long w odwodzie 😉

Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

Bo o ten dystans zapytałem mając na myśli jak robot ma się cofnąć gdy zobaczy linię, przecież nie będzie się cofał aż zobaczy przeciwnika, bo zakończy się to wypadnięciem po drugiej stronie, jeśli go nie zauważy - musi mieć mniej więcej zadany dystans o jaki ma się cofnąć.

Implementujesz regulatory z artykułu, który linkowałem wcześniej. Gdy robot najedzie na linie zadajesz np,: rotacje 180* i translacji 10cm 🙂 Ogólnie możesz sobie wtedy zaplanować ciekawe manewry odwrotu. Zamiast opierać się na czasie, operuj na przejechanym dystansie.

Nie zliczaj pozycji na podstawie enkoderów względem całego ringu. Stuknie Cie konkurent i całe odczyty będą do śmieci.

Jak w PID daje rade na samych zmienny 16 bitowych, a odczytów z enkodera mam 10240 na obrót koła 🙂

Link do komentarza
Share on other sites

mactro póki co spróbuje zaimplementowac te regulatory z artykułu który podlinkował Treker. Prawdę mówiąc trochę mnie przeraziły te zmienne zapisywane w postaci 8.8, ale na początku postaram się zrobić to na floatach, które później zamienię na wyżej wspomniane 8.8.

pozdrawiam

EDIT : Przeczytałem cały artykuł jeszcze raz i mam kilka pytań :

1.W profilerze transalcji są zmienne przechowujące prędkość - rozumiem, że mam sobie przeliczać impulsy enkodera na prędkość w np. cm/s ?

2. To samo zapewne mam zrobić z drogą zadaną, tylko że w drugą stronę z np cm na impulsy ?

3. Z kolei w kodzie regulatora PD jest komentarz:

// zmienne enk_totalS oraz enk_totalT zawierają aktualne pomiary z enkoderów, zgodnie ze schematem zamieszczonym powyżej

Czyli tutaj już podaję ilość impulsów od ostatniego wywołania regulatora ?

4. Czy profilery i regulator PD mam liczyć w przerwaniu systicka czy będzie to trwało za długo ?

pozdrawiam,
Piotrek

Link do komentarza
Share on other sites

klonyyy

1,2) Ja wszystko przechowuję w impulsach, np. drogę, prędkość. Wtedy po prostu na kartce sobie obliczam ile impulsów to 1cm, ile impulsów/przerwanie to 1m/s itd. i do kodu wklepuję odpowiednie wartości. Można by to w sumie przechowywać w cm, cm/s, ale trzeba wtedy robić właśnie przeliczenia impulsów na cm na procesorze. Może być jeszcze problem dokładności, bo np. w moim robocie 1 impuls to ~0.04mm, więc tu też musiałyby być floaty lub stałoprzecinkowe do dokładnych odległości.

3) Tutaj powinny być impulsy od początku jazdy, ponieważ w zad_S/T przechowujesz ile powinieneś przejechać w danym momencie od początku jazdy. Jeśli enk_totalS/T liczyłbyś od poprzedniego przerwania to przy stałej prędkości powinny być stałe, a przy zwiększającym się stale zad_S/T błąd by się stale zwiększał, robot myślałby, że to zad_S/T ma przejechać w czasie między dwoma przerwaniami.

4) Ja wykonuję w przerwaniu systick co 1ms i wykonuje mi się wszystko poprawnie, nie powinno być żadnych problemów.

  • Lubię! 1
Link do komentarza
Share on other sites

Wojcik98, super dzięki za odpowiedź ! A jeszcze jedna rzecz jak uważacie najlepiej dać przepłnienie licznika timera po pełnym obrocie wyjścia przekładni, czy pojedyńczego obrotu osi silnika ?

bo np. w moim robocie 1 impuls to ~0.04mm, więc tu też musiałyby być floaty lub stałoprzecinkowe do dokładnych odległości.

Czyli normalnie wyszystko robisz na liczbach całkowitych ?

EDIT: aha i w sumie jak zapisywać dystans przebyty od początku ? Przerwania od timera, w których zwiększamy zmienną ?

EDIT2: Aaa no tak bo jak przechowujesz wszystko w implusach a nie w np cm to nie musisz stosowac flaotów czy tych zmiennych 8.8. A jeszcze pytanie odnośnie tych przerwań - przerwanie wykonuje się gdy licznik się przepełni - ale czy ta zmienna trzymajaca cały dystans ma być zmniejszana gdy koło kręci się w drugą stronę, czy ma się zwiększać niezależnie od kierunku ?

Link do komentarza
Share on other sites

Ja też wewnętrzne stany liczników trzymam w postaci impulsów, również na impulsach działają moje regulatory. Jednak funkcje do zadawania przemieszczenia czy prędkości mam takie, że wpisuję to w ludzkich jednostkach 😉 Jest to jedno proste skalowanie, wykonywane stosunkowo rzadko, a dzięki temu nie potrzebuję kartki i program zyskuje na czytelności 🙂

Link do komentarza
Share on other sites

mactro, a co z tym zliczaniem impulsów ? Zmniejszamy zmienne trzymające cały dystans podczas ruchu koła w tył, podczas gdy do przodu ją zwiększamy, czy w obu przypadkach liczymy bezwzględną iość impulsów podczas ruchu ?

Jak dobrze dostroić regulator PD sterujący takim i profilerami ?

pozdrawiam

Link do komentarza
Share on other sites

Ja zliczam wszystkie impulsy od początku działania robota, ale jak się nad tym zastanowić, to zerowanie liczników przy każdym nowym ruchu nie powinoo robić żadnej różnicy z punktu widzenia regulatora.

Strojenie regulatorów to temat rzeka. Spróbuj najpierw od samego członu P, zwiększając jego wzmocnienia, aż zaczną się pojawiać oscylacje. Później dodajesz człon D, który te oscylacje powinien wygasić.

Link do komentarza
Share on other sites

Ja w moim mm po prostu odejmowałem co wywołanie regulatora przebytą drogę. Jeśli miał do przejechania 1000 impulsów, przejechał sto to zostawało 900. Podobnie w drugą strone, jeśli miał do przejechania -1000 (w tył) to -1000-(-100)=-900. Jeśli było do przejechania powiedzmy mniej niż 100 impulsów to prędkość proporcjonalnie malała.

Link do komentarza
Share on other sites

Ja chyba będę po prostu liczył w górę tzn odłączę jeden pin enkodera i wtedy ruch do tyłu będzie zawawany jako wartość dodatnia, a silnikami sterować bedę inputami silnika.

Strojenie regulatorów to temat rzeka. Spróbuj najpierw od samego członu P, zwiększając jego wzmocnienia, aż zaczną się pojawiać oscylacje. Później dodajesz człon D, który te oscylacje powinien wygasić.
mactro, to mniej więcej wyczytałem w necie, ale chodzi mi jak zauważyć te oscylacje ? To będzie w formie przyspieszania i zwalniania silników w czasie jazdy po prostej z zadaną stałą prędkością ?

Ogólnie jak teraz uruchamiam ten regulator to błąd PD jest dużo na minusie, a pwm skacze albo 0 albo 100% wypenienia ( tzn przekracza wartość rejestru).

pozdrawiam,
Piotrek

Link do komentarza
Share on other sites

Klonny:

Zakładając, że kod jest ok to masz albo za duże P, albo za małe D. Nie bój się początkowo zmieniać wskaźniki o rząd wielkości. Dojdź do sytuacji, że robot będzie powoli, ale płynnie wykonywał komendy. Jak to osiągniesz zacznij podkręcać parametry.

PS. Pamiętaj też, że parametry zależą od czasu (chyba, że będziesz je skalował wg. czasu pomiędzy krokami). Inna będzie wartość D dla kroku 10ms, a zupełnie inna dla kroku 1ms.

Link do komentarza
Share on other sites

Ja chyba będę po prostu liczył w górę tzn odłączę jeden pin enkodera i wtedy ruch do tyłu będzie zawawany jako wartość dodatnia, a silnikami sterować bedę inputami silnika.

To zdanie coś Ci nie wyszło 😋 Nie wiem jak inaczej można sterować silnikiem, jak nie przy pomocy jego wejść 🙂 A z wykrywanie kierunków obrotów nie rezygnuj. To naprawdę nie jest trudne, a bez tej informacji może być Ci ciężko ogarnąć precyzyjne ruchy. Zwłaszcza przewiduję problemy przy hamowaniu i zmianie kierunku obrotów silnika, kiedy wypełnienie może być przeciwne do kierunku obrotów.

Co do oscylacji regulatora prędkości, to gołym okiem czasem może być je ciężko zauważyć (no chyba, że nastawy są kompletnie do bani). Zrób sobie ćwiczenie z programowania na PC i napisz apkę, która będzie rysowała wykresy prędkości, na podstawie danych z robota.

Link do komentarza
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...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.