Skocz do zawartości

IPreferPI


baton

Pomocna odpowiedź

Podoba Ci się ten projekt? Zostaw pozytywny komentarz i daj znać autorowi, że zbudował coś fajnego!

Masz uwagi? Napisz kulturalnie co warto zmienić. Doceń pracę autora nad konstrukcją oraz opisem.

Bardzo ciekawa konstrukcja, czekam na następce.

Mam pytanie co do tego problemu z programem czytającym enkodery.

Czy nie lepiej byłoby podpiąć wyjścia enko jako osobne przerwania, bo tutaj widzę, że masz oba enkodery w jednym przerwaniu. Dodatkowo jak dla mnie (chociaż, nie jestem ekspertem w tym) brakuje chyba blokowania przerwania po wejściu do niego i odblokowania na wyjściu. Testowałeś takie rozwiązania?

Link do komentarza
Share on other sites

Robot naprawdę zacny 🙂 Szkoda, że płytki nie zabezpieczyłeś przed utlenianiem (albo ją nadtrawiłeś 😋 ). W Inżynierze obsługa enkoderów magnetycznych zajmują się Tiny13 i może warto iść w tym kierunku? Na jak długo włączasz diody (bo prąd przez nie płynący musi być pokaźnych wartości)?

Komentatorów w filmiku masz najlepszych 🤣

Link do komentarza
Share on other sites

Całkiem ciekawa mysz. Czemu nie założyłeś osłon również na diody IR?

Może warto było by spróbować zmniejszyć rozdzielczość enkoderów na minimum?

Powodzenia z następną konstrukcją, mam nadzieje że na RA2012 będziemy ze sobą rywalizować 🙂

Polulu HP

🙂

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

Może warto było by spróbować zmniejszyć rozdzielczość enkoderów na minimum?

🙂

Dokładnie - jak miałeś problem z gubieniem impulsów bo się atmega nie wyrabiała, to mogłeś sobie zmniejszyć rozdzielczość tych enkoderów - w nocie katalogowej jest opis programowania tych enkoderów. Mogłeś też spróbować użyć innego trybu ich użycia, bo tam są chyba 3 z tego co pamiętam (jeden z trybów zwraca "na żądanie" odpowiednią wartość którą inkrementuje sobie w pamięci sam enkoder, dzięki czemu masz gotową obsługę tego enkodera).

Ogólnie jednak konstrukcja bardzo dobra, choć z tymi wystającymi diodami poza obrys to trochę wpadka 😉 Nie mniej jednak, całość działa a to najważniejsze:) No i w końcu kolejny MM na forum jest! Oby więcej tego typu konstrukcji:)

A może zdradzisz coś więcej na temat nowej myszy TAU? Jak idą postępy? Może workloga założysz? :>

Link do komentarza
Share on other sites

Twój problem z enkoderami nie musi wynikać z długości pracy Twojej funkcji ich obsługi, tylko z blokowania dostępu do tej funkcji przez inne funkcje obsługi przerwań.

Innymi słowy przy 20MHz zegarze 500tików/s to żadne obciążenie dla uC. Ale jeżeli inna funkcja przyblokuje przerwania na dłużej, to możliwe jest pominięcie któregoś impulsu enkodera, ponieważ flaga przerwania PCINT2 zostanie nadpisana pomimo, że poprzednie przerwanie jeszcze nie zostało obsłużone.

Zastanów się nad całym programem pod tym kątem.

EDIT:

Dodatkowo jak dla mnie (chociaż, nie jestem ekspertem w tym) brakuje chyba blokowania przerwania po wejściu do niego i odblokowania na wyjściu.

Generalnie globalne przerwania są wyłączane sprzętowo w momencie rozpoczęcia obsługi przerwania i odblokowywane w momencie wyjścia z funkcji assemblerowym rozkazem reti który jest przez kompilator dodawany na końcu funkcji.

Dlatego funkcja obsługi przerwania zadeklarowana przez baton'a w taki sposób:

ISR(PCINT2_vect) // aktualna wartość enkoderów w globalnych int enkoderL, enkoderP 
{ 
  ...
} 

nie wymaga blokowania przerwań na jej początku, ani uruchamiania ich na końcu.

Jeżeli natomiast chcemy by funkcję mogło przerwać inne przerwanie należy dodać do kodu na samym początku sei():

ISR(PCINT2_vect) // aktualna wartość enkoderów w globalnych int enkoderL, enkoderP 
{ 
  sei();
  ...
} 

lub użyć atrybutu ISR_NOBLOCK:

ISR(PCINT2_vect, ISR_NOBLOCK) // aktualna wartość enkoderów w globalnych int enkoderL, enkoderP 
{ 
  ...
} 

który zrobi dokładnie to samo co powyżej, czyli doda sei() na początku funkcji.

Link do komentarza
Share on other sites

Gratuluję ukończonej konstrukcji!

Z mojej strony powiem, że masz jeszcze sporo do dopracowania pod względem algorytmicznym. Myszą strasznie rzuca na lewo i prawo, na Twoim miejscu zaostrzyłbym nastawy w PID'zie (bo chyba tym kontrolujesz ruch?).

Co do elektroniki, to wszystko super, tylko zastanawiam się, czemu zrezygnowałeś z czujników ustawionych pod kątem? Nie przydałyby się do szybszego wykrywania zakrętów i lepszej kontroli ruchu? Ciekawi mnie też, dlaczego nie odciąłeś składowej stałej z sygnału z fototranzystora? Kondensator i opornik w postaci filtru górnoprzepustowego i miałbyś załatwiony problem z każdorazową kalibracją czujników przy różnym świetle.

Myślę, że warto byłoby również popracować na estetyką 😋 Wiem, że ciężko jest w takim maleństwie zmieścić wszystko, ale jakby się troszeczkę dłużej zastanowić, to na pewno byś na coś wpadł 🙂

Podsumowując: dobry opis dobrej konstrukcji, jest wszystko czego by się tylko chciało: schemat, kawałek kodu, zdjęcia, opis, subiektywna opinia. Takie mocne 4, ale... Za ten filmik z labiryntem oraz "rozmowę" w tle daję 5! 😃

Pzdr.

Link do komentarza
Share on other sites

Ciekawi mnie też, dlaczego nie odciąłeś składowej stałej z sygnału z fototranzystora? Kondensator i opornik w postaci filtru górnoprzepustowego i miałbyś załatwiony problem z każdorazową kalibracją czujników przy różnym świetle.

Pewnie dlatego, że wszystkie japońskie roboty (które widziałem) nie stosują takiego filtra, więc coś w tym musi być 😉 Jak najszybsza na świecie czołówka MM za każdym razem miga diodami by każdorazowo kalibrować czujniki (odejmują wartość odczytaną przy zgaszonych diodach chwilkę wcześniej lub później) to widocznie tak jest lepiej - ludzie budujący tetrę, min7, eggtorte, excel, czy decimusa siedzą w temacie parę(naście) lat, więc zapewne nie przegapili by takiego błędu jak brak kondensatora 😉 Zakładam, że przetestowali, że bez działa lepiej.

I jeszcze jedno pytanko mam: Skąd pomysł na nazwę? Bo dość nietypowa 😉

Bardzo udanym pomysłem było wyprowadzenie złącza interfejsu UART, który poprzez moduł BT został wykorzystany do bezprzewodowej kontroli myszy w trakcie pisania oprogramowania i pierwszych chwil w labiryncie - bardzo polecam takie rozwiązanie, choć niestety nie da się w ten sposób wizualizować danych w matlabie (po prostu nie da się wykorzystać połączenia COM tworzonego przez BT w komputerze - potwierdzone przez pracownika na forum Matlaba).

A normalny port COM (nie tworzony przez BT) się da? Bo jeśli tak, to możecie użyć wirtualnego portu COM i zrobić przekierowanie - jest sporo takich programów.. więcej info tutaj -> http://en.wikipedia.org/wiki/COM_port_redirector - na dole są linki do programów.

Link do komentarza
Share on other sites

Po 1.

Twoja obsługa enkoderów jest daleka od optymalnej. Masz tyle ifów że głowa boli 😋 średnio wejście w ifa i wyjście z niego + jakaś operacja wewnątrz to są min. 4 operacje asm.

Po 2.

Używasz tryb kwadraturowy enkoderów do czego ta mega nie jest po prostu przystosowana. Po pierwsze przydałoby się zmienić to tak by jak najmniej zewnętrznych przerwań mieć. Więc tryb LSB + DIR jest w tym wypadku najlepszy. Idealne by było podpięcie LSB do wejścia countera ale do tego potrzebne by było co najmniej 4 timery na pokładzie megi (1 do pwm'a na silniki, po 1 na każdy enkoder oraz 1 na mierzenie czasu/pętle regulacji). Ewentualne szybka obsługa przerwań (najlepiej wstawka asm i zmienne rejestrowe) i wtedy juz wystarcza 2 timery.

Po 3.

Na pewno to dobrze liczysz? 500imp/s to strasznie mało. Oba wyjścia kwadraturowe z jednego enkodera dają Ci po 256cpr. Czyli de fakto masz 512cpr a jak policzysz oba zbocza to 1024cpr. Przy przekładni 1:30 to masz ponad 30000cpr. 500imp/s to jest więc obrót o 6 stopni/s 😋 mi przy maksymalnej prędkości wychodzi 512000imp/s z jednego koła więc policz to jeszcze raz 😋

Link do komentarza
Share on other sites

Ciekawi mnie też, dlaczego nie odciąłeś składowej stałej z sygnału z fototranzystora? Kondensator i opornik w postaci filtru górnoprzepustowego i miałbyś załatwiony problem z każdorazową kalibracją czujników przy różnym świetle.

Pewnie dlatego, że wszystkie japońskie roboty (które widziałem) nie stosują takiego filtra, więc coś w tym musi być 😉 Jak najszybsza na świecie czołówka MM za każdym razem miga diodami by każdorazowo kalibrować czujniki (odejmują wartość odczytaną przy zgaszonych diodach chwilkę wcześniej lub później) to widocznie tak jest lepiej - ludzie budujący tetrę, min7, eggtorte, excel, czy decimusa siedzą w temacie parę(naście) lat, więc zapewne nie przegapili by takiego błędu jak brak kondensatora 😉 Zakładam, że przetestowali, że bez działa lepiej.

No właśnie, to założenia. Ja oczywiście nie mówię, że nie należy korzystać z doświadczeń innych, ale jednak sam wolę wszystko wcześniej przetestować, dlatego pytałem autora o motywację takiego a nie innego rozwiązania. Jak testowałem swój czujnik DIY to po bardzo szybkich pomiarach stwierdziłem, że sygnał po filtrze wygląda baaaardzo ładnie, dlatego osobiście wolałbym odciąć składową stałą. Ciekawi mnie co na to autor? 😉

Link do komentarza
Share on other sites

Niestety mam teraz dostęp do internetu tylko przez telefon, a nie chciałbym nikogo pominąć przy odpisywaniu. Dziękuję za wszelkie uwagi, odpowiem na pytania jutro wieczorem, gdy będę już w domu.

Link do komentarza
Share on other sites

Jak chodzi o problem z przerwaniami to może być jeszcze jedna przyczyna.

Podczas przełączania odczytywanego stanu mogą pojawiać się zakłócenia i procesor zamiast jednego impulsu (przerwania) otrzymuje ich całe mnóstwo.

Jeśli masz dostęp do oscyloskopu, proponuję zobaczyć jak wygląda sygnał. Na próbę można też programowo liczyć liczbę wywołań przerwań.

Najprościej jest dodać układ z przerzutnikiem Schmitta, można też po odebraniu przerwania na pewien czas wyłączać detekcję kolejnych przerwań.

Link do komentarza
Share on other sites

No właśnie, to założenia. Ja oczywiście nie mówię, że nie należy korzystać z doświadczeń innych, ale jednak sam wolę wszystko wcześniej przetestować, dlatego pytałem autora o motywację takiego a nie innego rozwiązania. Jak testowałem swój czujnik DIY to po bardzo szybkich pomiarach stwierdziłem, że sygnał po filtrze wygląda baaaardzo ładnie, dlatego osobiście wolałbym odciąć składową stałą. Ciekawi mnie co na to autor? 😉

A widzisz, skoro testowałeś i wypadało bardzo dobrze, to kwestia warta zastanowienia. Swoją drogą na forbocie jest ciekawy wątek poświęcony temu zagadnieniowi, gdzie marek1707, koval oraz kubik udzielają bardzo merytorycznych wypowiedzi:) -> https://www.forbot.pl/forum/topics38/filtr-gornoprzepustowy-w-czujniku-odleglosci-vt7303.htm

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.