[Bascom] sterownik serwomechanizmów

To forum jest dla wszystkich pasjonatów mikrokontrolerów AVR Atmela. Wymiana doświadczeń i pomoc dla początkujących w pisaniu programów zarówno w C, Asemblerze jak i BASCOM. Zapraszam znawców tematu, aby pomogli wszystkim początkującym!
Awatar użytkownika
misha89
Użytkownik
Posty: 150
Rejestracja: 06 lip 2006, 17:15
Lokalizacja: Ryki
Kontakt:

[Bascom] sterownik serwomechanizmów

Post autor: misha89 » 12 lip 2007, 18:39

Witam
Robie sterownik serw na procesorze 90S2313 i kwarcu 10Mhz. Jednak za nic w świecie nie chce mi działać. Serwo nie reaguje na zmiany wartości instrukcji servo, ustawia sie tylko w jednej ze skrajnych pozycji i "wali o blokade". Skończyły mi się już pomysły ;/

Oto program:

Kod: Zaznacz cały

$regfile = "2313def.dat"
$crystal = 10000000
Config Servos = 1 , Servo1 = Portb.0 , Reload = 10 , Timer = Timer0

Config Portb = Output
Dim I As Byte
Enable Interrupts


Servo(1) = 200
Wait 1
Servo(1) = 100
Wait 1

Do
   For I = 100 To 200 Step 10
    Servo(1) = I
    Waitms 50
    Next I

    For I = 200 To 100 Step -10
    Servo(1) = I
    Waitms 50
  Next I
 Loop
 End

Awatar użytkownika
Thor
Użytkownik
Posty: 208
Rejestracja: 18 gru 2005, 22:25
Lokalizacja: rybnik

Post autor: Thor » 13 lip 2007, 8:48

Tu jest kod Ktory pisalem ale nie sprawdzalem go ale wg ksaizki i programu jest dobrze napisany :)
jest on na 3 przyciskach i dwa serva dwa przyciski zmieniaja ruch na lewo, prawo , a ostatni zmienia serva pomiedzy pierwszym a drugim ;) acha i jest to na Attiny2313 wystarczy to tylko zmienic ;)



Pozdrawiam Bartek

Kod: Zaznacz cały

$crystal = 10000000
$regfile = "attiny2313.dat"


Config Pinb.7 = Output
Config Pinb.6 = Output
Config Pinb.5 = Input
Config Pinb.4 = Input
Config Pinb.3 = Input

Config Servos = 2 , Servo1 = Portb.7 , Servo2 = Portb.6 , Reload = 10

Dim I As Byte
Dim A As Byte
S1 Alias Pinb.5
S2 Alias Pinb.4
S3 Alias Pinb.3

Enable Interrupts

Set Portb.5
Set Portb.4
Set Portb.3

I = 100
A = 1
Servo(1) = I
Servo(2) = I

Do
Debounce S1 , 0 , Prawo , Sub
Debounce S2 , 0 , Lewo , Sub
Debounce S3 , 0 , Zmiana , Sub
Loop
End

Prawo:
I = I + 20
If I = 200 Then
I = 200
End If

If A = 1 Then
Servo(1) = I
Else
Servo(2) = I
End If
Return

Lewo:
I = I - 20
If I = 80 Then
I = 100
End If

If A = 1 Then
Servo(1) = I
Else
Servo(2) = I
End If
Return


Zmiana:
Incr A
If A = 3 Then
A = 1
End If

Return

Awatar użytkownika
misha89
Użytkownik
Posty: 150
Rejestracja: 06 lip 2006, 17:15
Lokalizacja: Ryki
Kontakt:

Post autor: misha89 » 13 lip 2007, 9:44

Na początku napisałem podobny program jednak efekt był taki sam jak wyżej :(

K_o_n_r_a_d
Użytkownik
Posty: 123
Rejestracja: 29 lip 2005, 10:21
Lokalizacja: Lublin

Post autor: K_o_n_r_a_d » 13 lip 2007, 10:34

Kiedyś raz próbowałem wysterować tak serwo. Po nieudanej próbie wykorzystałem do sterowania sprzętowy PWM.

Awatar użytkownika
misha89
Użytkownik
Posty: 150
Rejestracja: 06 lip 2006, 17:15
Lokalizacja: Ryki
Kontakt:

Post autor: misha89 » 13 lip 2007, 10:49

Kiedyś raz próbowałem wysterować tak serwo. Po nieudanej próbie wykorzystałem do sterowania sprzętowy PWM.
Ja muszę wysterować osiem serw :(

K_o_n_r_a_d
Użytkownik
Posty: 123
Rejestracja: 29 lip 2005, 10:21
Lokalizacja: Lublin

Post autor: K_o_n_r_a_d » 13 lip 2007, 11:03

Nie mam w tej chwili żadnego serwa, więc nie przetestuję tych gotowych procedur. Ja potrzebowałem wysterować 1 serwomechanizm, więc PWMem było wygodniej i lepiej.
Zawsze można samemu napisać procedury sterujące serwami.
Jak będę miał jakieś serwo pod ręką to pobawię się i coś podpowiem jeśli sam tego wcześniej nie rozwiążesz :)

Awatar użytkownika
misha89
Użytkownik
Posty: 150
Rejestracja: 06 lip 2006, 17:15
Lokalizacja: Ryki
Kontakt:

Post autor: misha89 » 14 lip 2007, 13:22

Na początku serwo przy stercie resetowało procesor. Zmieniłem więc zasilanie na baterie jednak niewiele to dało. Nie sądzę żebym sam to rozwiązał gdyż siedzę nad tym już ponad miesiąc i w tym momencie skończyły mi się pomysły :(

Teoretycznie wiem jak sterować serwomechanizmami jednak nie mam pomysłu jak napisać procedury sterowanie 8 serw. Może ma ktoś jakieś przykłady?

Mimo wszystko nie daje mi spokoju dlaczego nie działa program zamieszczony wyżej?

Awatar użytkownika
Koppel
Użytkownik
Posty: 500
Rejestracja: 24 lip 2005, 18:05
Lokalizacja: Gliwice

Post autor: Koppel » 14 lip 2007, 13:34

Jeśli procesor był resetowany przy uruchomieniu serwa to problem leży prawdopodobnie po stronie nieprawidłowego odsprzęgania zasilania.
Trzeba brać pod uwagę, że pojedynczy i niewielki serwomechanizm może brać w impulsie prąd rzędu 0,5-1A. To stawia spore wymagania prowadzeniu ścieżek zasilania. Przy samym serwie potrzebne są spore kondensatory, procesor najlepiej podłączyć przez dławik o indukcyjności rzędu 330uH a za nim kondensator 100n i 10-100uF. Jeśli to nie pomoże, warto spróbować zastąpić dławić diodą shotky'ego - tak aby uniemożliwić "podbieranie" prądu procesora przez pracujące serwo.

Awatar użytkownika
misha89
Użytkownik
Posty: 150
Rejestracja: 06 lip 2006, 17:15
Lokalizacja: Ryki
Kontakt:

Post autor: misha89 » 14 lip 2007, 13:55

Obecnie zasilam serwo z baterii i już nie resetuje procesora, jednak dalej nie mogę go prawidłowo wysterować:( tak jak pisałem wcześniej: serwo ustawia się na skrajnej pozycji i uderza o blokade.

Awatar użytkownika
gazmajster
-
Posty: 30
Rejestracja: 01 sie 2006, 22:13
Lokalizacja: Z Zagłębia Drewna
Kontakt:

Post autor: gazmajster » 14 lip 2007, 19:13

Witam
Program napisałeś na attiny2313 i być może fus dzielnika zegara masz USTAWIONY
bo tak jest fabrycznie,więc jeśli tak jest to go zablokuj
Pozdrawiam

Awatar użytkownika
misha89
Użytkownik
Posty: 150
Rejestracja: 06 lip 2006, 17:15
Lokalizacja: Ryki
Kontakt:

Post autor: misha89 » 14 lip 2007, 22:51

Program na początku był pisany na attiny2313, niestety jednak podczas prób namieszałem coś w fusbitach i zablokowałem procesor. Dlatego zmieniłem uP na 90S2313 ale program dalej nie działa. Bardzo proszę o pomoc :(

Awatar użytkownika
gazmajster
-
Posty: 30
Rejestracja: 01 sie 2006, 22:13
Lokalizacja: Z Zagłębia Drewna
Kontakt:

Post autor: gazmajster » 15 lip 2007, 2:54

Witam
W takim razie sprawdź dla serwo czy ono działa prawidłowo
Pozdrawiam

Awatar użytkownika
misha89
Użytkownik
Posty: 150
Rejestracja: 06 lip 2006, 17:15
Lokalizacja: Ryki
Kontakt:

Post autor: misha89 » 15 lip 2007, 16:24

Serwa są nowe, dopiero co kupione. Servo ustawia się w skrajnej pozycji więc poziom wypełnienia impulsu jest albo za mały albo za duży. Niestety nie wiem jak to sprawdzić.

K_o_n_r_a_d
Użytkownik
Posty: 123
Rejestracja: 29 lip 2005, 10:21
Lokalizacja: Lublin

Post autor: K_o_n_r_a_d » 15 lip 2007, 16:32

Możesz sprawdzić tak:

Kod: Zaznacz cały

Dim I As Byte

Do
   For I = 1 To 100
      Portd.0 = 1
      Waitus 750
      Portd.0 = 0
      Waitus 19250
   Next I
   For I = 1 To 100
      Portd.0 = 1
      Waitus 1750
      portd.0=0
      Waitus 18250
   Next I
Loop : End
Nie wiem jakie masz serwa, więc jakby coś było nie tak to pozmieniaj czasy.
Serwomechanizm podłączony do PortD.0
Nie sprawdzałem kodu!

miroskop
-
Posty: 3
Rejestracja: 15 lip 2007, 17:06
Lokalizacja: Śląsk

Post autor: miroskop » 15 lip 2007, 17:09

Ja do sterowania serwem stosuję instrukcję "Pulseout", opis jest w helpie.

ODPOWIEDZ