Skocz do zawartości

Sterownie serwami


_cyna_PL

Pomocna odpowiedź

Witam 🙂

Mam mały problem z sterowaniem serwem. Czytałem w help bascoma o instrukcji "CONFIG SERVOS" . Nie wiem czemu serwo po podaniu :

Servo(1) = 100                      'włącz na 1000 mikrosekund

Servo(2) = 200                      'włącz na 2000 mikrosekund

ustawia się w ta sama pozycje [ max w lewo]

Oto program :

$regfile = "m8def.dat" 
$crystal = 8000000
Config Servos = 1 , Servo1 = Portc.0 , Reload = 10

Config Portc.0 = Output

Enable Interrupts

Do
Servo(1) = 100



Loop
Link do komentarza
Share on other sites

Hm... a procek na pewno jest taktowany 8MHz? To też może być przyczyna, program myśli, że coś trwa 1 sekunde, a w rzeczywistości jest dwa razy wolniej lub dwa razy szybciej 🙂

//daniel93

Usunąłem żeby nie wprowadzać w błąd.

Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

Przetestuj to:

    $regfile = "m8def.dat" 
   $crystal = 8000000
   Config Servos = 1 , Servo1 = Portc.0 , Reload = 10

   Config Portc.0 = Output

   Enable Interrupts

   Do
   Servo(1) = 100

   wait 5

   Servo(1) = 200

   wait 5
   Loop

Pownien zmieniać pozycje co 5s.

Link do komentarza
Share on other sites

Przetestuj to:
$regfile = "m8def.dat" 
   $crystal = 8000000
   Config Servos = 1 , Servo1 = Portc.0 , Reload = 10

   Config Portc.0 = Output

   Enable Interrupts

   Do
   Servo(1) = 100

   wait 5

   Servo(1) = 200

   wait 5
   Loop

Pownien zmieniać pozycje co 5s.

Żadnej reakcji sprawdzałem na innych serwach, i innym Procku i tez to samo 😖

Po chwili namyslu pdalem taki program :

$regfile = "m8def.dat" 
   $crystal = 8000000
   Config Servos = 1 , Servo1 = Portc.0 , Reload = 10

   Config Portc.0 = Output

   Enable Interrupts

   Do
   Servo(1) = 100



   Loop

Po odpaleniu serwo ustawie się w pozycji prawie na środku.

ale po dodaniu kolejnej pozycji na jakiej ma się ustawić bez czasu oczekiwania serwo nie reaguje na polecenia.

Link do komentarza
Share on other sites

Na początek sprawdż to co radził Kshaq. Napisz prosty programik, który zapala/gasi diodę LED co określony czas, np. 1 sekunde (polecenie Wait 1) i zobacz czy rzeczywiście trwa to sekundę. Możesz mieć włączony podzielnik i wszystko działa nie tak.

Link do komentarza
Share on other sites

Napisz prosty programik, który zapala/gasi diodę LED co określony czas, np. 1 sekunde (polecenie Wait 1) i zobacz czy rzeczywiście trwa to sekundę.

sprawdzałem i jest tak jak ma być 😋

Link do komentarza
Share on other sites

Dobrze, że oscylator jest ustawiony prawidłowo, ale jednak nie w tym rzecz.

Znalazłem właśnie fragment w książce Marcina Wiązani: "[...] Aby serwa były prawidłowo obsługiwane, należy stosować dla mikrokontrolera rezonatory kwarcowe o częstotliwości powyżej 8 MHz..." Autor w swoim przykładzie stosuje kwarc 10 MHz, może spróbuj zrobić tak samo.

Link do komentarza
Share on other sites

Polecenie korzysta z licznika Timer0, ale wygląda na to, że przerwanie jest odblokowywane automatycznie. Należy jedynie odblokować globalny system przerwań (Enable Interrupts).

Link do komentarza
Share on other sites

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • 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.