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

Sterowanie serwem TowerPro MG995 z ATmegi328P - nie działa najprostszy program

Greebqmaster 23 Lis 2014 01:01 1494 3
REKLAMA
  • #1 14156647
    Greebqmaster
    Poziom 12  
    Problem został rozwiązany. Wystarczyło spiąć ze sobą masę baterii/zasilacza i Arduino.

    Witam,

    Staram się okiełznać sterowanie serwem, ale niestety, nie wychodzi mi nawet najprostszy program :( Czy ktoś mógłby mi powiedzieć co mam źle?

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Procesor: ATmega328P-PU (Arduino)
    Timer: Timer 1
    Serwo: TowerPro MG995
    Częstotliwość taktowania CPU: 16MHz

    Czerwony przewód serwa podłączyłem do baterii 4.5V
    Brązowy przewód serwa podłączyłem do GND baterii
    Żółty przewód serwa podłączyłem do PB1 w uC, czyli do OC1A (wyjście timera1)

    Wartości ICR1 i OCR1A wyliczyłem tak:
    ICR1 = 16Mhz/(256(prescaler)*50(częstotliwość dla serwa)) = 1250 -> ustawienie MAX Timera na taką wartość da mi 50Hz częstotliwości, czyli okres PWM = 20ms
    Chciałem uzyskać pozycję ~neutralną, więc potrzebowałem sygnał o długości 1.5ms:
    OCR1A = 1.5ms/20ms = 0.075, a 0.075 * 1250 =~ 94

    Odpowiednie bity timera ustawiłem według dokumentacji mikrokontrolera.

    Pozdrawiam,
    greebqmaster
  • REKLAMA
  • #2 14156676
    dondu
    Moderator na urlopie...
    Witam.

    Ustawiasz bit WGM11 w rejestrze TCCR1B, a on tam nie występuje. W rezultacie ustawiasz bit CS11, co łącznie z ustawionym CS12 zmienia preskaler na: External clock source on T1 pin. Clock on falling edge.

    Także nieprawidłowo wybierasz trybu pracy timera. Który Mode chcesz ustawić? - sprawdź i popraw :)
  • REKLAMA
  • #3 14156899
    Greebqmaster
    Poziom 12  
    O rety, tak to wygląda jak się pisze programy o 1 w nocy... Poprawione:

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Chcę wybrać Fast PWM z możliwością ustawienia MAX poprzez ICR1. Ale teraz znowu widzę, że to wcale nie był MAX (skąd ja to wziąłem? skąd?), a TOP w dokumentacji...

    Ogólnie chodzi mi o jak najdokładniejsze ustawienie 50Hz częstotliwości PWM. Na 8bitowym timerze z 16MHz Arduino NAJMNIEJSZA jaką się da to ~61Mhz - próbowałem wysterować tym serwo i klapa :( Pomyślałem też, że może nic by się nie stało, jakbym ten 1.5ms impuls wysyłał 2x w przeciągu tych 20ms, więc ustawiłem częstotliwość na ~100Hz, ale też klapa :( :( :(

    Dodano po 2 [godziny] 22 [minuty]:

    Mały update. Wcześniej okazało się, że problem leżał w zasileniu serwa 4.5V, a podanie sygnału miało 5V.

    Ostatecznie doszedłem do zasilenia serwa z 5V z arduino, z którego również idzie sygnał. Znalazłem też w internecie kod, który wygląda na dobry (podłączyłem najpierw do diody LED - natężenie światła zauważalnie zmienia się 4 razy) - serwo niestety dalej nie działa - jedzie ciągłym ruchem do końcowej pozycji, na której się zacina i nic więcej się nie dzieje.

    Nie chcę rozważać uszkodzonych serw, ale próbowałem już tyle różnych kombinacji, a one dalej nie działają. Czy może być to wina tego, że kupiłem je za 30zł/jedno i po prostu dostałem tanią chińszczyznę z uszkodzonym/nie działającym sterowaniem?

    omawiany kod:

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Dodano po 3 [minuty]:

    Strona, z której to wziąłem

    Dodano po 14 [minuty]:

    Trzeci update

    Miałem wrażenie, że koleś na stronie pomylił się z proporcjami - obliczyłem, że jeżeli timer będzie zliczał do 5000, to 1.5ms/20ms = 0.075 * 5000 = 375. Ustawiłem tę wartość na sztywno - w while(1) jest tylko OCR1A = 375. Zauważyłem teraz ciekawe zjawisko -> serwo kręci się raz w jedną, raz w drugą stronę... Pomyślałem, że może ma to związek z 8 i 16bitowym rejestrem? Że wartość większą niż 255 trzeba ustawić jakoś inaczej niż poprzez zwykłe przypisanie do rejestru OCR1A? To tylko domysły.

    Dodano po 5 [godziny] 11 [minuty]:

    Ostatni update

    Problem rozwiązany... Okazało się, że musiałem spiąć ze sobą masy baterii/zasilacza i Arduino. Teraz wszystko śmiga, aż się łezka w oku kręci :D
  • #4 14158773
    dondu
    Moderator na urlopie...
    Greebqmaster napisał:
    Problem rozwiązany... Okazało się, że musiałem spiąć ze sobą masy baterii/zasilacza i Arduino. Teraz wszystko śmiga, aż się łezka w oku kręci :D

    Dlatego zawsze warto wrzucić na forum program i schemat :)
REKLAMA