logo elektroda
logo elektroda
X
logo elektroda
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

[Atmega8][Bascom]Serwomechanizmy - potrzebna rada

rodzyniasty 02 Lut 2009 17:46 3700 10
  • #1 6092516
    rodzyniasty
    Poziom 2  
    Witam,

    Na wstępie pragnę zaznaczyć iż nie jestem elektronikiem, ani żadną osobą zajmującą się rzeczami z tym związanymi. Jestem studentem inf. i potrzebuję rady.

    Razem z kolegą robimy projekt na zajęcia z mikroprocesorów i mikrokontrolerów. Śluzę 3-drzwiową zwalnianą i zamykaną przy pomocy serwomechanizmów(SG-5010). Zaprojektowaliśmy układ mamy do tego program, wirtualnie działa bez zarzutów, jednak przy fizycznej realizacji projektu trochę nam teoria nie idzie w parze z praktyką.Serwomechanizmy dokręcają się do końca i najchętniej dalej by to robiły gdyby nie blokada. I tu moje pytanie do was wszystkich \, da sie coś na to poradzić w tym przypadku: Zamieszczam schemat, i program(jest tam opisane co i jak ma działać).

    [Atmega8][Bascom]Serwomechanizmy - potrzebna rada

    mikro zasilamy z programatora USBasp, wszystkie wyprowadzenia z programatora (RESET MISO MOSI itp) też na stałe do mikro podpięte.
    Serwomechanizmy zasilamy z zasilacza (programowalnego od 3 do 12V)

    zamieszczam też kod programu tu jest co i jak ma działać opisane




    ' Program sterujacy serwomechanizmami
    ' Procesor: ATMEGA8
    ' Kwarc: 10MHz zewnetrzny
    
     $regfile = "m8def.dat"                                     'procesor ATMEGA8
     $crystal = 10000000                                        'kwarc 10MHz
    
     'USTAWIENIE STALYCH
     Const Srodek = 100                                         'polozenie srodkowe walka serwa (polozenie umowne 0*)
     Const Wychylenie = 150                                      'polozenie wychylone w prawo walka serwa (kat 90* w prawo w stosunku do poczatkowego)
     Const Czas = 5                                             'czas powrotu w sekundach
    
     Config Pinc.0 = Output                                     'PC0 jako wyjscie serwa 1 (noga 23 ukladu)
     Config Pinc.1 = Output                                     'PC1 jako wyjscie serwa 2 (noga 24)
     Config Pinc.2 = Output                                     'PC2 jako wyjscie serwa 3 (noga 25)
    
     Config Pind.0 = Input                                      'PD0 jako wejscie ster. serwem 1 (noga 2)
     Config Pind.1 = Input                                      'PD1 jako wejscie ster. serwem 2 (noga 3)
     Config Pind.2 = Input                                      'PD2 jako wejscie ster. serwem 3 (noga 4)
    
     Config Servos = 3 , Servo1 = Portc.0 , Servo2 = Portc.1 , Servo3 = Portc.2 , Reload = 10       'konfiguracja serwomechanizmow
    
     S1 Alias Pind.0                                            'alias na styczniki dla serwa1
     S2 Alias Pind.1
     S3 Alias Pind.2
    
     Set Portd.0                                                'zalacza rezystor podciagajacy do stycznika S1
     Set Portd.1
     Set Portd.2
    
     Enable Interrupts                                          'globalne zalaczenie przerywan
    
     Servo(1) = Srodek                                          'wpisanie wartosci do serwa1 (ustawienie walka w srodkowej pozycji)
     Servo(2) = Srodek
     Servo(3) = Srodek
    
     Do                                                         'glowna petla programu
       Debounce S1 , 0 , Wlaczs1 , Sub                          'naciskajac przycisk, wchodzi do odpowiedniej procedury obslugi
       Debounce S2 , 0 , Wlaczs2 , Sub
       Debounce S3 , 0 , Wlaczs3 , Sub
     Loop
     End
    
     Wlaczs1:                                                   'ustawia serwo 1 w pozycji wyhylonej i powraca po zadanym czasie do polozenia poczatkowego
       Servo(1) = Wychylenie                                     'ustawia serwo1 w pozycji wychylonej
       Wait Czas                                                'czeka ustalony czas
       Servo(1) = Srodek                                        'ustawia z powrotem poczatkowe polozenie (srodkowe)
     Return
    
     Wlaczs2:
       Servo(2) = Wychylenie
       Wait Czas
       Servo(2) = Srodek
     Return
    
     Wlaczs3:
       Servo(3) = Wychylenie
       Wait Czas
       Servo(3) = Srodek
     Return



    Dziękuję wszystkim kompetentnym i wyrozumiałym za radę lub pomoc w rozwiązaniu problemu.
  • #2 6092631
    sp3ots
    Poziom 38  
    Witam !
    Nie znam się na serwo mechanizmach, ale wydaje mi się że brakuję w tym układzie tzw. wyłączników krańcowych, podłączonych do ATmega8, skąd procek ma wiedzieć że
    serwo ma przestać działać ?
    Pozdrawiam. Stefan amator Gg6293398
  • #3 6092651
    rodzyniasty
    Poziom 2  
    Serwo ma działać cały czas, impulsy są podawane co 20 ms tak jak powinno być.
  • #4 6092685
    Kisiel
    Poziom 13  
    >> sp3ots
    To są serwomechanizmy modelarskie, one posiadają wewnętrzny układ sterujący a przekładnia sprzężona jest z potencjometrem. Nie ma potrzeby stosować krańcówek.

    >> rodzyniasty
    Ja w BASICu nic nie pisałem, poza kilkoma linijkami kiedyś na C64, ale z tego co widze to powinno być OK. Serwa modelarskie sterowane są impulsami o czasie trwania od 1 do 2 ms. Przy czym 1,5 ms to położenie środkowe serwa. Czasami jednak zdaża się, że położenia skrajne 1 i 2 ms sa już poza zakresem serwa (zwłaszcza położenie 1 ms). A innym razem, że serwa można przesterować w większym zakresie niz standardowe 1 - 2 ms. spróbuj ustawić tak żeby nie dochodzić do położenia 1 ms a np: 0.9ms. Powinno to pomóc.
  • #5 6092726
    shadow0013
    Poziom 34  
    Jeśli nie ma wyłączników krańcowych, pomiaru prądu (przy blokadzie serwo będzie pobierał większy prąd) to chyba zostało Ci liczyć impulsy każdego serwa. Przyjrzyj się starym drukarkom - jak im ręcznie przestawisz głowicę pierwsze co robią to ustawiają się do pozycji zerowej.
  • #6 6092747
    Liderp
    Poziom 1  
    sprawdzalismy ustawienia czasu na 90 i na kilka innych mozliwosci i to niestety tez nie pomoglo. Ale dzieki za rade.

    ps. mamy ustawione fusebity na kwarc zewnętrzny (10MHz)
  • #7 6093374
    zumek
    Poziom 39  
    Liderp napisał:
    sprawdzalismy ustawienia czasu na 90 i na kilka innych mozliwosci i to niestety tez nie pomoglo. Ale dzieki za rade.

    ps. mamy ustawione fusebity na kwarc zewnętrzny (10MHz)


    W konfiguracji serwa, ustawcie Reload = 6 i nie pytajcie dlaczego ;)
  • #8 6104462
    remzibi
    Poziom 24  
    zumek napisał:

    W konfiguracji serwa, ustawcie Reload = 6 i nie pytajcie dlaczego ;)


    Ja zapytam - dlaczego ? pytam powaznie .
    Czy to sie tyczy tez innych czestotliwosci zegara ? ale odpowiedz na to bedzie zapewne zawarta w opowiedzi na pierwsze pytanie - dlaczego ?
  • #9 6106425
    zumek
    Poziom 39  
    remzibi napisał:
    ...Ja zapytam - dlaczego ? pytam powaznie .

    W skrócie:
    Procedura przerwania od Timer0, która steruje serwami, powinna być wywoływana co 10uS, a faktycznie jest wykonywana co 10uS+czas jej wykonania.Czym wolniejszy $crystal i więcej zadeklarowanych serw, tym gorzej :(
  • #10 6113374
    slawko_k
    Poziom 35  
    polecenie serwo w bascomie działa tragicznie.
    proponuję stworzyć na jakimś przerwaniu własną obsługę i będziesz zadowolony
  • #11 6121094
    Kuczus
    Poziom 19  
    Ja może nic nie wniosę w wasz problem, ale nie polecam stosować zasilania (po zaprogramowaniu) z programatora który jest podłączony do komputera. Ostatnio też sie zastanawiałem dlaczego świecą się mi segmenty DP i B (wyświetlacz LED) skoro je programowo wyłączyłem. Okazało się że programator dawał na te końcówki stan niski(w moim wypadku był potrzebny do zapalenia tych segmentów). Po odłączeniu kabelka z programatora problem ustąpił.
REKLAMA