Skocz do zawartości

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


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

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.

@matty

Ale to bardzo banalny sposób który stosowałem w poprzednich robotach. Jak każdy chcę rozwinąć swoje konstrukcje i nie tkwić z głupimi delayami...

@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 😉

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 🙂

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

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

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 ?

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 🙂

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

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ć.

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.

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

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.

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.

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...