Treker (Damian Szymański) Napisano Wrzesień 18, 2011 Udostępnij Napisano Wrzesień 18, 2011 Testując micromouse sporym problemem okazała się jazda po prostej na podstawie enkoderów. Mimo dość dobrej dokładności, to algorytm, który co określony czas porównuje ilość odczytów z enkoderów w danym przedziale czasu i koryguje PWM o stałą wartość w dół lub w górę nie daje zbyt dobrych efektów - pewnie jest to kwestia regulacji. Jednak na pewno można to zrealizować jakoś inaczej. Co możecie ciekawego doradzić? Nie pytam o konkretne kody, tylko o samą zasadę działania. Cytuj Link do komentarza Share on other sites More sharing options...
Naelektryzowany Wrzesień 18, 2011 Udostępnij Wrzesień 18, 2011 Robiąc namiastkę licznika rowerowego, prędkość mierzyłem na podstawie czasu obrotu koła. Może i w mm to by się sprawdziło. coś w podobie: lewy silnik 12ms/obr., prawy 18ms/obr -> przyspiesz prawy, spowolnij lewy Lewy 15ms/obr, prawy 15ms/obr -> zostań przy nastawach można by to też bardziej skomplikować dodając choćby regulator P dla lepszej kontroli. Cytuj Link do komentarza Share on other sites More sharing options...
Barto Wrzesień 18, 2011 Udostępnij Wrzesień 18, 2011 Ogólnie myślę , że warto w całym torze byłoby wyróżnić parę elementów, które mają znaczenie: ->silniki (nieidentyczne charakterystyki V=f(U),bezwładność)->przyczepność (przy niewielkich różnicach prędkości i w ogóle nie wielkich prędkościach myślę do pominięcia)-> enkodery (przede wszystkim sposób odczytu)->zaimplementowany regulator (struktura,nastawy,czas przeliczania)->do początku i przeanalizować każdy z osobna. Jeżeli chcesz, aby to dokładnie działało to naprawdę przydadzą się jakieś sensowne pomiary. Sprawdź w czasie jak wygląda sterowanie, reakcja na silnikach, same obliczenia. Niestety 8bitowce wg nie nadają się do jakichkolwiek bardziej złożonej arytmetyki wykraczającej poza typy 1 bajtowe (- taka moja opinia, z resztą ostatnio się z tym zmagam). Poza tym duży wpływ ma też czas głównej pętli sterowania (powiedzmy czas odświeżania). Warto zapewnić jego stałą wartość, aby wyeliminować chociaż tą zmienną. Enkodery inkrementalne najprościej wrzucić na zewnętrzne przerwania proca. Polecam, bo bardzo wygodna sprawa, nic nie zgubisz. Odnośnie nieidentycznych silników- robot jeździ prosto przy jednakowym wysterowaniu? Ostatnio się spotkałem z zauważalnie dużą różnicą prędkości pomiędzy pololu 30:1 w lewo/prawo a pololu 30:1 z przedłużoną osią prawo/lewo, ale z braku dokładniejszych pomiarów nikomu niczego nie zarzucam. Cytuj Link do komentarza Share on other sites More sharing options...
mog123 Wrzesień 18, 2011 Udostępnij Wrzesień 18, 2011 A robiłeś regulator PWM na same silniki, czy tylko do sterowania prędkością poruszania robota? Zrób tak, walnij pomiary z enkodera przy zadanym PWM (jeden silnik w lewo, drugi w prawo) i oblicz transmitancje każdego z silników. Następnie na podstawie metody ziglera nicholsa (z odpowiedzi skokowej) wrzuc nastawy i steruj PWM każdego silnika z osobna opierając się o pomiary z enkoderów. W ten sposób powinienes zapewnic jazdę po prostej. PD powinien starczyć do tego zadania. 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
Barto Wrzesień 18, 2011 Udostępnij Wrzesień 18, 2011 Ach, padło słowo "transmitancja" to się nie mogłem opanować 😋. Podrzucam link, który obrazuje całkiem nieźle problem elektryczno-mechaniczny samego silnika: Modelowanie silnika. Wiem, że to zionie teorią, ale sam jestem obecnie na etapie wdrażania tego typu teorii w praktyce i na pewnym poziomie sterowania/zaawansowania nie da się tego obejść. Polecam przede wszystkim stronę 13 gdzie jest pokazane jak wygląda faktycznie prędkość obrotowa w funkcji napięcia. Przy tej częstotliwości i parametrach silnika to oczywiście żadna modulacja szerokością impulsu. W praktyce załączam własny wykres z fizycznej konstrukcji, która powstaje 🙂. Cytuj Link do komentarza Share on other sites More sharing options...
mog123 Wrzesień 19, 2011 Udostępnij Wrzesień 19, 2011 zapominasz że to co robisz, wymaga dużej informacji o stosowanych silnikach 😉 Cytuj Link do komentarza Share on other sites More sharing options...
dondu Wrzesień 19, 2011 Udostępnij Wrzesień 19, 2011 Testując micromouse sporym problemem okazała się jazda po prostej na podstawie enkoderów. Mimo dość dobrej dokładności, to algorytm, który co określony czas porównuje ilość odczytów z enkoderów w danym przedziale czasu i koryguje PWM o stałą wartość w dół lub w górę nie daje zbyt dobrych efektów - pewnie jest to kwestia regulacji. Z ciekawości: 1. Ile impulsów dają Ci enkodery na jeden pełen obrót koła? 2. Jaki jest obwód koła? Cytuj Link do komentarza Share on other sites More sharing options...
MirekCz Wrzesień 19, 2011 Udostępnij Wrzesień 19, 2011 A jak to robiłeś? Powinieneś zastosować PIDa opartego o różnicę prędkości. Ważne, żebyś jak najszybciej informował regulator o aktualnej prędkości. Idealnie byłoby mierzyć czas jednego/kilku impulsów i to podawać do regulatora. Ważne tylko, żeby enkoder miał odpowiednio dużą ilość kroków, bo inaczej będzie to słabo działać. Cytuj Link do komentarza Share on other sites More sharing options...
Treker (Damian Szymański) Wrzesień 19, 2011 Autor tematu Udostępnij Wrzesień 19, 2011 Testowałem różne enkodery od 30 do 120 impulsów na obrót. Jednak z powodu dość prowizorycznego charakteru konstrukcji ustaliłem ostatecznie, że dobrze działa wersja z 90 impulsami na obrót. Koło to standardowe Pololu 32mm. Aktualnie w kodzie mam coś na zasadzie, jeśli koło prawe szybsze to przyspieszamy lewe a prawe zwalniamy i odwrotnie. Testowałem przy porównaniach co 50, 100, 150 impulsów z enkodera, jednak z tego co piszesz Mirku powinienem robić to częściej. Wcześniejszy posty przeczytam później, bo nie miałem jeszcze czasu - ostatnio koduje coś nowego na Forbot'a 😉 Cytuj Link do komentarza Share on other sites More sharing options...
nanab Wrzesień 19, 2011 Udostępnij Wrzesień 19, 2011 A nie lepiej było by odwrotnie? Tzn. nie mierzyć ile impulsów będzie w danym czasie, tylko mierzyć czas między impulsami? Cytuj Link do komentarza Share on other sites More sharing options...
mog123 Wrzesień 19, 2011 Udostępnij Wrzesień 19, 2011 nie, bo uzyskanie prędkości wymaga więcej obliczeń. Cytuj Link do komentarza Share on other sites More sharing options...
MirekCz Wrzesień 20, 2011 Udostępnij Wrzesień 20, 2011 Damian, skoro masz 90imp/obrót, a mierzysz co 100 impulsów to znaczy, że przejedziesz ok. 10cm zanim dokonasz jednego kroku PIDa. To oczywiście nie może dobrze działać 🙂 Idealnie byłoby mierzyć czas kilku impulsów, tak, żeby przynajmniej kilkanaście razy na sekundę przeliczać PIDa - optymalnie powinieneś przeliczać go kilkadziesiąt razy na sekundę. PS. Bezwzględnie należy mierzyć czas między impulsami, bo pomiar impulsów w czasie jest obarczony olbrzymim błędem. Jak średnio w czasie mieściłoby się nam 10 impulsów, to przypadek +/-1 impuls powoduje ~10% błędu. Jak mierzysz czas między np. 5 impulsami to masz idealnie 10000us, 10001us itd - to dopiero pozwala zastosować rozsądną regulację, bo masz dużą rozdzielczość wyników. Cytuj Link do komentarza Share on other sites More sharing options...
mog123 Wrzesień 20, 2011 Udostępnij Wrzesień 20, 2011 wg. mnie powinno to być na zasadzie: tworzysz sobie strukture czas, w niej zapodajesz us, ms, s, min, h. wszystko oparte o przerwania. i co 10 ms zliczasz impulsy i zerujesz ich stan by zliczało na nowo i na podstawie tego, uzyskasz wykres taki jak wrzucił kolega powyżej. Na tym już można działać. Cytuj Link do komentarza Share on other sites More sharing options...
Treker (Damian Szymański) Wrzesień 20, 2011 Autor tematu Udostępnij Wrzesień 20, 2011 Damian, skoro masz 90imp/obrót, a mierzysz co 100 impulsów to znaczy, że przejedziesz ok. 10cm zanim dokonasz jednego kroku PIDa. To oczywiście nie może dobrze działać 🙂 Testowałem różne ustawienia dwa dniu, by coś wariowało - a na końcu dopiero się okazało, że wina jednej tarczy enkodera była, że działy się cuda. Przez to właśnie próbowałem z rzadszym sprawdzaniem stanu enkoderów i mocniej reagować, ale nie dawało to specjalnych efektów. Filmik, który zamieściłem powyżej bazował właśnie na sprawdzaniu co 100 i porównywanie (tylko wtedy były też inne enkodery). Ogólnie tak jak mówiłem, w tej chwili sprawdzam warunek prędkość co kilka impulsów z enkodera (obojętnie, z którego). Spróbuję w takim razie przepisać soft tak, aby sprawdzał wartości co stały odstęp czasu i wtedy zmieniał stan silników. Cytuj Link do komentarza Share on other sites More sharing options...
GAndaLF Wrzesień 20, 2011 Udostępnij Wrzesień 20, 2011 Własnych testów dotyczących enkoderów i sterowania silnikami PWMem jeszcze nie robiłem, więc mogę się mylić albo to co tu napiszę może nie mieć żadnego znaczenia. Jednak mam wrażenie, że w dywagacjach na ten temat jeden element jest często zapominany. Układ regulacji powinien podawać sygnał na silniki i w sprzężeniu zwrotnym od enkoderów modyfikować ten sygnał w następnym kroku zgodnie z ideą PIDa. Jednak w mikrokontrolerze PWM działa z wcześniej zdefiniowaną częstotliwością i zgodnie z datasheetem modyfikacje wypełnienia zachodzą dopiero po zakończeniu pełnego cyklu. Tak więc ustawienie okresu próbkowania tego układu na czas krótszy niż okres PWMa nie ma sensu bo zmiany i tak nie mogą zachodzić częściej. 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!