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

Atmega16 generowanie przebiegów pwm na 16 serw

Majtek 20 Kwi 2011 20:21 2909 8
  • #1 9422611
    Majtek
    Poziom 12  
    Witam.
    Tworzę sobie programik do sterowania 16 serwami. wykorzystuję 2 timery
    timer2 generuje przez przerwanie odstępy 2.2ms. każdy impuls to obsługa 2 serwów, więc aby odsłużyć wszystkie mamy 8 impulsów(18.4ms) więc impulsy na serwo powtarzają się częściej niż te 20ms. więc tu jest dobrze.

    Timer 2 steruje timerem1, blok A obsługuje pierwszą 8 serw, a blok B drugą 8 serw.
    Mam taki kod i on dział dobrze.
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    o co chodzi? a no o ten kawałek
    
    while(bit_is_clear(TIFR,OCF1A))
    	   {//i tu jest pies pogrzebany
    	   }
    

    on zabiera cały czas procesora, było by ok gdyby było tylko generowanie przebiegów dla serw, ale ten procek jeszcze coś innego musi robić
    więc wymyśliłem taki kod
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    i co jest, niby generuje przebiegi ale ma o innym wypełnieniu do tego niektóre się zmieniają jak inna ilość serw ma generowany sygnał.
    Wie ktoś jak rozwiązać ten problem, bo mnie zaczyna przerastać.
    Chcę po prostu pozbyć się tej pętli i robić to w przerwaniu.
    Wtedy zostaje w głównej pętli więcej czasu aby coś tam zrobić zależności czasowe dla 1 kodu
    Atmega16 generowanie przebiegów pwm na 16 serw
    zależności czasowe dla 2 kodu żółty jakoś 200us
    Atmega16 generowanie przebiegów pwm na 16 serw
  • Pomocny post
    #2 9423325
    Szumlus
    Poziom 17  
    Witam,

    Pomysł dobry ale sypie się najprawdopodobniej z powodu zbyt dużej ilości przerwań.

    Proponuje projekt sterownika "równoległego", taki wykorzystałem w mojej pracy inżynierskiej. Wprawdzie korzystałem tylko z 8 serw ale 16 też obsłuży po drobnej modyfikacji.

    Program zabiera większość mocy procesora do obsługi przerwań ale tylko przez czas 2ms potem procek jest całkowicie "wolny". Może realizować inne zadania.

    Kod wymaga niewielkich modyfikacji ale myślę że dasz radę.
    [code]
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


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



    Wyznacznikiem maksymalnej liczby serw jest czas wykonywania przerwania Timer0, musi się zakończyć zanim T0 zdąży się przepełnić i wywołać kolejne przerwanie. Oryginalnie to część programu sterująca modelem ramienia, przystosowana do czasów serw Tower Pro 955. Jak kolega ma inne możliwe że trzeba będzie troszkę pozmieniać ustawienia programu. Jeśli program nie zdążył by się wyrobić można zoptymalizować procedurę obsługi przerwania w asemblerze.
    :D. U mnie procesor oprócz obsługi serw komunikował się z PC przez RS232 na 19200 bod. protokół miał 12 bajtową ramkę wysyłaną z częstotliwością 50Hz i nie było żadnych problemów.

    Co do kodu kolegi....jak coś ma być szybko zrobione unikamy jakichkolwiek pętli iteracyjnych!!! Wpisujemy wszystko na "sztywno" tzn żadnych pętli po tablicy tylko wypisujemy w słupku Tablica[0]=...Tablica[1]=....więcej flash zajmie ale prędkość wykonania błyskawiczna. Polecam podglądać kod dissasemblera można dużo się dowiedzieć i obliczyć czas wykonywania danej funkcji a w takich "napiętych" aplikacjach to niezastąpione.
    W razie czego śmiało pytać.

    Pozdrawiam,
    Marcin
  • #3 9423729
    Majtek
    Poziom 12  
    fajny patent :)
    wypróbuje go wieczorkiem. Na taki sposób sterowanie serwami nie wpadłem, do tego bardzo dużą ilość serw może obsłużyć, kosztem ilości kroków serwa.
  • #4 9433123
    Szumlus
    Poziom 17  
    Wersja programu którą wrzuciłem obsługiwała rozdzielczość do 1 stopnia.
    Klasyczne serwa ze średniej półki cenowej i tak większej dokładności nie osiągną więc nie ma co przesadzać z precyzją w sofcie.
  • #5 9463467
    Majtek
    Poziom 12  
    Mam pytanko. Jaki jest minimalny czas odmierzany przez timer 8-bitowy?
    bo mi minimum na zegarze 8mhz wychodzi 0.016ms, nawet jak preskaler dam 1 i OCR0 =1. A 16 bitowym mogę mniejsze odmierzyć. według mojej wiedzy powinny minimalny czas mieć taki sam (1/czestotliwość zegara głównego)
    edit:
    No i jest problem atmega z zegarem 16mhz jest za wolna. Gdy generuje przebiegi dla 5 serw, to procek jest tak zajęty, że reszty nie wyrabia obsłużyć, głównie to wysyłanie danych po rs do drugiego procka i odbieranie i wysyłanie danych poprzez nadajnik rfm12 (magistrala SPI). Zostaje chyba tylko następny procek do obsługi tylko serw i komunikaty po rs dostaje.
    Albo przesiąść się na lepsze procki ARM (STM32 np.):)
  • #6 9596197
    Szumlus
    Poziom 17  
    A te pozostałe peryferia śmigają na przerwaniach??
    Minimalny czas przerwania powinien być tak dobrany aby zanim przepełni się Timer zdążyło się wykonać jego przerwanie.
    U mnie tylko działał UART podczas pracy z serwami więc żadnych problemów nie było.
  • #7 9596664
    Konto nie istnieje
    Konto nie istnieje  
  • #8 9609966
    dj_max84
    Poziom 13  
    na stronie AMTELa jest opis dla 8 kanalowego software'owego PWM'a z mozliwoscia rozszerzenia do 24 kanalow. wartosci PWM dla kazdego kanalu sa przesylane sa po RS232. przyklad 8 kanalowy jest oparty na ATTINY2313. kiedys tez widzialem gdzies kod w C ale nie moge go teraz znalezc..

    http://www.atmel.com/dyn/resources/prod_documents/doc8020.pdf
REKLAMA