Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek dla www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

[C] Serwomechanizm + AtMega32

08 Wrz 2011 22:44 1847 13
  • Poziom 8  
    Witam. Usiłuję napisać programik do poruszania standardowym serwomechanizmem. Wydaje mi się, że robię wszystko ok, ale serwo nie wykonuje żadnego ruchu. Programik jest na AtMege32, ważne jest że "lata" ona z częstotliwością 1MHz. Serwo jest podpięte do portu PB1. Bardzo bym prosił o pomoc i ewentualne wskazówki co zmienić/poprawić. Poniżej zamieszczam mój kod.

    Kod: c
    Zaloguj się, aby zobaczyć kod


    Z góry dzięki za pomoc.
  • Pomocny post
    Poziom 38  
    Wg wzoru z DSa to masz 5Hz a nie 50:

    $$f_{PWM} =\frac{f_{clk}}{N\cdot (1 + TOP)}$$

    Daj preskaler 8 a do TOP wpisz 4999 :)
  • Poziom 8  
    Zrobiłem tak jak piszesz:

    Kod: c
    Zaloguj się, aby zobaczyć kod


    Ale niestety nic się nie zmieniło :( Masz jeszcze jakieś pomysły? no chyba, że coś robię nie tak? :?:
  • Pomocny post
    Poziom 28  
    user__x napisał:

    Serwo jest podpięte do portu PB1.


    Sygnał PWM jest na OC1A (PD5), a nie na PB1. Pamiętaj też, żeby ten pin (PD5) ustawić jako wyjście.
  • Poziom 8  
    @snnaap:
    Mogę ruszać orczykiem, przy kręceniu jest taki standardowy chyba opró, więc chyba jest ok.

    @Andrzej__S:
    To czyli że wystarczy, żebym dał DDRD = 0b00100000; ?
    Czy może jeśli mam serwo wpięte na pinie B1 to trzeba jakoś inaczej sterować?
  • Poziom 8  
    Ok! zrobiłem tak jak piszecie. Rzeczywiście - po podpięciu do PD5 zaczęło się serwo ruszać i to tak w miarę sensownie - powtarzalne ruchy, brak jakichś losowych przeskoków. Tak więc wygląda ok, ale to teraz wciąż pozostaje moje pytanie - jak zrobić, żeby działało na PB1?? Mam 3 serwa które chciałbym użyć tak więc PD5 i PD4 nawet jak użyję, to co z tym trzecim? Co trzeba zrobić, żeby na PB1 chwyciło?? Z góry wielkie dzięki za odpowiedzi!
  • Poziom 32  
    Możesz do tego celu użyć jeszcze pinów PB3 (OC0) i PD7 (OC2), są to piny odpowiednio Timera 0 i 2, musisz tylko te timery w odpowiedni sposób skonfigurować, tak jak to zrobiłeś wcześniej.
  • Poziom 8  
    To czyli po prostu PB1 nie wchodzi w grę? Dzięki za info.
  • Poziom 32  
    Nie tak, możesz użyć dowolnych portów, tyle że musisz sterować nimi programowo, z przerwań od timera.
    To będzie bardziej skomplikowane niż aktualny kod, ale w sumie nic specjalnie trudnego.
  • Poziom 8  
    @krru:
    A czy mógłbym cię prosić o jakiś przykład? Byłbym bardzo wdzięczny.
  • Poziom 38  
    Możesz spróbować puścić Timer w trybie CTC. TOP wpisujesz do OCR1A a to co wpisywałeś do tej pory do OCR1A wpisujesz do OCR1B. w przerwaniu od OCR1B ustawiasz wybrany dowolny pin na 0 a w przerwaniu od OCR1A ustawiasz go na 1. Kod więc różni się bardzo niewiele:) Z tym, że trzeba te dwa przerwania dopisać, ale nie są jakieś masakrycznie trudne, bo chyba wiesz jak piny ustawiać/kasować :)

    ----------------------------

    Widzę, że jest też tryb CTC w którym wartość TOP jest w ICR1, a wartość porównania tak więc kod który masz nie zmieni się w ogóle, tyle, że trzeba dodać stosowne przerwania i zrobić to co wyżej napisałem.