Sterowanie serwomechanizmem

 

Serwomechanizm modelarski, to bardzo praktyczny element, umożliwia ustawienie jakiego elementu na określonej pozycji. Serwomechanizmy steruje się poprzez impulsy podawane z określana częstotliwością (50Hz). Czas tych impulsów powinien się mieścić w zakresie od 1,5ms do 2,5 mili sekundy, a zależnie od tego czasu serwo ustawia się pod odpowiednim kątem i utrzymuje tą pozycje aż do zmiany sygnału.

Wiemy już jakie parametry ma spełniać sygnał, przypomina on trochę sygnał ze zmodulowanym współczynnikiem wypełnienia, czyli pwm. Można by bez problemu wykorzystać pwm do takiego sterowania, ale w trybie 14 licznika pierwszego, gdzie to maksymalna wartość dla licznika jest określana poprzez rejestr ICR1, a czas impulsu na wyjściu określa nam rejestr OCR1A oraz OCR1B (zależnie od wyjścia). W ten sposób otrzymujemy dokładnie wyregulowaną częstotliwość, oraz wypełnienie. Szczegóły na temat licznika można przeczytać TUTAJ.

Poniżej przedstawiam prosty program służący do sterowania serwem.

#define F_CPU 1000000
#include <avr/io.h>

int main()
{ 
   DDRA = 0xff; //konfiguracja portow  
   //tryb pracy licznika(15), ustawienie prescalera na 1,

   TCCR1A = (1<<COM1A1)|(1<<COM1B1)|(1<<WGM11);  
   //ustawienie wyjścia z licznika

   TCCR1B = (1<<CS10)|(1<<WGM12)|(1<<WGM13); 
   ICR1 = 20000; //ustawienie okresu na 20ms(czestotliwosc 50Mz)
   OCR1A = 2000; //określenie czasu impylsu 
}

Jak widać wcale nie jest to takie trudne. Komentarze wydaje mi się, że mówią wystarczająco dużo, więc nie opisuje szczegółów. Częstotliwość kwarcu ustawiona na 1MHz i preskalera na 1 znacznie ułatwia obliczenia. W takim programie można także sterować drugim serwem, a jego ustawienie określa rejestr OCR1B.

Komentarze do „Sterowanie serwomechanizmem

  1. Chciałem się dowiedzieć bo mam wrażenie że podstawiając do wzoru 1kk/(2*1*(1+2000)) nie daje 50 tyko 250 chyba że nie złapałem trybu PWM i nie czy ICR1 = 20000 ma ustawić servo na 180 stopni ?

    • Częstotliwość z jaką pracuje licznik to 50 Hz, bo 1M/20000(ICR1) = 50 Hz. W rejestrze OCR1A znajduje się wartość mówiąca o tym jak długo ma trwać impuls.
      Czyli tak: licznik dokładnie z częstotliwością 50 Hz ustawia stan wysoki na wyjściu OC1A, a gdy rejestr OCR1A zrówna się z wartością zliczoną w TCNT to stan na OC1A jest ustawiany na logiczne zero.
      Działą to dokładnie tak jak jest przedstawione na rysunku nr. 38 w nocie katalogowej atmagi 8, na stronie 90.

  2. Witam wszystkich.Mam następujący problem.Przedstawiony przez autora program działa u mnie, lecz występują u mnie drgania serwa.Nie mam możliwości obejrzenia przebiegów sygnału na oscyloskopie.Program uruchomiony na Atmega8 taktowany wewnętrznym zegarem 1MHz.Serwo cyfrowe ESKY EK2-0508.Próbowałem różnych sposobów.Dawałem kondensatory na zasilaniu serwa, pin reset megi podciągnięty jest do + zasilania, serwo zasilałem z oddzielnego źródła i nic to nie dało.Atmega też właściwie jest zasilona i żadne nogi nie ” wiszą w powietrzu”. Ma ktoś jakiś pomysł co może być przyczyną?

  3. Drgania występują bo serwo chce ustawić się jak najdokładniej z dokładnością do minut, więc się nie przejmuj. Serwa posiadają jako czujniki wału najdokładniejsze potencjometry. Przynajmniej masz muzyczkę:). Pozdrawiam

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *

Time limit is exhausted. Please reload CAPTCHA.

This site uses Akismet to reduce spam. Learn how your comment data is processed.