Rayu85 Napisano Luty 11, 2019 Udostępnij Napisano Luty 11, 2019 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. Cytuj Link do komentarza Share on other sites More sharing options...
FlyingDutch Luty 12, 2019 Udostępnij Luty 12, 2019 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 1 Cytuj Link do komentarza Share on other sites More sharing options...
Pomocna odpowiedź
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!