Kanał - ATNEL tech-forum
Wszystkie działy
Najnowsze wątki



Teraz jest 12 mar 2026, o 00:02


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 7 ] 
Autor Wiadomość
PostNapisane: 31 gru 2013, o 00:41 
Offline
Nowy
Avatar użytkownika

Dołączył(a): 16 lis 2013
Posty: 12
Pomógł: 0

Cześć :)
Ostatnio pracuje nad robotem micromause i przyszedł czas na obsługę enkoderów.
Korzystam z następujących enkoderów:
http://botland.com.pl/enkodery/1879-zes ... ja-5v.html
Oraz napędu:
http://botland.com.pl/high-power-hp/64- ... -50-1.html
Układ przedstawiłem w tym temacie:
topic5296.html

Obecnie staram sie wykorzystać tylko jeden kanał i mierze ilość impulsów jakie docierają do mikrokontrolera.
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Podaje tylko główną cześć programu. Jeśli trzeba to wrzucę cały program.

Poniżej znajduje się filmik przedstawiający wynik programu. Na filmiku silnik zatrzymuje się kolejno dla i_a=150 , 300 i 600 przy takiej samej prędkości obrotowej.
http://www.youtube.com/watch?edit=vd&v=6hb9ShFnpkE

Jak widać nie zatrzymuje się on idealnie w miejscu z którego startował, wygląda jak by gubił pojedyncze kroki. Im szybciej silnik się kreci tym większe są błędy. Próbowałem już różnych sposobów żeby jakoś ten problem rozwiązać.
Ostatnio miedzy innymi próbowałem wykorzystać kod podany przez Sunriver'a w tym temacie: topic817.html,
Zmieniłem timer na TIMER2 dostępny w moim uC oraz definicje pinów na te z których korzystam. Niestety program nie działa, tzn wartość zmiennej val nie zmienia się(sprawdzałem to między innymi po przez wysyłanie informacji na komputer przez rs'a)

Zastanawiam się czym te błędy enkodera mogą być spowodowane i czy da się ten problem rozwiązać programowo.

Dodatkowo jeśli chodzi o sygnał z jakim mam do czynienia to wygląda on następująco:
Sygnał z enkodera
Obrazek
Sygnał po przejściu przez komparator(sygnał który dociera do atmegi)
Obrazek

Mam nadzieje ze nie namieszałem za bardzo i wyjaśniłem w czym problem. W skrócie: enkoder gubi(tak mi się wydaje) kroki, im szybciej się obraca napęd tym więcej kroków gubi.
Z góry dzięki za pomoc i ewentualne wskazówki. :)
Pozdrawiam



Ostatnio edytowano 31 gru 2013, o 17:14 przez Matusso, łącznie edytowano 2 razy

Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 31 gru 2013, o 01:42 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 15 lip 2012
Posty: 203
Lokalizacja: Sosnowiec
Pomógł: 2

Widzę że jesteś ogarnięty, ale może nie zmieniłeś wektora obsługi przerwania ?
"ISR( TIMER0_COMP_vect )"

Lub źle zainicjowałeś timer ?
Chodzi mi o przerobiony kod Suna.

_________________
sig on ;)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 31 gru 2013, o 10:42 
Offline
Nowy
Avatar użytkownika

Dołączył(a): 16 lis 2013
Posty: 12
Pomógł: 0

1bobik1 napisał(a):
Widzę że jesteś ogarnięty, ale może nie zmieniłeś wektora obsługi przerwania ?
"ISR( TIMER0_COMP_vect )"

Lub źle zainicjowałeś timer ?
Chodzi mi o przerobiony kod Suna.

Nie mam teraz dostępu do kodu ale pamiętam że nawet odpaliłem sobie dokumentację do atmegi16( pod tą atmege był program) i wybrałem odpowiedni timer dla atmegi8. Jak znam życie pewnie zrobiłem jakiś prosty błąd w kodzie. Może będzie lepiej jak później wrzucę ten kod



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 31 gru 2013, o 17:10 
Offline
Nowy
Avatar użytkownika

Dołączył(a): 16 lis 2013
Posty: 12
Pomógł: 0

Pełny kod programu:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Dodatkowo dodałem jeszcze definicje wszystkich portów jakie mam na wszelki wypadek.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 31 gru 2013, o 17:33 
Offline
Użytkownik

Dołączył(a): 02 sty 2013
Posty: 35
Pomógł: 1

Kod SunRiver działa idealnie , niema problemów nawet aby mógł pracować z enkoderami które mają 10tyś impulsów na obrót licząc z wszystkimi zboczami


Poniżej zapodaje ci moją wersje testową , bez bajerów ale działającą , nastawy timera dla atmegi 32

Dodałem także odczyt sygnału index (3 kanał enkoder 1 impuls na obrót) którym można sobie sprawdzić ile impulsów ma enkoder na jeden obrót.

Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 2 sty 2014, o 01:19 
Offline
Nowy
Avatar użytkownika

Dołączył(a): 16 lis 2013
Posty: 12
Pomógł: 0

Udało się w końcu odpalić ten kod ale enkoder działa tak jak wcześniej a nawet wydaje mi się ze gorzej, chyba to nie jest problem programowy jednak :(



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 3 sty 2014, o 21:35 
Offline
Nowy
Avatar użytkownika

Dołączył(a): 16 lis 2013
Posty: 12
Pomógł: 0

Chyba udało mi się rozwiązać problem. Powody błędnego działania były dwa:
1. Przełożenie na wale silnika wynosi 51.45:1 a nie jak podane było wcześniej 50:1. Dowiedziałem się o tym po kontakcie z producentem :D
2. Zlekceważyłem sterowanie silnikiem przez co silnik nie zatrzymywał się dokładnie w momencie w którym wysłane zostało do niego polecenie.

Dodałem proste hamowanie przed zatrzymaniem oraz wprowadziłem poprawkę jeśli chodzi o przełożenie i działa zdecydowanie lepiej. Nadal są drobne błędy ale myślę ze jak poprawie sterowanie silnikiem oraz wykorzystam kod SunRiver'a bedzie juz ok. Dzięki za pomoc :)
Pozdrawiam



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
Wyświetl posty nie starsze niż:  Sortuj wg  
Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 7 ] 

Strefa czasowa: UTC + 1


Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników i 2 gości


Nie możesz rozpoczynać nowych wątków
Nie możesz odpowiadać w wątkach
Nie możesz edytować swoich postów
Nie możesz usuwać swoich postów
Nie możesz dodawać załączników

Szukaj:
Skocz do:  
cron
Sitemap
Technologię dostarcza phpBB® Forum Software © phpBB Group phpBB3.PL
phpBB SEO