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

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

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.