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

Serwo TowerPro GS-5010 + potencjometr A10k - trudności w precyzyjnym sterowaniu

panicz74 06 Maj 2015 23:10 1200 4
REKLAMA
  • #1 14674548
    panicz74
    Poziom 13  
    Witam.

    Sprzęt:
    -Atmega644P + kwarc 16mgh,
    -Serwo TowerPro GS-5010, (na pinie PD5/OC1A)
    -potencjometr A10k. (na pinie PA0/ADC0)
    -środowisko Eclipse Luna,


    Problem:
    Za pomocą załączonego kodu, gdy steruje potencjometrem, ciężko ustawić je w zadanej pozycji. Albo szarpie i nie może się ustawić albo od razu przesuwa się do końca i szarpie. Pewnie coś źle zrobiłem w kodzie. Takie problemy mam zarówno na taktowaniu obecnym 16MHz jak i na fabrycznym 1MHz. Pewnie coś źle obliczyłem.

    Może ktoś mądrzejszy ode mnie poradzi co tu jest nie tak?

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


    Oto filmy jak działa ten program. Gdy zatrzymuje serwo w danym położeniu nie może ono wypośrodkować położenia. Na pewno coś zmaściłem w kodzie, tylko właśnie nie wiem co.... :(

    https://www.youtube.com/watch?v=QpwNJqae9dc&feature=youtu.be
    https://www.youtube.com/watch?v=Px0jEcXOJtA
  • REKLAMA
  • #2 14675104
    dondu
    Moderator na urlopie...
    1. Po co stosujesz liczby zmiennoprzecinkowe (float), które zżerają zasoby i czas pracy Twojego mikrokontrolera?

    2. Wyrzuć static z deklaracji zmiennej rezultat10bit

    3. W jakim celu z tak dużą częstotliwością, zmieniasz ustawienia rejestru OCR1A, skoro bazuje on na nowej wartości ADC?
    Zastosuj jedno z rozwiązań:
    - albo przenieś to (ustawianie OCR1) do funkcji przerwania ADC,
    - albo zlikwiduj funkcję przerwania i umieść wszystko co się w niej znajduje (w tym ustawienie OCR1A) w warunku (if) w pętli głównej. Warunkiem niech będzie sprawdzanie flagi wystąpienia przerwania ADC + na końcu if() wyzeruj tę flagę.

    4. Po co takie kombinowanie:

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


    wystarczy odczytać ADC:

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

    choć generalnie (o ile kod nie będzie bardziej skomplikowany) zmienna rezultat10bit jest w ogóle zbędna.

    Uporządkuj te sprawy i dopiero wtedy wrócimy do problemu o ile jeszcze będzie występował :)
  • REKLAMA
  • #3 14675274
    Konto nie istnieje
    Konto nie istnieje  
  • REKLAMA
  • #5 14675350
    BlueDraco
    Specjalista - Mikrokontrolery
    Proponuję jak zwykle zacząć od przerwania timera zgłaszanego na końcu okresu serwa. W przerwaniu odczytujesz poprzedni pomiar ADC, liczysz i aktualizujesz wypełnienie serwa nie używając do obliczeń danych zmiennopozycyjnych, a na końcu uruchamiasz kolejny pomiar ADC. Odczyty ADC wypadałoby filtrować. Do odczytu wyniku ADC należy używać rejestru ADC - zwraca 16 bitów, w tym 10 znaczących, jedną instrukcją języka C, bez konieczności składania ADCL i ADCH.
REKLAMA