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

[C][AtMega8] - Sterowanie serwem przy użyciu 2 punktów i arcusa tangensa

Albert91 21 Cze 2013 22:32 2970 17
  • #1 21 Cze 2013 22:32
    Albert91
    Poziom 7  

    Chciałem zrobić program który po wpisaniu punktu jakiegoś na płaszczyźnie obróci serwo w kierunku tego punktu.

    Próbowałem użyć biblioteki math i funkcji atan(k), lecz z jakiegoś powodu sposób ten nie działa.

    PWM i timer są dobrze odpalone, bo przy bezpośrednim sterowaniu wartością OCR działały jak należy.

    Kompilator nie wyrzuca żadnego błędu , lecz coś musi być nie tak

    Kod: c
    Zaloguj się, aby zobaczyć kod


    Zmienne globalne:
    Kod: c
    Zaloguj się, aby zobaczyć kod


    Szczególnie podejrzana jest ta część :
    Kod: c
    Zaloguj się, aby zobaczyć kod

    0 17
  • #2 22 Cze 2013 10:09
    lukastoja
    Poziom 15  

    Nie wnikając za bardzo zobacz:
    czasy math

    tam wyliczenie jest dla zegara 16MHz, skoro ty masz 1MHz to czas 1 operacji dzielenia i atan to 3.5 ms, czyli samo obliczenie będzie dłuższe niż cykl z którym pracuje servo

    Może to jest to ??

    0
  • #3 22 Cze 2013 12:06
    Albert91
    Poziom 7  

    Wydaje mi się , że PWM sobie chodzi tak, czy inaczej niezależnie , a zmiana jego wartości następuje dopiero po skończeniu obliczeń, więc nie powinno to wpływać na działanie ogólnie, najwyżej go opóźnić, chyba że czegoś nie rozumiem .

    0
  • #4 22 Cze 2013 16:03
    Brutus_gsm
    Poziom 25  

    Owszem, PWM chodzi niezależnie od programu głównego, ponieważ jest obsługiwane sprzętowo. Nie zmienia to jednak faktu, że konstrukcja programu jest błędna. Przerwanie powinno wykonywać się jak najszybciej. Wszelkie czasochłonne obliczenia wykonywane być powinny w programie głównym. Timera 0 możesz użyć do odliczania czasu, a resztę robić w pętli while(1).

    Zrób obsługę klawiszy w pętli głównej. Żeby wyeliminować drgania styków możesz wykorzystać flagę lub zmienną, którą będziesz zmniejszał w każdym przerwaniu.

    Cytat:
    serwo ma zakres ruchu od 600 do 2400 ms, nie wiem czemu taki dziwny

    Napisz jakie masz serwo, bo to zdanie wydaje mi się nie do końca prawdziwe.

    0
  • #5 23 Cze 2013 17:54
    Albert91
    Poziom 7  

    Serwo Hobby King HK15138

    Dodano po 1 [godziny] 50 [minuty]:

    Przerobiłem program na taki:

    Kod: c
    Zaloguj się, aby zobaczyć kod


    [C][AtMega8] - Sterowanie serwem przy użyciu 2 punktów i arcusa tangensa

    Zaczęło już coś reagować , ale dla 45 stopni ( np x=10,y=10) przyjmuje tak na oko połowę tego kąta , przy ujemnych też , z tym , że przy ujemnych w dodatku czasami szaleje i osiąga "zadaną" pozycje dopiero po zresetowaniu procka.

    Podejrzewam że może być to spowodowane spadkami napięcia na procku , bo serwo jest zasilane z tego samego źródła, ale dowiem się dopiero jak kupię drugi zasilacz.

    0
  • #6 24 Cze 2013 18:38
    Albert91
    Poziom 7  

    Kupiłem 2 zasilacz, i teraz to dopiero mam cuda :

    Zacznę od tego , że mimo iż są to 2 takie same zasialcze, to napieci między ich masami wynosi 0.38 V :O

    Gdy masy zasilacza elektroniki i serwa nie są zwarte, to serwo w ogóle nie działa.

    Gdy je z kolei zewrę, to serwo reaguje, ale co chwilę robi jakieś dziwne ruchy , albo ustawia się jak mu się podoba.

    0
  • #7 24 Cze 2013 18:47
    Brutus_gsm
    Poziom 25  

    Co to znaczy: napięcie pomiędzy masami? Masy muszą być połączone, żeby cokolwiek działało. Jeśli nie używasz przerwań od timera 0, to je wyłącz, funkcja obsługująca przerwanie nie może być pusta.

    0
  • #8 24 Cze 2013 18:56
    Albert91
    Poziom 7  

    Co się człowiek nie namęczy, do zasilania serwa zrobiłem sobie układ stabilnego zasilania z 7805 i przestał szaleć.

    Wyrzuciłem przerwanie zgodnie z sugestią.

    0
  • #10 24 Cze 2013 19:19
    Albert91
    Poziom 7  

    Jednak znowu zaczął szaleć :(

    [C][AtMega8] - Sterowanie serwem przy użyciu 2 punktów i arcusa tangensa

    Tak teraz mniej więcej wygląda mój układ , już nie mam pomysłu, co poprawić.
    Czy dodanie filtrowania do drugiego stabilizatora coś da ?

    0
  • Pomocny post
    #11 24 Cze 2013 19:19
    Brutus_gsm
    Poziom 25  

    Skoro serwo już nie szaleje, to przejrzyj jeszcze raz obliczanie wartości wpisywanej co OCR1A. Podstaw sobie przykładową wartość X=10 i Y=10 i podaj wynik, który znajdzie się w zmiennej serwo1.

    Zastanów się także, czy wychylenie musi być koniecznie podawane w postaci punktu w przestrzeni. Zdecydowanie łatwiej i wydajniej byłoby podawanie kąta wychylenia. Serwo ma zakres pracy 180 stopni przy długości impulsu od 0.6ms do 2.4ms. Dzieląc różnicę w długości impulsu przez zasięg pracy, dostajemy mnożnik = 10. Oznacza to, że wartość OCR1 obliczyć można w najprostszy sposób:

    Kod: c
    Zaloguj się, aby zobaczyć kod

    0
  • #12 24 Cze 2013 19:28
    dondu
    Moderator Mikrokontrolery Projektowanie

    Albert91 napisał:
    Tak teraz mniej więcej wygląda mój układ , już nie mam pomysłu, co poprawić.

    Elektronika to precyzyjna dziedzina. Zwrot "mniej więcej" przynosi problemy.

    Albert91 napisał:
    Czy dodanie filtrowania do drugiego stabilizatora coś da ?

    Czytałeś datasheet regulatora?
    Czy w silniku samochodu także olej wlewasz dopiero, gdy są problemy?

    Do kompletu pokaż jeszcze zdjęcia.

    0
  • #13 24 Cze 2013 19:40
    Albert91
    Poziom 7  

    10/10=1
    kat=atan(1)=45*= PI/4
    mnożnika=((PI/4)/PI)= 1/4
    serwo1=1500-900/4 = 1500-225

    O połowę za mało :)

    Dodano po 7 [minuty]:

    dondu napisał:

    Czytałeś datasheet regulatora?

    Chodzi Ci o 7805 ?

    I jeszcze apropo zwierania mas tych zasilaczy, czy tak mogę sobie je po prostu zewrzeć , mimo, że to 0.4 V jest różnicy, nie zrobi mi się wtedy tam prąd zwarciowy?

    0
  • Pomocny post
    #14 24 Cze 2013 19:41
    Brutus_gsm
    Poziom 25  

    Jaki prąd zwarciowy i jakie napięcie między masami? Jeśli mierzysz napięcie między dwoma punktami w przestrzeni bez wspólnego punktu odniesienia, to nie dziw się, że wychodzą ci jakieś 0.4V...Masy musza być połączone razem i żaden prąd zwarciowy nie płynie...

    0
  • Pomocny post
    #15 24 Cze 2013 19:51
    dondu
    Moderator Mikrokontrolery Projektowanie

    Albert91 napisał:
    Dodano po 7 [minuty]:

    dondu napisał:

    Czytałeś datasheet regulatora?

    Chodzi Ci o 7805 ?

    Dlaczego mnie pytasz. Zapytaj siebie co miałeś na myśli. Ja odniosłem się tak:

    dondu napisał:
    Albert91 napisał:
    Czy dodanie filtrowania do drugiego stabilizatora coś da ?

    Czytałeś datasheet regulatora?
    Czy w silniku samochodu także olej wlewasz dopiero, gdy są problemy?


    Jak już powiedział Brutus_gsm - masy muszą być połączone (!) - przykład: http://mikrokontrolery.blogspot.com/2011/04/B...enia-masy-mikrokontrolera-i-programatora.html

    I nadal nie wiemy, czy schemat jest dokładnie taki, czy nadal jest cyt. "... mniej więcej taki ..."

    0
  • #16 24 Cze 2013 21:34
    Albert91
    Poziom 7  

    Teraz mój układ wygląda tak:

    [C][AtMega8] - Sterowanie serwem przy użyciu 2 punktów i arcusa tangensa

    I chyba wreszcie działa jak należy :)

    Dodano po 44 [sekundy]:

    Dziękuję bardzo za pomoc

    0
  • #17 25 Cze 2013 09:59
    SylwekK
    Poziom 28  
  • #18 25 Cze 2013 21:30
    Albert91
    Poziom 7  

    Dodałem

    Teraz mam już 2 serwa śmigające na Timerze1 , ale pojawił się problem z 3 serwem

    Jakikolwiek nie wezmę prescaller na Timerze 2 to nie mogę uzyskać częstotliwości 50 Hz, najgorsze, że nie ma niczego takiego jak w T1 - zliczania do ICR
    Najbliższa częstotliwość jaka wychodzi to 61 Hz przy prescallerze 64.

    Czy istnieje jakiś sposób , aby odpalić serwo z Timera 2 ?

    0