Skocz do zawartości

[Inne] - RoMek - worklog


Pomocna odpowiedź

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.

Link do komentarza
Share on other sites

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.

Link do komentarza
Share on other sites

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

Link do komentarza
Share on other sites

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?

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

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.