Skocz do zawartości

Przetwarzanie sygnału z 4 enkoderów - robot mobilny


Rayu85

Pomocna odpowiedź

Witam wszystkich po dłuższej przerwie,

Jako, że znalazłem trochę czasu postanowiłem poprawić mój projekt robota mobilnego.
Poprzednim razem choć kupiłem wszystkie elementy zrezygnowałem z użycia enkoderów. Tym razem postanowiłem je zamontować.

Robot posiada 4 koła a każde z nich niezależny silnik. Sercem jest Arduino 2560 Mega.
Montaż enkoderów nie przysporzył mi problemu. Na razie tarcza przewiduje 20 sygnałów na obrót. Napisanie programu który zlicza kroki też poszło gładko. Zastanawia mnie tylko w jaki sposób zrealizować sprzężenie zwrotne.

Mógłbym zrobić to na przerwaniach ale obawiam się że jeśli kilkadziesiąt razy na sekundę będzie występować przerwanie, dodatkowo jeszcze będą to 4ry różne przerwania (4 enkodery) to nie dość, że w trakcie jednego przerwania będą występować kolejne (które pewnie zostaną zignorowane na skutek wykonywania aktualnie przerwania z innego enkodera) to sama obsługa enkoderów mocno obciąży program.
Zastanawiałem się czy istnieje możliwość "zlecić" porównywanie sygnałów poza mikrokontroler np. wykorzystać bramki logiczne CMOS tak aby do mikrokontrolera trafiała już gotowa informacja który silnik ma przyspieszyć a który zwolnić. Ewentualnie przyszło mi do głowy dołożyć dodatkowy mikrokontroler którego zadaniem była by tylko obsługa enkoderów, ale to chyba przerost formy nad treścią. 

Czy ktoś mógłby podrzucić jakiś kierunek poszukiwań rozwiązania? Bo pomimo, że pewnie 3/4 robotów mobilnych korzysta z enkoderów to nie znalazłem żadnych sensownych informacji jak to rozwiązać w praktyce przy 4 enkoderach.

Link do komentarza
Share on other sites

15 godzin temu, Rayu85 napisał:

Mógłbym zrobić to na przerwaniach ale obawiam się że jeśli kilkadziesiąt razy na sekundę będzie występować przerwanie, dodatkowo jeszcze będą to 4ry różne przerwania (4 enkodery) to nie dość, że w trakcie jednego przerwania będą występować kolejne (które pewnie zostaną zignorowane na skutek wykonywania aktualnie przerwania z innego enkodera) to sama obsługa enkoderów mocno obciąży program.

Cześć,

przerwania zewnętrzne mają swoje priorytety (patrz: dokumentacja - nie można ich zmienić). Najpierw są wykonywane przerwania o najwyższym priorytecie, gdy podczas procedury obsługi takiego przerwania wystąpi przerwanie o niższym priorytecie, aktualne przerwanie jest wykonywane do końca, a przerwania o niższych priorytetach są kolejkowane do wykonania (według ich priorytetów). Patrz linki:

https://forum.arduino.cc/index.php?topic=375102.0

https://forum.arduino.cc/index.php?topic=375102.0

https://forum.arduino.cc/index.php?topic=287697.0

https://www.arduino.cc/reference/en/language/functions/external-interrupts/attachinterrupt/

Ja bym to jednak spróbował oprogramować na przerwaniach - dobrze napisane nie powinno Ci za bardzo obciążyć CPU.

Pozrawiam

 

  • Lubię! 1
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.