Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

Sterowanie serwomechanizmem z wykorzystaniem atmegi32 [C]

skyline11 21 Kwi 2013 23:07 5745 41
  • #31 21 Kwi 2013 23:07
    atom1477
    Poziom 43  

    skyline11 napisał:
    1Mhz, sprawdzałem w AVR studio, też mam ustawione 1Mhz. Tak przy okazji, przy podaniu krótszego impulsu niż 1,5ms serwo powinno obrócić się o dany kąt i się zatrzymać?

    Mylisz pojęcia albo przynajmniej sprawiasz takie wrażenie.
    Impulsy sterujące nie służą do wyznaczania kąta obrotu serwa. Ani kierunku obrotu. Ani prędkości obrotu.
    Choć oczywiście serwo obróci się, w którąś stronę, o jakiś kąt, i z jakąś prędkością.
    Ale to będzie efekt wtórny.
    Impulsy natomiast bezpośrednio służą do ustalenia kąta położenia.
    Kierunek obrotu zależy więc nie od długości impulsu a od różnicy pomiędzy starym a nowym położeniem (czyli można napisać że zależy od różnicy pomiędzy starym a nowym impulsem). Kąt oczywiście tak samo.
    Prędkość w zasadzie nie zależy od impulsów (i ich różnicy) i serwo zawsze chce mieć maksymalną. Jedynie przy małych przemieszczeniach będzie mniejsza bo serwo nie zdąży się rozprędzić bo od razu osiągnie zadaną pozycję.
    Tak więc ostatecznie po podanym przez Ciebie czasie 1,5ms nie można nic powiedzieć. Może serwo się poruszy, a może nie (jeżeli wcześniej też dostawało 1,5ms to się nie poruszy).

  • #32 21 Kwi 2013 23:21
    skyline11
    Poziom 11  

    Sęk w tym, że w moim przypadku po podaniu nie ważne czy 1,5ms czy 1,3ms czy 2,0ms serwo powinno udać się do jakiegoś położenia, a potem się nie ruszać. U mnie osiąga położenie maksymalne i nie zatrzymuje się, silnik nadal pracuje. Jak uzyskać minimalny obrót serwomechanizmu, aby obrócił się np o 1 stopień i się zatrzymał? Czy jest możliwość, że w moim przypadku impulsy sterujące nie będą wynosiły 1-2ms a np 0,5-1,5 ms?

  • #33 22 Kwi 2013 08:01
    BlueDraco
    Specjalista - Mikrokontrolery

    Typowo serwo działa od 1 do 2 ms, niektóre mają szerszy zakres, ale centrowany na 1.5 ms. To, że serwo się nie zatrzymuje, źle rokuje.

  • #34 23 Kwi 2013 09:21
    n6210
    Poziom 15  

    Po prostu upewnij się, że to co podajesz na wejście sygnałowe serwa to impulsy stałej szerokości ze wspomnianego zakresu i powtarzane co 20 ms. Jeżeli w tych warunkach serwo się nie zatrzymuje to jest uszkodzone. Ewentualnie przetestuj serwo u kogoś z radiem modelarskim lub zrób prymitywny tester serw np. na ATTiny13. Jak coś to mam działający kod/wsad do takiego testera. Potrzeba jedynie ATTiny13 i 3+2 goldpiny.

  • #35 23 Kwi 2013 11:13
    skyline11
    Poziom 11  

    Postanowiłem wziąć sprawę totalnie w moje ręce i pokombinować. Zrobiłem to trochę po chamsku ale działa :D

    Kod: c
    Zaloguj się, aby zobaczyć kod


    Kod jak widać dużo nie różni się od poprzedniego, zamieściłem tu tylko istotną część. Z tego co "zbadałem" zakres ruchu serwa, który potrzebuje mieści się u mnie w przedziale 1.65ms-2.35ms, jednak mam taki problem, że serwo sobie płynnie się obraca i nagle przeskakuje, za chwilę znowu i tak się obraca i co chwila skacze. Co może być tego powodem?

  • #36 23 Kwi 2013 11:44
    BlueDraco
    Specjalista - Mikrokontrolery

    Jeśli już musisz robić to źle, tzn. z delay, to przynajmniej zwiększ ten delay do min. 20 ms.

    Jaka jest początkowa wartość OCR1A?

    Obecnie każesz mu przyjąć wartość 1650 i w zasadzie już nic innego nie robisz.

  • #37 23 Kwi 2013 12:40
    skyline11
    Poziom 11  

    Lepiej wstawię cały kod, żeby lepiej wytłumaczyć:

    Kod: c
    Zaloguj się, aby zobaczyć kod


    Delay jest ustawione na 2ms, bo to jest opóźnienie, po jakim wartość rejestru OCR1A zwiększa się o 1 (a więc i długość impulsu zmienia się o 1us), resztę widać w kodzie. Jeżeli chciałbym zastąpić funkcję delay timerem, to muszę korzystać z timera0 lub timera2 czy jest jakaś możliwość skorzystać jeszcze z timera1 (pracuje on już w trybie fast pwm)?

  • #38 23 Kwi 2013 13:10
    BlueDraco
    Specjalista - Mikrokontrolery

    1. Wyrzuć grupy kolejnych pustych linii - tego się nie daje czytać. Ponad połowa programu to puste linie.
    2. Konsekwentnie najpierw uruchamiasz timer, a potem go programujesz (tryb, okres) - bez sensu.
    3. Próbujesz zmieniać wartość OCR1A ok. 25 razy w jednym okresie przebiegu sterującego serwem, co oznacza, że z okresu na okres zmienia się ona o ok. 25, czyli cały zakres zmian zawiera tylko 28 kroków.
    4. Dalszych problemów szukaj w tym, jak zmieniasz stan linii portu. Spróbuj napisać program, w którym kierunek ruchu serwa zależy tylko od jednej linii, a nie od czterech (czyli wartości stanp 0 i 1, a nie 7 i 8) - jak już to zadziała, rozwijaj kod i sterowanie. Na razie wygląda na to, sam sobie strzelasz w stopę komplikując sterowanie i kod.

  • #39 23 Kwi 2013 13:34
    skyline11
    Poziom 11  

    Podczas gdy czekałem na odpowiedź, postanowiłem napisać ten program z wykorzystaniem timera0:

    Kod: c
    Zaloguj się, aby zobaczyć kod


    Dodam, że serwo też skacze jak poprzednio, ale o wiele mniej czyli jest jakiś postęp.

    @BlueDraco

    1. Puste linie usunięte - teraz program powinien być bardziej czytelny.

    2. Tak, uruchamiam timer a potem go programuję, dlaczego? A no dlatego żeby po wciśnięciu przycisku pojawiał się odpowiedni sygnał a po puszczeniu na wyjściu nie było żadnego sygnału. Nie widzę innej możliwości włączania i wyłączania wyjścia OC1A/OC1B w inny sposób niż za pomocą konfiguracji bitów (1<<COM1A1)|(1<<COM1B1).

    3. Wiem widzę błąd, zaraz będę nad nim pracować, tylko chcę się jeszcze upewnić: moim zdaniem jeżeli okres wynosi 20ms a ja zwiększam licznik do 2ms to teoretycznie zmieniam wartość licznika o 10 a nie o 25 jak napisałeś. Ale szczerze czy to coś zmieni jeżeli co 20ms będę zmieniał wartość rejestru OCR1A o wartość 10? Przydało by się jeszcze tak zrobić, aby przerwanie zostało wywoływane gdy ICR1 = 20000. Jest to możliwe w trybie fast PWM?

    4. Sprawdzałem i bez różnicy jest serwomechanizmowi czy korzystam z jednej linii czy z kilku, a mi tak bardziej pasuje bo sterowanie serwem jest częścią większego projektu, którego nie mogę niestety opublikować.


    EDIT: Działa :D Zrobiłem tak jak mówiliście, zaprogramowałem timer raz a dobrze - nie zrobiłem tego wcześniej, bo chciałem aby serwo się zatrzymywał - chciałem to osiągnąć wyłączając timer a przecież serwo dochodzi do pozycji i samo się zatrzymuje :P Teraz mam inny problem, a mianowicie serwo siedzi w chwytaku, który coś zaciska. Problem jest taki że jak złapie przedmiot serwo nadal działa (próbuje dojść do ustalonej pozycji). Czy jest możliwe zrobić w jakiś sposób, aby np. jeżeli serwo w czasie sekundy nie dotrze na swoją pozycję to zostaje na tej co jest obecnie?

  • #40 24 Kwi 2013 09:59
    n6210
    Poziom 15  

    Wydaje mi się, że to nie takie proste bez modyfikacji samego serwa i/lub dodaniu czujnika "dotyku".

    Najprostsze co przychodzi do głowy to płynna zmiana pozycji z monitorowaniem prądu pobieranego przez serwo. Trzeba by znać jaki prąd pobiera serwo gdy dotrze do pozycji zablokowanej. Wtedy np. przestawiasz serwo powiedzmy o jakiś niewielki kąt i sprawdzasz czy nie pobiera wspomnianego prądu, jeżeli nie to znów przestawienie itd.
    Gdy wykryjesz prąd zablokowania to znaczy, że dotarłeś do końca i cofasz serwo o jedną pozycję. Nie polecam wyłączania zasilania serwa całkowicie bo wtedy przestaje ono trzymać pozycję.
    Pamiętać też warto, że serwo ma określoną "siłę" więc nie ma co liczyć że tego typu sterowanie będzie "delikatne" :)

  • #41 24 Kwi 2013 11:37
    dondu
    Moderator Mikrokontrolery Projektowanie

    skyline11 napisał:
    Teraz mam inny problem, a mianowicie serwo siedzi w chwytaku, który coś zaciska. Problem jest taki że jak złapie przedmiot serwo nadal działa (próbuje dojść do ustalonej pozycji). Czy jest możliwe zrobić w jakiś sposób, aby np. jeżeli serwo w czasie sekundy nie dotrze na swoją pozycję to zostaje na tej co jest obecnie?

    Tak jak wspomniał kolega wyżej - czujnik siły dotyku przez pomiar prądu serwa i gdy gwałtownie wzrasta, to oznacza, że napotkał opór. Takie rozwiązania stosuje się na przykład przy zamykaniu szyb w samochodach.

    Innym rozwiązaniem, jest odpowiednia konstrukcja chwytaka. Tutaj stosuje się nawet pneumatyczne metody wykrywania siły nacisku.

  • #42 25 Kwi 2013 22:47
    skyline11
    Poziom 11  

    Aha, czyli w moim przypadku nie do zrealizowania. Dziękuję za odpowiedź, temat do zamknięcia.