Skocz do zawartości

Zaprogramowanie 4 serwomechanizmów


adrian

Pomocna odpowiedź

Witam, już jakiś czas temu zacząłem szukać programów do obsługi kilku serw, po ich przetestowaniu i przeróbce na swoje wymagania nigdy nie uzyskałem zadowalających efektów,
a teraz powiem o co mi chodzi, mianowicie chcę napisać program do obsługi 4 serw i teraz pytanko do Was w jaki sposób to najlepiej uzyskać? Z racji iż posiadą atmege 8 wiem że musi to być programowo, chyba że zmniejszyłbym ilość serw do 3 to wtedy sprzętowo, ale w każdym rodzaju nie umiem uzyskać efektu tak by gdy jedno serwo przejdzie np z pozycji 0 do pozycji 90 drugie gdy pierwsze osiagnie 90 st wychylilo sie o 45 i wtedy trzecie serwo porusza się tez np o 90 stopni i na koncu czwarte o jakis dowolny kat, robiac to na przerwaniach serwa zaczynały się poruszac w roznych momentach, a gdy już jedno uzaleznilem od drugiego to pojawialo sie drganie,
w zwiazku z tym pytanie do bardziej doświadczonych w jaki sposób tak po krótce uzyskać sterowanie 3-4 serwami tak by działały zaraz po sobie (nie razem)?

Link do komentarza
Share on other sites

1. Generowanie sygnałów do serw musisz mieć na przerwaniach.

Ponieważ do serwa co ~20ms należy przesłać sygnał o długości ~1-2ms to cały proces może wyglądać tak:

a) generujesz sygnał dla serwa 1 o czasie x1, następnie dopełniasz czas pozostały do 5ms

b) to samo dla serwa 2,3,4 o czasie x2,x3,x4

W ten sposób co 20ms masz z automatu wygenerowaną pozycję serwa.

2. Samo ustalanie pozycji robisz w programie głównym korzystając z jakiegoś licznika czasu. wnajprostszym przykładzie może to być coś w stylu

//ustawienia pozycji to czas, 1500=1,5ms i zakładam, że jest to pozycja środkowa, odp. 1000-2000 to pozycje skrajne, w praktyce musisz to sprawdzić dla każdego serwa (albo przynajmniej dla jednego z tych serw jak masz ten sam typ)

while(1)
{
//poz poczatkowa
x1 = 1500 ; x2 = 1500 ; x3 = 1500 ; x4 = 1500 ;
delayms ( 1000 ) ; // czekanie
x1 = 2000 ;
delayms ( 250 ) ; // czekanie az serwo 1 obroci sie o 90st
x2 = 1750 ;
delayms ( 150 ) ; // czekanie az serwo 2 obroci sie o 45st
x3 = 2000 ;
x4 = 1000 ;
delayms ( 250 ) ; // serwo 3 w prawo o 90st, serwo 4 w lewo o 90 st
}

Jak w tle działają przerwania i ustawiają serwa na pozycję x1/x2/x3/x4 , to program główny będzie w odpowiednich momentach generował sygnał do ruszenia serwami. Oczywiście zmienne x1/x2/x3/x4 muszą być typu volatile...

  • Lubię! 1
Link do komentarza
Share on other sites

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!

Anonim
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.

×
×
  • 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.