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.

Atmega8 - Sterowanie serwomechanizmem

21 Lut 2014 12:29 1695 11
  • Poziom 8  
    Witam serdecznie.
    Mam pewien problem ze zrozumieniem sterowania serwonapędów.
    Próbuję zaprogramować ruch serwa ( Tower Pro SG-5010) przez sprzętowe PWM.

    Żyła sygnałowa serwa podpięta do PB1/OC1A , zasilanie 5V, masa wspólna z mikrokontrolerem.

    Częstotliwość taktowania to 8MHz. Oto mój kod:

    Kod: c
    Zaloguj się, aby zobaczyć kod

    Ustawiam tryb 14 timera1 i prescaler 256 co daje 8MHz/256 = 31250
    Ustawiając ICR1 na 625 uzyskuję częstotliwość 50Hz czyli właściwy okres sterowania serwem 20ms.

    Moje pytanie brzmi, jak wysterować zmienny stan wysoki przez 1-2ms w tym okresie? Jeśli są błędy w moim rozumowaniu bardzo proszę o poprawkę.
  • Poziom 24  
    Witam. Przedstawiam kod w którym masz wszystko wyjaśnione:
    Kod: c
    Zaloguj się, aby zobaczyć kod

    I teraz ustawienie serwa.
    Lewo:
    Kod: c
    Zaloguj się, aby zobaczyć kod

    Środek:
    Kod: c
    Zaloguj się, aby zobaczyć kod

    Prawo:
    Kod: c
    Zaloguj się, aby zobaczyć kod


    Wszystko dla taktowania 8MHz.
  • Poziom 25  
    Gdzie masz pętle np.: while(1);
    Bez niej program zakończy działanie, PWM również.
  • Moderator na urlopie...
    olelek napisał:
    Ale program nadal się wykona, ponieważ kompilator na samym końcu dopisze nieskończoną pętlę w sekcji .fini0.

    Niestety nie - wczoraj przez głupi błąd zakomentowałem tę pętlę na końcu main'a i niestety wysyłanie znaków przez UART oparte na przerwaniach zatrzymywało się ;)
  • Poziom 8  
    Faktycznie brakło while.
    A jak wygląda sprawa timera i częstotliwości ? I jak OCR1 ma się do wypełnienia tego impulsu?
    Wybaczcie laickie pytania i proszę o odpowiedź
  • Poziom 8  
    Tyle wiem.
    Czy wartość ICR została ustawiona prawidłowo?
    Nie rozumiem w jaki sposób ustala się to wypełnienie.
    Jak wyliczyć jaka wartość OCR to np 1,7ms stanu wysokiego i tak dalej.
  • Poziom 24  
    Proszę zapoznać się z komentarzami w kodzie oraz Datasheet Atmega8. Przebieg generowany ma częstotliwość f = F_CPU/Prescaler/ICR1. Wypełnienie jest równe stosunkowi OCR1/ICR1. Także można niezależnie zmieniać częstotliwość wyjściową przebiegu i jego wypełnienie. Program, który podałem ma wartości dostosowane do obsługi serw i działa w praktyce.
  • Poziom 8  
    Sterowanie poprzez nadawanie stałych wartości działa, dziękuje za pomoc.
    Jednak podczas próby sterowania switchami napotkałem pewien problem, serwo po zaprogramowaniu procka, obraca się raz w lewo raz w prawo aż do zatrzymania, potem można chwilę posterować i znów następuje kilka ruchów w obydwie strony aż do zatrzymania.
    Oto kod:



    Kod: c
    Zaloguj się, aby zobaczyć kod
  • Poziom 16  
    Mam pytanie, nie chcę zakładać nowego tematu, gdyż temat jest podobny. Steruje mruganiem diod za pomocą Timer1 w pętli while. Dalej w kodzie mam odczyt ADC. Program robi tylko to co jest w tej pętli, nie mam odczytu z ADC. Jak to naprawić?