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

[ATtiny13A][C] Sterowanie serwomechanizmem bez timera

Defozo 11 Lip 2012 01:00 1503 4
REKLAMA
  • #1 11092692
    Defozo
    Poziom 17  
    Witam, chciałbym sterować serwomechanizm bez użycia timera.

    Korzystam z mikrokontrolera ATtiny13A oraz analogowego serwomechanizmu HK929MG.

    Napisałem program w C:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Gdy włączę urządzenie serwomechanizm ustawi się w jakiś kąt, nie wiem dokładnie jaki, ale nie jest to kąt 0° ani 180°.
    Natomiast, gdy nacisnę przycisk, serwo zaczyna ruszać się raz w jedną stronę, raz w drugą (gdzieś między 0° a 100° - nie jestem pewien).

    Dlaczego tak się dzieje, co jest nie tak i jak to naprawić?

    Proszę o pomoc,
    Defozo
  • REKLAMA
  • #2 11092742
    dondu
    Moderator na urlopie...
    Defozo napisał:
    Napisałem program w C:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Zacznijmy od tego, czy masz zegar 1,2MHz, czy 12MHz i brakło Ci jednego zera oraz UL na końcu?
    Zamiast w kodzie zdefiniuj w opcjach projektu: http://mikrokontrolery.blogspot.com/2011/03/fcpu-gcc-gdzie-definiowac.html
  • REKLAMA
  • #3 11092904
    LordBlick
    VIP Zasłużony dla elektroda
    dondu napisał:
    Zacznijmy od tego, czy masz zegar 1,2MHz, czy 12MHz i brakło Ci jednego zera oraz UL na końcu?
    9,6MHz/8=1,2MHz (Fusebit CKDIV zaprogramowany) więc niekoniecznie pomyłka.
    Radzę zajrzeć do noty. Co do miejsca definiowania zegara i zaznaczenia, że to jest unsigned long - popieram.
  • REKLAMA
  • Pomocny post
    #4 11094801
    sulfur
    Poziom 24  
    Serwo steruje się sygnałem 50Hz. Czyli 20ms ma okres. W czasie tego okresu ma być stan wysoki zależnie od położenia od 1 do 2ms. W związku z tym ogłaszam, co następuje:
    1. Twoja eliminacja drań styków niszczy całą czasówkę.
    2. Żeby serwo trzymało dane położenie, musi dostawać sygnał o odpowiednim wypełnieniu cały czas. Podkreślam cały czas.
  • #5 11095019
    Defozo
    Poziom 17  
    dondu napisał:
    Defozo napisał:
    Napisałem program w C:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Zacznijmy od tego, czy masz zegar 1,2MHz, czy 12MHz i brakło Ci jednego zera oraz UL na końcu?
    Zamiast w kodzie zdefiniuj w opcjach projektu: http://mikrokontrolery.blogspot.com/2011/03/fcpu-gcc-gdzie-definiowac.html

    ATtiny13 standardowo ma ustawiony zegar 1,2MHz i na takim właśnie zegarze pracuję.
    Nie korzystam z AVR Studio, więc nie mam jak zdefiniować tego w programie.

    LordBlick napisał:
    dondu napisał:
    Zacznijmy od tego, czy masz zegar 1,2MHz, czy 12MHz i brakło Ci jednego zera oraz UL na końcu?
    9,6MHz/8=1,2MHz (Fusebit CKDIV zaprogramowany) więc niekoniecznie pomyłka.
    Radzę zajrzeć do noty. Co do miejsca definiowania zegara i zaznaczenia, że to jest unsigned long - popieram.

    Szczerze powiedziawszy nigdy do tego mikrokontrolera nie dawałem "UL" i nigdy nie miałem z tym problemu.

    sulfur napisał:
    Serwo steruje się sygnałem 50Hz. Czyli 20ms ma okres. W czasie tego okresu ma być stan wysoki zależnie od położenia od 1 do 2ms. W związku z tym ogłaszam, co następuje:
    1. Twoja eliminacja drań styków niszczy całą czasówkę.
    2. Żeby serwo trzymało dane położenie, musi dostawać sygnał o odpowiednim wypełnieniu cały czas. Podkreślam cały czas.

    Dziękuję za odpowiedź, właśnie do tego doszedłem :)

    Odkryłem również, że na serwo trzeba dawać trochę inne długości impulsów niż są podane w poradnikach.
    Mianowicie takie:
    600µs - 0°
    2350µs - 180°

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


    Aktualnie wszystko działa jak należy :)
    Temat zamykam.
REKLAMA