rezolut Marzec 15, 2012 Autor tematu Udostępnij Marzec 15, 2012 Czy przez podpowiadanie manipulowania z pullupem sugerujesz, że CNY jednak powinien zadziałać? I to z większej niż 0,3mm odległości? I nawet przy zmiennym strumieniu światła na niego padającym? Sprawdziłem transoptor z myszy. Żaden wodotrysk. Też wariuje po oświetleniu go lampką (co ja taki upierdliwy z tą lampką się zrobiłem?). Jedyny plus jaki posiada to to, że tarcza enkodera nie musi być ustawiona w idealnej odległości od czujnika 😉 Tolerancja bić tarczy może być większa niż dataszitowa odległość pracy CNY. Cytuj Link do komentarza Share on other sites More sharing options...
rezolut Marzec 18, 2012 Autor tematu Udostępnij Marzec 18, 2012 Udało mi się w końcu - po 3 dniach bojów - złożyć płytkę z czujnikami enkoderów. Wykorzystałem transoptory z myszki i efekt miło mnie zaskoczył. Czujniki pracują w miarę stabilnie przy różnym oświetleniu z zewnątrz. Piszę "w miarę stabilnie" bo dopiero sprawdziłem, że w ogóle zliczają impulsy z obu kół. Nie jestem na chwilę obecną w stanie sprawdzić jak zliczają te impulsy. Nie umiem po prostu policzyć prędkości dla obu kół niezależnie. Ale się nauczę 😉 Spróbowałem za to wstępnie regulacji, tj. wyrównywania obrotów obu kół. Wyszedłem z założenia, że jeśli koła obracają się równo, w określonym czasie "wykręcą" taką samą ilość impulsów. Jeśli więc wejścia przerwań INT0 i INT1 zliczają impulsy kół i zapisują je do zmiennych, a oprócz tego uruchamiam Timer0, to przy każdym "przekręceniu" licznika timera , czyli w równych (chyba nieważne jakich, byle równych) odstępach czasu porównuję zawartości zmiennych czujników. Jeśli są różne, odpowiednio zwiększam pwm jednego koła i zmniejszam pwm drugiego koła. Nie wiem czy to dobra idea. Dalsze testy w trakcie. Cytuj Link do komentarza Share on other sites More sharing options...
rezolut Marzec 19, 2012 Autor tematu Udostępnij Marzec 19, 2012 Mam pytanie dot. timerów. Właściwie prośbę o potwierdzenie mojego toku myślenia. Czytałem kursy i różne przykłady i nie wiem czy dobrze zrozumiałem. Mam zegar 16Mhz, Timer0 z preskalerem 1024 i przerwanie "On Timer0 przerwanie". Zatem przerwanie będzie wywoływane po przekręceniu licznika, czyli po 255 cyklach. Skoro 1 cykl zegara trwa 64us to: 1) przerwanie będzie wywoływane co 255*64us = 16320us (0,01632 sek)? 2) jeśli w przerwaniu zwiększam zmienną i zadam warunek sprawdzający dla zmiennej = 61, to 61*0,01632 sek = 0,99552 sek, czyli warunek będzie zachodził mniej więcej co 1sek (0,99552 sek dokładnie)? 3) jeśli od warunku do warunku koło wykona powiedzmy 30 impulsów enkodera (dokładnie 30,135 imp/sek) a 6 impulsów daje 1 obrót to prędkość koła będzie wynosić 30,135/6 = 5,02 obr/sek? Tak to się wszystko wylicza? Większą dokładność osiągnę zwiększając ilość pól na tarczy enkodera? Wyliczam różnicę w ilości impulsów w stałych odcinkach czasu i o tę różnicę zwiększam PWM jednego koła i zmniejszam PWM drugiego koła. Im mniejsze odcinki pomiarowe tym mniejsza powinna być krzywa po jakiej porusza się pojazd. Ale im mniejsze odcinki pomiarowe tym mniejsza dokładność pomiaru - tzn. mniejsza różnica impulsów. Należałoby zwiększać rozdzielczość enkoderów zmniejszając odcinki pomiarowe, ale wszystko ma swoje granice - jak myślę, będzie nią czas reakcji transoptora. Nie wiem czy prawidłowo kombinuję. Cytuj Link do komentarza Share on other sites More sharing options...
rezolut Marzec 22, 2012 Autor tematu Udostępnij Marzec 22, 2012 Czas na mały update filmowy: Tak mniej więcej wyglądają moje enkodery kół. Spory odstęp (zachowałem ~7mm odstęp, jak w oryginalnej myszce) między diodą a fototranzystorem sprawia, że istnieje pewna tolerancja bicia tarczy kodowej, co przy czujnikach odbiciowych by nie przeszło. Martwi mnie jednak ciągła podatność na światło zewnętrzne. Póki co trwają testy oprogramowania prostoliniowej jazdy robota. Idea jest taka, że przerwania INT0 i INT1 zwiększają liczniki Enkoder_lewy: Incr Czujnik_lewy : Incr Czl Return A przerwanie zegara co stały, określony czas porównuje liczniki Impuls: Disable Interrupts Incr Czas If Czas = 20 Then Roznica_czujnikow = Czujnik_lewy - Czujnik_prawy Locate 1 , 1 : Lcd "L: " ; Pind.2 ; " " ; Czujnik_lewy ; " " ; Pwm1b ; " " Locate 2 , 1 : Lcd "P: " ; Pind.3 ; " " ; Czujnik_prawy ; " " ; Pwm1a ; " " ; Roznica_czujnikow ; " " If Roznica_czujnikow > 1 Then 'lewy kreci szybciej Pwm1b = Pwm1b - 2 'zwalniamy lewy Pwm1a = Pwm1a + 2 'przyspieszamy prawy End If If Roznica_czujnikow < -1 Then 'prawy kręci szybciej Pwm1a = Pwm1a - 2 'zwalniamy prawy Pwm1b = Pwm1b + 2 'przyspieszamy lewy End If If Pwm1a < 100 Then Pwm1a = 100 'nie schodzimy poniżej pewnej prędkości If Pwm1b < 100 Then Pwm1b = 100 Czujnik_prawy = 0 Czujnik_lewy = 0 Czas = 0 End If Enable Interrupts Return Nie wiem, czy taka idea jest dobra. Co fachowcy na to? Cytuj Link do komentarza Share on other sites More sharing options...
Polecacz 101 Zarejestruj się lub zaloguj, aby ukryć tę reklamę. Zarejestruj się lub zaloguj, aby ukryć tę reklamę. 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
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!