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



Teraz jest 30 mar 2026, o 19:59


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 7 ] 
Autor Wiadomość
PostNapisane: 14 lis 2013, o 03:51 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 27 maja 2013
Posty: 562
Lokalizacja: Bydgoszcz
Pomógł: 23

Chciałbym poradzić się czy jest możliwe, jak to zrobić by opóźnić inkrementację i dekrementację, albo po prostu czegoś nie wiem, nie douczyłem się lub robię nie tak.

Mianowicie chodzi o sterowanie serwomechanizmem za pomocą potencjometru.

może najpierw fragment kodu i później pokrótce wyjaśnienie.

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


Odczytuję stan potencjometru przez ADC i na jego podstawie zwiększam lub zmniejszam zmienną "s" co za tym idzie stan rejestru OCR1A dzięki czemu obraca mi się serwomechanizm w lewo lub prawo. Kiedy używałem do tego klawiszy zarówno w wersji liniowego programowania jak _delay_ms lub za pomocą SuperDebounce to wszystko ładnie pięknie ze spokojem się obracało nawet zwiększałem wartość inkkrementacji np. "s+=5;" by kręciło się szybciej.
Procesor to Atmega32 z zegarem 16Mhz do generowania przebiegu prostokątnego używam Taimer1 obecnie w trybie Fast PWM mod 14. preskaler 64.

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


Serwo ładnie pracuje nie drga, kręci się płynnie elegancko, tylko po prostu za szybko. Podglądam sobie tą zmienną na LCD jak i przebieg na oscyloskopie, kiedy używam
klawiszy jest ok ładnie spokojnie a kiedy potencjometru to bardzo szybko tzw. "pędzikiem" zmienia się jej stan, normalnie Turbo Express :)
Robiłem już różne ustawienia preskalera ale inkrementacja i dekrementacja za pomocą potencjometru jest tak samo szybka nie zauważyłem żeby znacząco zwolniła.

Może trzeba napisać jakąś funkcje, warunek opóźniający inkrementację i dekrementację? Albo w ogóle rozwiązać to inaczej, napisać. Zastanawiałem się nad % modulo i zegarem ale pozostałe dwa timery są wykorzystane również jeden do obsługi enkodera a drugi serw programowych.

Docelowo bym chciał zrobić tak, że kiedy wychylenie potencjometru jest mocniejsze (jego wartość wyższa) to ma się zmienna inkrementować o więcej przez co serwomechanizm szybciej kręcić. No ale najpierw muszę opanować to opóźnienie.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 14 lis 2013, o 11:10 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 27 maja 2013
Posty: 562
Lokalizacja: Bydgoszcz
Pomógł: 23

No bo to dokładnie jest joystick :)

Obrazek


no _delay_ms odpada bo zawiesza cały program/procesor i szarpie serwami.

jak pisałem wcześniej Timer 0 i Timer 2 mam również w użyciu. 1 na obsługę enkoderów, a drugi dla pozostałych serw programowych.

Efekt jaki bym chciał uzyskać to taki:

http://www.youtube.com/watch?feature=player_detailpage&v=FKj9jJgj8Pc

A to w przyszłości :)
http://www.youtube.com/watch?v=zZwnyZPkylk



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 14 lis 2013, o 12:12 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 22 paź 2013
Posty: 1988
Lokalizacja: Lipsko
Pomógł: 125

Ja coś podobnego u siebie w sterowniku zrobiłem na "doganiającej" zmiennej czyli: bierzemy dodatkową zmienną, która będzie główną sterującą serwem, ale jej wartość będzie się zmieniać płynnie w czasie określonym przez jakiś timer programowy doganiając wartość odczytaną z ADC. Nie wiem jak to prościej wytłumaczyć, ale obrazowo chodzi mniej więcej o coś takiego:

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


W takim przypadku żeby nie wiem jak skrajnie zmieniały się wartości na ADC to zmienna doganiająca zawsze będzie płynnie narastać do tej wartości i aktualizować stan serwa.
"timer" to oczywiście timer programowy w przerwaniach typu: If (timer) timer--;

EDIT:
Na tym filmie troszkę widać ideę takiego sterowania - też ADC z potencjometru tylko przekazywanie do silnika krokowego. Musiało tu być doganianie bo inaczej przy zbyt gwałtownych zmianach silnik by gubił kroki.
http://www.youtube.com/watch?v=sBLOafyeoyU

_________________
http://www.sylwekkuna.com



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 14 lis 2013, o 19:52 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 27 maja 2013
Posty: 562
Lokalizacja: Bydgoszcz
Pomógł: 23

GwynBleidD no nie mam zużyłem ;)

1. Timer 0 - obsługa enkoderów
2. Timer 1 - Fast PWM dla serwa MG995 - bo się telepie na programowym, potwierdzone w rozmowie z SunRiver że ten typ tak ma
3. Timer 2 - pozostałe serwa sterowane programowo firmy DGS.

Po różnych rozmowach i przemyśleniach miałem dziś pomysł żeby przepisywać wartość z potencjometru bezpośrednio do rejestru OCRA
dokonując jakby w locie konwersji za pomocą wzoru. Wymyśliłem coś takiego ale to nie działa:

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


Owszem wartości są zmieniane ale trzeba wziąć pod uwagę że potencjometr joystick`a ma w stanie środkowym wartość 500 i tak naprawdę serwo drga, oglądając przebieg to lekko się wychyla w prawo i wraca, wartość rejestru OCRA w lewo przyjmuje 170 a w prawo 185. Także porażka.

Zostaje mi kilka rozwiązań:
1. zmienić serwo na DSG, które nie drga na PWM programowym.
2. zrezygnować z Joysticka i zrobić wszystko na enkoderach.
3. Spróbować jakoś wcisnąć ten Timer programowy i zrobić to o czym pisze kolega SylwekK
4. Szukać dalszego rozwiązania.

Z ciekawości jak się zacząłem dowiadywać więcej dziś o Joystick`u to doszedłem do tego że jest on taki sam albo bardzo podobny jak w padzie od konsoli XBOX360 :)

http://www.instructables.com/id/How-to- ... n-an-XBOX/

Tu dodatkowe informacje skąd to mam:
https://www.sparkfun.com/products/9032



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 14 lis 2013, o 20:58 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 27 maja 2013
Posty: 562
Lokalizacja: Bydgoszcz
Pomógł: 23

Uwaga mały przełom!!

Po rozmowie z kolegą Krauser, który spostrzegł że wartość wg. mojego wzoru przekracza zakres liczby uint16_t i jego zaleceniach został zmodyfikowany lekko mój kod o UL

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


No i teraz pięknie się serwo obraca zgodnie z kierunkami Joysticka, ba nawet jest jakby zależność o jakiej marzyłem czyli szybciej i wolniej w lewo prawo no ale niestety....
życie to nie bajka i pojawił się nowy problem, potencjometr Joysticka w pozycji środkowej ma wartość 500 i za każdym razem jak wraca do pozycji to tak ustawia serwo.

No więc pytanie jak to obejść? Bo nawet jak bym "oifował" że ma nie brać wartości 500 pod uwagę to i tak będzie się ustawiało wg. ostatniej pozycji do powrotu.

Przy takim zwykłym potencjometrze działa wszystko ok wręcz elegancko.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 14 lis 2013, o 21:26 
Offline
Użytkownik

Dołączył(a): 05 lut 2013
Posty: 302
Pomógł: 19

A moze by tak: jesli wartosc rosnie od 500 (lub maleje) to wychylac serwo w jedna ze stron. A jak maleje od max do 500 to nic nie robic. Tak samo nic nie robic jak bedzie roslo od 0 do 500. Zakladam ze joystick dziala tak ze w neutralnym polozeniu ma wartosc 500 a w skrajnych 0 i 1000.

Wysłane z mojego GT-I9300 przy użyciu Tapatalka



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 15 lis 2013, o 03:13 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 27 maja 2013
Posty: 562
Lokalizacja: Bydgoszcz
Pomógł: 23

No więc za namową SunRiver zrobiłem coś prostego, mianowicie można by to nazwać free running mode i lock, czyli po prostu za pomocą guzika wyłączam pomiar ADC nie zadawała mnie to tak do końca no ale może być.



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  
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 1 gość


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