Skocz do zawartości

serwo - problem z rezonatorem?


Pomocna odpowiedź

Napisano

Zrobiłem sobie jak sądziłem prosty układ z 1 serwomechanizmem.

Przyjąłem od razu, że potrzebuje rezonator zewnetrzny 16MHz, żeby nie mieć problemów z serwem. Napisałem prosty kod:

$regfile = "m48def.dat"
$crystal = 12000000

Config Pinb.2 = Output
Config Servos = 1 , Reload = 10 , Servo1 = Portb.2

Dim I As Byte


Enable Interrupts

I = 120
Servo(1) = I

End

i problem w tym, że serwo nie rusza się, powinno w moim mniemaniu przesunąć się do pozycji zadanej na samym starcie programu. Wczesniej jak cos probowałęm robic z programem to serwo chociaż wariowało cały czas przekręcało sie o jakieś 40 stopni w lewo a pozniej w prawo. Zastanawiam się teraz czy to wina mojego programu, czy może złego rezonatora zewnetrznego a może źle skonfigurowanych fusebitow(o ktorych wiem jedynie tyle co wyczytalem w sieci).

Wiecie może o co chodzi? bo ja juz nie mam bladego pojecia:/

Na schemacie masz 16MHz, w programie zadeklarowałeś 12MHz.

Do fusebitów (i nie tylko) polecam SinaProg - większość procków ma predefiniowane listy ustawień, czyli zmiana fuse'ów ogranicza się do wybrania pozycji z listy.

Jeszcze jedno - GND i sygnał są w serwach z brzegu, w środku jest napięcie. U Ciebie na schemacie VCC i GND są zamienione miejscami w złączu serwa.

Polecam też ten artykuł:

https://www.forbot.pl/forum/topics20/jak-przerobic-serwomechanizmy-vt3902.htm

sorry pomylilem sie przy wpisywaniu programu(stary program probowałem też na 12MHz zeby zobaczyc czy to nie wina mojego rezonatora). a co do schematu tez blad w rysowaniu na szybko schematu:). co do tych fusebitow wlasnie sprawdzam:)

Majski, spróbuj na innym pinie z innego portu. Ja kilka dni temu miałem to samo z megą168, na porcie B nie działało, jak zmieniłem na pin z portu D, to ten sam kod (ze zmienionym tylko pinem) zadziałał bez problemu.

Tak swoją drogą to brakuje pętli głównej

Do

Loop

End

chociaż bez tego o dziwo kompiluje się bez problemu.

  • Pomogłeś! 1
Fusy w moim podpisie.

cos mi nie chce się ładować Twoja strona. być może przez moj super szybki internet ale podejrzewam ze strona nie dziala.

Tak swoją drogą to brakuje pętli głównej

Do

Loop

End

chociaż bez tego o dziwo kompiluje się bez problemu.

okej miałem nadzieję, że pętla w tym przypadku nie będzie w ogole potrzebna więc ją wywalilem z oryginalnego kodu, jednak nie mialem racji:)

teraz rzeczywiscie program serwo się rusza i chyba zostaje w pozycji którą zadałęm ale jeszcze przeprowadze w nocy pare testow:)

okej sprawdziłem czy działa i niestety coś cały czas źle robię. Sprawdzałem na paru serwach tego samego typu (TowerPro MG995) i w jednym (kupionym wczesniej od pozostałych reakcja na ten prosty progran wyglada caly czas tak samo. Zato w 2 nowych(niby ten sam model ale troszke sie rożnia nie mam pojecia dlaczego) sprawa wyglada tak ze jakbym nie ustawił pozycji początkowej serwa zawsze wraca do maksymalnego wychylenia w prawo(oczywiscie nie tak od rau, przeskakuje z dwa razy po 10-20stopni a pozniej co kolejny takt przesuwa sie prawie niezauwazalnie w prawo az do konca i slychac tylko tykanie w rownych odstepach czasu).

:/

ps fusebity ustawiałem w bascom-avr 110111 (ext. Full swing crystal; start-up time PWRDWN/RESET: 16K CK/14CK + 65 ms;[CKSEL0111;SUT:11] wiec chyba wszystko powinno byc ok:/

Zajrzyj do linka, który Ci podałem - masz tam w pierwszym punkcie prosty schemat i sprawdzony kod. Jeśli to Ci nie zadziała, to najprawdopodobniej wina ustawień rezonatora.

Zajrzyj do linka, który Ci podałem - masz tam w pierwszym punkcie prosty schemat i sprawdzony kod. Jeśli to Ci nie zadziała, to najprawdopodobniej wina ustawień rezonatora.

zajrzałem i napisałem przepisałem kod z poprawkami na wyjscie serwa i rezonatora i niestety to samo cały czas

$regfile = "m48def.dat"
$crystal = 16000000

Config Pind.3 = Output
Config Servos = 1 , Reload = 10 , Servo1 = Portd.3

Enable Interrupts

Dim Zmienna As Integer   'Nasze "odchylenie" serwa
Zmienna = 150            'Czas trwania impulsu będzie wynosić Zmienna*Reload=1500us (1,5ms)




Do
  Servo(1) = Zmienna
  Waitms 1000
Loop

End

mowiąc o ustawieniach rezonatora masz na mysli ustawienia fusebitow?

Odpowiadając na PW - niespecjalnie mam w tygodniu czas, z resztą skoro wszystko prawidłowo podłączyłeś, to na 99% problem leży po stronie ustawień fusebit'ów.

Odpal sobie SinaProga, ustaw zgodnie z informacjami w moim arcie (najważniejsze, żeby programator rozpoznał mikrokontroler):

https://www.forbot.pl/forum/topics20/programowanie-avr-przy-pomocy-sinaprog-nakladka-na-avrdude-vt3923.htm

Wybierz oczywiście atmega48, kliknij "advanced" w sekcji "fuses", kliknij "C" w sekcji "Low Fuses", odznacz opcję "Divide by 8 clock internally...", a z listy rozwijanej wybierz ostatnią pozycję:

Ext. Crystal Osc.; Frequency 8.0-    MHz; Start-up ...

(CKSEL i SUT to same "1").

Następnie OK i kliknij na przycisk "Write". Jeśli Serwo będzie się dziwnie zachowywać, to spróbuj jeszcze zmienić wartość "Zmienna" w programie w granicach 100-200. Albo zmieniaj w programie jej wartość np. co 1 sekundę o 10 (zaczynając od 10) i obserwuj, kiedy serwo zaskoczy.

  • Pomogłeś! 1
  • 2 tygodnie później...

okazało się, że wina była po stronie programatora stk200. Kupiłem stk500 i problem sie rozwiazał🙂

dzieki wielkie!

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