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

atmega8(16) czy atmega 162 i sterownik 6 serwomechanizmow

puntigamer 06 Mar 2009 14:15 3111 9
REKLAMA
  • #1 6243760
    puntigamer
    Poziom 13  
    Cześć!
    Robię sterownik 6 serv na arvku atmega8. Sprzętowo steruję już jednym. Ale aby obsłużyć ich 6 potrzebuję wykoanć wszystko na przerwaniach - programowo. I na razie probuje to wszystko ogarnąć... na pewno procek to umożliwia..

    Co myślicie o zastosowaniu do tego ATmegi162, ktora ma 6 sprzętowych kanałów PWM? Teraz może być głupie pytanie... :Tylko nie wiem czy wszytkie kanały mogę obsłużyć z jednego 16bitowego licznika :). i czy spokojnie włoze ją w układ w ktorym działa ATmega16 (oba dip40)
    Pozdrawiam. Adam
  • REKLAMA
  • REKLAMA
  • #3 6243973
    puntigamer
    Poziom 13  
    Widziałem Twój sterownik. Pomogłoby mi gdybyś mógł dosyć szczegółowo opisać dwa przerwania timera1 i 2 oraz dlaczego takie a nie inne ustawienai liczników?
    Czy dobrze widzę,ze do odmierzania impulsów używasz licznika/timera2 czyli 8bit?
    fajnie byłoby gdybym miał jakieś odniesienie do dalszej pracy, bo musze obsłużyc w sumie 6 serw z dokladnoscia ok 250 pozycji miedzy 1-2 ms czyli 90stopni.
    A tak to stoje w miejscu i wyobrazam sobie "jak to wykonac" :)

    ja znowu mam inną koncepcję... tzn uzyć 16bitowego do odmierzania sygnału pwm, a licznikow 8bitowych do odmierzania 20ms(wiesz po co)
    (lub jeszcze do okreslania kiedy kazdy sygnał dla okreslonego serwa zaczac puszczac na pin)

    Chętnie poczekam na opis Twojego sterownika. Pozdrawiam. Adam
  • #4 6243995
    _Robak_
    Poziom 33  
    Licznik 2 odmierza 2.5ms (czas jednego z osmiu cykli). licznik pierwszy odmierza ile ma trwac stan wysoki na linii 1-2ms w twoim przypadku
  • REKLAMA
  • #5 6244038
    puntigamer
    Poziom 13  
    Skupmy się na Twoim sterowniku.. :
    timer1 (16bit) :

    ISR(TIMER1_COMPA_vect)
    {
       if (pierwszy == 1)
          PORTA=0;
       else
       PORTC=0;
       
       TCCR1B=(0<<CS12);
       TCNT1L=0x00;
    }
    
    ISR(TIMER1_COMPB_vect)
    {
       if (pierwszy == 1)
          PORTC=0;
       else
       PORTA=0;
       
    } 


    Wiem, że w jednym momencie dajesz ustawienia na dwa serwa, tak jak pisałeś niżej w temacie. Chciałbym tą "kombinacje" usunąć :)


    //   Ustawienie licznika 1
       TCCR1B=_BV(WGM12);
       OCR1AL=0x00; 



    w przerwaniu ISR(TIMER1_COMPA_vect zmieniasz wartosc preskalera.. why?
  • #6 6246344
    puntigamer
    Poziom 13  
    atmega8(16) czy atmega 162 i sterownik 6 serwomechanizmow

    licznik 8 bitowy odmierza czas ok 3 ms i w przerwaniu tym obsluzony zostaje pwm z timera1 ktory da od razu sygnal wysoki na okreslonym wyjsciu a gdy licznik zrowna sie z wartoscia ocr1a przykladowo to nastepuje stan niski az do momentu, kiedy te przerwanie sie skonczy. i tak 6 razy, dal kazdego serwa a potem sytuacja sie powinna powtarzac

    w miedzy czasie uruchamiane byloby przerwanie od uarta gdy pc wysylalby dane z wartosciami dla serw i globalnie uaktualniał wartosci zmiennych

    czy moja koncepcje da sie zaprogramowac? mysle ze atmega8 na kwarcu 16 a nawet 8 powinna daćsobie z tym radę. najwyzej przerwanie licznika 16bit napisze w asmie
  • REKLAMA
  • #7 6247272
    _Robak_
    Poziom 33  
    Wszystko da rade :) Tylko na 6 musisz odmierzac 3.(3) sekundy. Mozesz zostawic wersje 8 serowowa i dwoch nie obslugiwac po prostu, albo odmeirzac troche wiecej czasu, tylko nie masz calej koncowki wiec musisz policzyc po jakim czasie ci sie moga rozjechac te 20ms. Preskaler zmieniam bo jak dajesz CSy na zera to licznik stoi po prostu :) Jesli chcesz uzywac sporo uarta to sporoboj przez iles minut non stop aktualizowac polozenie i zobacz czy ci sie czasy nie rozjada. Jesli sie rozjada to bedziesz musial korygowac odmierzanie 2.5ms. Sposob jest prosty: na poczatku obslugi timera 8 bitowego sprawdzasz jego wartosc, zalozmy ma miec 200 (wartosc czysto teoretyczna), jesli ma 230 to nie ustawiasz go na zero tylko na 30 :).
  • #8 6248391
    puntigamer
    Poziom 13  
    oczywiscie Csy nie moge byc wszystkie wyzerowane, bo wtedy licznik stoi, zaskoczyło mnie , że zmieniasz je w przerwaniu, ale oki.
    Powiem Ci, że faktycznie lepiej używać wartości pełnej... ale w dokumentacji serwomechanizmów doczytałem, że czas powtarzania impulsu powinien zawierać się pomiędzy 18 a 23 ms. Widocznie układ wbudowany w serwo sam dokładnie wie kiedy ma "podać silnikowi" następny sygnał, który potrafi przechować w kondensatorze.
    Ale albo użyje 6x3=18 (plus ułamki qs), albo 8x2,5 i zostawie dwa nieobsłużone jak doradzasz.
    Uarta jeszcze nie dotykałem, włączałem Twoj program tylko nie mogłem go bez zmian skompilować w V C++ 6. Stworze małą aplikacje z 2 suwakami. ale przed tym muszę zdziałać obsługę kilku serw w przerwaniach programując tylko uC.
    Jakiego trybu licznika 16bit powinienem użyc do odmierzania impulsów w sposob jaki narysowalem ...
    Na razie mam kwarc 8MHz a dokladnosc 1-2ms chcialbym miec nie mniejsza niz 250 kroków.
    Dalej męcze przerwania : ).


    ps.
    TCCR1B|=_BV(CS12); 
    tutaj ustawiasz presk na 256
     TCCR1B=(0<<CS12); 
    tutaj wylaczasz licznik ? <czy sie myle> i o to pytałem...
    TCCR1B=_BV(WGM12); 
    tutaj w programie glownym ustawiasz tryb CTC z TOP(ICR1) ?

    Pozdrawiam. Adam
  • #9 6248481
    _Robak_
    Poziom 33  
    jesli nie zatrzymasz licznika w przerwaniu to bedzie liczyc dalej. A on ma liczyc dalej dopiero przy starcie obslugi kolejnego serwa !!

    Edit:
    Tak wylaczam licznik patrz wyzej; Ale zapis TCCR1B=(0<<CS12); jakis dziwny :P :P Bo to jest to samo co TCCR1B=0 :) Mozesz dac zeby ladniej bylo TCCR1B&=~_BV(CS12)
  • #10 6248554
    puntigamer
    Poziom 13  
    Faktycznie - agent ze mnie : ) sam przecież to samo bede implementować :P Ale myślałem, że licznik daje przerwanie, wtedy obsluguje sie xServo a on liczy od raz udalej. I w tym czasie (2,5 - 3ms) obsluga xServa musi sie skonczyc). A Ty po obsłudze serwa właczasz dopiero licznik. tak?
    Może mój pomysł jest wyimaginowany ; )
    Dzięki


    : ) zauważyłem te dziwne użycie jako młody czytelnik "mądrych" ksiazek o avr w c, powinno być tak jak właśnie w edytowanej wiadomości, czyli skasowanie okreslonego bitu przez instrukcję (ale działało? hehe: )
REKLAMA