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.

Jak generowac kilka przebiegow prostokatnych na jednym at32?

bosman49 24 Lut 2009 14:33 4968 50
  • #1 24 Lut 2009 14:33
    bosman49
    Poziom 9  

    Projektuje uklad w ktorym potrzebuje osiem nizaleznych generatorow ktorych czestotliwosc bedzie zmieniana z klawiatury ( 8 klawiszy + i 8 klawiszy - ). klawiatura obslugiwana jest w przerwaniu. Chcialbym aby podczas obslugi klawiatury nie bylo zadnych zaklocen przebiegu i dodam ze przytrzymanie kalwiatury skutkuje zwiekszaniem lub zmiejszaniem czestotliwosci i zajmuje to do 5 sekund, dlatego nie moge generowac przebiegu w programie. Nie wiem czy sie myle czy nie ale atmega 32 ma tylko jeden nizalezny generator. Ile generatorow ma Atmega 128? Czy timery sa nizalezne od programu?
    Dzieki z gory.
    Krzysiek

    0 29
  • #2 24 Lut 2009 17:41
    p_kacper
    Poziom 10  

    Witam,
    o jakich zakresach częstotliwości mówimy??

    0
  • #3 25 Lut 2009 20:12
    janbernat
    Poziom 38  

    Atmega32 ma 3 liczniki
    Atmega128 ma 4 liczniki
    podobnie Atmega162 i 64.
    Timery pracują niezależnie od pracy programu, ale z programu można nimi sterować(bo po co by były)

    0
  • #4 26 Lut 2009 18:16
    bosman49
    Poziom 9  

    Czy Atmega 128 posiada 4 liczniki czy 8 ? Czestotliwosc nie bedzie wysoka potrzebuje zadawac tylko step dla silniow krokowych ok 1Khz.

    0
  • #5 26 Lut 2009 19:14
    Freddy
    Poziom 43  

    Żeby sterować ośmioma serwami, nie potrzeba wcale ośmiu generatorów. Wystarczy w zupełności jeden. Użyj klawisza "szukaj" do tego służy. To na prawdę nie gryzie. W internecie są setki rozwiązań dotyczących sterowania serwami we wszystkich możliwych językach od Asemblera począwszy, poprzez C na Bascomie i Pascalu skończywszy. Wystarczy do tego użyć Google.
    Jeśli chcesz koniecznie wiedzieć ile liczników ma każdy procesor, to zaglądnij do dokumentacji, od tego są.

    0
  • #6 26 Lut 2009 20:17
    janbernat
    Poziom 38  

    Freddy, to nie są serwa, to są silniki krokowe.
    ATMega128 ma 4 liczniki-2 8bitowe i 2 16bitowe.
    W licznikach 16bit ma po dwa rejestry porównania-chyba OCR1A, OCR1B itd.
    Do nich można wpisać wartość i wystawić na odpowiednie końcówki.
    8bitowe chyba nie.
    To by dało 6 wyjść.
    Ale podejrzewam że dałoby się to zrobić inaczej.
    Nie mam jeszcze pomysłu.
    Dokumentacja jest na stronie Atmela.

    0
  • #7 26 Lut 2009 22:04
    bosman49
    Poziom 9  

    Jezeli ktos nie ma ochoty pomagac innym to niech nie pomaga ! Zadaje pytania bo nie wiem! A poza tym serwo to nie silnik krokowy.
    Wracajac do tematu. Nie jest dla mnie problemem sterowanie silnika krokowego tylko generowanie pewnej czestotliwosci (a dokladnie osmiu roznych dla kazdego silnika oddzielnie) kompletnie niezakloconej poprzez program ktory w przerwaniu obsluguje klawiature ktora zas steruje predkoscia. Nigdy wczesniej nie uzywalem timerow w kontrolerach wiec pytam. Jestem bardziej zwiazany z programowaniem niz ze strona hardware. Mam nadzieje ze modulacja PWM to dobry pomysl i jestem na dobrej drodze. Jezeli istnieje inne rozwiazanie problemu prosze o informacje. Pozdrawiam P.S. Wyczytalem ze Atmega ma 8 licznikow.

    0
  • #8 26 Lut 2009 23:28
    janbernat
    Poziom 38  

    Nie denerwuj się.
    PWM to nie jest żadne rozwiązanie dla krokowców.
    One potrzebują impulsów, a nie wypełnienia-PWM-Pulse width modulation.
    PWM jest dla sterowania silnikami DC grzałkami itp.
    A ty masz silniki krokowe.
    Nie jestem na tyle dobry w programowaniu żeby ci pomóc.
    Może inni.
    Ale o sprzęcie to mam pojęcie.
    Nie próbuj sterować silnikami krokowymi przez PWM.
    To jest ślepa uliczka.
    Zastanów się jak to działa.

    Może 4 Attiny2313 po dwa timery (po 2zł szt) i jakiś ATMega nadzorujący?
    Przez i2c, isp?
    No projekt może może być nieco bardziej skomplikowany.

    0
  • #9 27 Lut 2009 07:26
    Freddie Chopin
    Specjalista - Mikrokontrolery

    porada malo precyzyjna - silnikami krokowymi MOZNA sterowac przez PWMy, ktore poza regulacja wypelnienia umozliwiaja tez regulacje czestotliwosci. wypelnienie jest stale i wynosi 50%.

    4\/3!!

    0
  • Pomocny post
    #10 27 Lut 2009 08:08
    megaman123
    Poziom 13  

    A gdybyś zrobił to na innej zasadzie ?

    Jeden z liczników skonfigurowany , jako przykładowy 1 MHz .
    Teraz powyliczałbyś , o ile razy taka częstotliwość pracy jest większa od tych którą chcesz osiągnąć , i zapisał wstępne wartości np. w tablicy .
    Przykładem niech będzie silnik pierwszy - 1kHz , drugi 20 kHz ....

    Dla pierwszego 1000 razy za dużo , dla drugiego 50 . Druga sprawa , to jeśli mówimy o częstotliwości , to pamiętajmy ,że co wyliczoną wyżej wartość musimy mieć poprzedni stan więc te wartości jeszcze dzielimy na połowę.

    i piszemy : unsigned int limity[] = { 500 , 25 ..... }; // az do 10

    i w obsłudze przerwania timera :

    static unsigned int limits[] = { 0 , 0 , 0 .... } ; // az do 10
    for(unsigned char i = 0 ; i < 10 ; i++)
    {
    if(limits[i] == limity[i])
    {
    silnik_port ^= 1<<i;
    }
    }

    To chyba rozwiąże Pana problem, bynajmniej tyle przy kawie z rana potrafiłem wymyśleć . Trzeba jedynie pogłówkować nad dobrym skalowaniem . W obsludze przerwania od klawiatury bedzie Pan modyfikował zawartość tablicy limity .

    0
  • #11 27 Lut 2009 10:21
    snow
    Poziom 28  

    Sterowanie PWM jest jak najbardziej wskazane, trzeba utrzymać stałą wartość prądu w uzwojeniach w zależności od częstotliwości jeżeli chce się utrzymać stały moment w całym zakresie prędkości silnika. Co oczywiście nie zmienia faktu że aby silnik wykonał krok należy podawać mu impulsy.

    0
  • #12 27 Lut 2009 12:48
    janbernat
    Poziom 38  

    bosman49 napisał:
    Czy Atmega 128 posiada 4 liczniki czy 8 ? Czestotliwosc nie bedzie wysoka potrzebuje zadawac tylko step dla silniow krokowych ok 1Khz.

    Sprawdziłem jeszcze raz.
    Atmega128 ma cztery liczniki.
    Kanałów PWM ma osiem.
    Ale nie uzyskasz z nich 8 różnych częstotliwości.
    Chyba tylko cztery.
    Jeśli potrzebny Ci tylko sygnał STEP to PWM jest niepotrzebne.
    Oznacza to także że każdy silnik ma swój sterownik i podajesz na nie
    STEP, DIR i ENABLE.
    To co napisał Snow byłoby słuszne gdybyś konstruował i programował sterowniki do silników.
    A robisz sterownik do sterowników do silników.
    Swoją drogą termin "sterownik" ma już tyle znaczeń że nie bardzo wiadomo co znaczy.

    Dodano po 10 [minuty]:

    A to co napisał megaman123 jest słuszne.
    Jeśli-jak napisałeś-obsługa przerwania z klawiatury zajmuje 5sek. to chyba należy ją inaczej napisać.
    Obsługa przerwania powinna być jak najkrótsza-jakieś mikrosekundy.

    0
  • #13 27 Lut 2009 12:51
    Freddy
    Poziom 43  

    bosman49 napisał:
    Jezeli ktos nie ma ochoty pomagac innym to niech nie pomaga ! Zadaje pytania bo nie wiem! A poza tym serwo to nie silnik krokowy.
    Wracajac do tematu. Nie jest dla mnie problemem sterowanie silnika krokowego tylko generowanie pewnej czestotliwosci (a dokladnie osmiu roznych dla kazdego silnika oddzielnie) kompletnie niezakloconej poprzez program ktory w przerwaniu obsluguje klawiature ktora zas steruje predkoscia. Nigdy wczesniej nie uzywalem timerow w kontrolerach wiec pytam. Jestem bardziej zwiazany z programowaniem niz ze strona hardware. Mam nadzieje ze modulacja PWM to dobry pomysl i jestem na dobrej drodze. Jezeli istnieje inne rozwiazanie problemu prosze o informacje. Pozdrawiam P.S. Wyczytalem ze Atmega ma 8 licznikow.

    Nie denerwuj się, na początku nie podałeś o jakie silniki chodzi. Poza tym, jeśli chodzi o silniki krokowe, również jest mnóstwo stron i przykładów. Nie podałeś też, czy chodzi o silniki unipolarne, czy bipolarne.
    Proszę bardzo, żebyś nie mówił, że nie chcę pomóc. Kilka linków:
    Link
    Link
    Link
    Link
    Nie napisałeś również w jakim języku programujesz, a to też jest różnica.

    0
  • #14 27 Lut 2009 13:31
    dzarek1
    Poziom 13  

    Żeście się porozpędzali, a odpowiedzi jak nie było tak nie ma.
    bosman49, mogłeś nie pisać że chodzi o silniki, było by prościej, bo zapewne masz sterowniki na L297 a one potrzebują tylko przebiegu prostokątnego o wypełnieniu 50% (jeden okres - jeden krok).
    niestety nie napiszę ci jak to zrobić, bo sam bym chętnie takie coś sklecił :)
    Tak więc, może inaczej zadać pytanie: Jak z licznika atmegi zrobić generator fali prostokątnej o zmiennej częstotliwości ?
    Jeżeli mogę zasugerować, to prosił bym o podpowiedz w Bascomie, ten język rozumiem jak na razie o wiele lepiej niż C....

    0
  • #15 27 Lut 2009 14:05
    bosman49
    Poziom 9  

    Na poczatku dziekuje za zaangazowanie w moj problem . Moze uscisle o co dokladnie mi chodzi. Moze rzeczywiscie nie musialem nadmieniac ze chodzi mi o silniki krokowe poniewaz nie mam zamiaru PWM sterowac samego silnika. Ja mam sterownik silnika bipolarny A 3983. I on steruje fajnie. Ja tylko potzrebuje podac sygnal step. Potrzebuje generowc prostokat gdzie impuls gdzie jedynka (stan wysoki) jest taki sam caly czas a niski jest zmienny. ( W ten sposob zmieniam predkosc silnika).

    Czyli z tego rozumiem ze Atmega 128 posiada tylko 4 PWM ( czy osiem)?

    0
  • Pomocny post
    #16 27 Lut 2009 14:21
    janbernat
    Poziom 38  

    Atmega128 ma 4 liczniki a z nich ma 8 wyjść (po dwa) na
    8 PWM.
    Naprawdę ściągnij dokumentację, to jest tylko 386 stron.
    Wpisz w googla atmel AVR.

    0
  • #17 27 Lut 2009 15:04
    bosman49
    Poziom 9  

    Mam ksiazke avr atmega w praktyce (tam jest spec dla 128) i tylko iejasne bylo dla mnie ze ma 2 liczniki 8 bit dwa 16 bit i 8 Pwm. NIgdy jeszcze nie uzywalem pwm i tylko chcialem sie upewnic czy bede w stanie wygenerowac osiem przebiegow zanim go nabede.

    A jesli chodzi o zmiane nastaw klawiatury to w czasie zmiany nastaw nie wychodze z przerwania . A zmiana od 0 do 99 zajmuje nawet do 10 sek. Testowanie klawiatury tez troche zajmuje bo jest to rozwiazanie Atmela z tablica gdzie najpierw jest testowa kolumna a potem wiesz ( przyciskow jest 25). To tez troche zajmuje. Wiec nie bede zmienial predkosci silnika po zmianie o jednostke za kazdym razem tylko po calkowitej zmianie wartosci np o 20 jednostek.

    A propos jezyka to robie to w Bascomie.

    0
  • #18 27 Lut 2009 16:20
    megaman123
    Poziom 13  

    A nie próbowałeś myśleć nad tym rozwiązaniem co napomniałem u góry ? Może nie kompletne , nie ten język ale używa jednego timera ( nie trzeba szukać jakiś mutantów ) .

    0
  • #19 27 Lut 2009 23:05
    janbernat
    Poziom 38  

    PRZED pisaniem programu należy wymyślić CO to ma robić i
    JAK to zrobić.
    Dalej twierdzę że megaman123 ma rację i że przerwanie
    NIE może być obsługiwane przez sekundy jeśli procesor RISC ma czas wykonywania instrukcji 0.1mikrosekundy.
    To co robisz jest jakieś 1000000 do 10000000 razy za długo.

    0
  • #20 27 Lut 2009 23:40
    bosman49
    Poziom 9  

    PWM chyba odpada poniewaz za malo licznikow (rozumiem juz jaka jest roznica miedzy jednym licznikiem a dwoma pwm). Przemyslalem rozwiazanie przy kawie. Niezle - tylko jak to poprzeliczalem to timer bede musial ustawic na 16us (62 kHz- taka czestotliwosc dla max speed) bede zliczal 62500 impulsow ( 1 s) i w odpowiednim momencie zalaczal jakies tam wyjscia (umieszcze to w tablicy). Tylko co z obsluga klawiatury ktora tez pracuje w przerwaniu a obsluga dla jednostkowej zmiany zajmue ok 50 ms. Jak ustawic priorytety?

    0
  • #21 28 Lut 2009 08:11
    megaman123
    Poziom 13  

    Dla języka C razem z wektorem przerwań można podać dodatkowy parametr :

    ISR(XXX_vect, ISR_NOBLOCK)
    {
    ...
    }

    Co automatycznie , po wejściu do obsługi odblokuje globalną flagę pozwolenia na przerwanie . Mógłbyś zrobić tak , że w samej obsłudze dla timera , jako pierwszej instrukcji użyć sei - globalne pozwolenie.
    Ew. jeszcze inaczej : Stworzyć globalną zmienną np. o nazwie przykładowej : keyevent , symbolizującą flagę przerwania od klawiatury no i w obsłudze przerwania ustawiać tą flage : keyevent = 1 , a w glownej petli sprawdzac ten warunek . Jeśli 1 , to wykonać dokładnie to co miało być wykonane w przerwaniu , i flagę wyzerować . Poprostu przeniesiesz wykonanie przerwanie do maina :)

    w C wyglądałoby to mniej więcej tak :

    Code:
    ISR(INT0_vect )
    
        {
            keyevent = 1;
        }

    main()
        {
         .
         .
         .
         while(1)
             {
             if(keyevent)
                 {
                  .
                  .
                  .
                  keyevent = 0 ;
                 }
              .
              .
              .
              }
        }

    0
  • #22 28 Lut 2009 11:48
    janbernat
    Poziom 38  

    Samo sprawdzanie drgań klawiszy to ok.25ms
    a gdy wszystkie silniki będą potrzebowały po 1kHz to sygnały trzeba wystawiać 8 razy w ciągu 1ms czyli co 0.125ms.
    Dla kwarcu 16MHz daje to 2000 cykli.
    Chyba tak jak megaman.
    W przerwaniu sprawdzić czy klawisz wciśnięty,
    zapamiętać który i ustawić jakiś timer.
    Wrócić do głównego programu.
    Po 25 ms sprawdzić czy ten sam wciśnięty.
    Jeśli tak to wejść w procedurę obsługi klawiszy
    która musi się zmieścić w 0.125ms
    Jak się nie da, to trzeba się chyba podeprzeć
    jakimś sprzętem(liczniki programowalne)

    0
  • #23 28 Lut 2009 11:59
    megaman123
    Poziom 13  

    Ja osobiście użyłbym nawet delay'ow które są dołączane biblioteką - i znów nie wiem jak to w Bascomie jest .

    Ale jeśli wszystko będziemy robić poza , obsługą przerwania dla klawiatury to nic nie przeszkadza timerowi dalej generować zadane przebiegi :)

    0
  • #24 28 Lut 2009 12:49
    janbernat
    Poziom 38  

    W bascomie też jest delay.
    Ale wydaje mi się że to jeszcze pogorszy sprawę.
    I też można uruchomić przerwanie
    w przerwaniu.
    Ale trochę się zastanawiam nad tym 1kHz.
    Ja do silnika przy pracy ćwierćkrokowej daję 16kHz
    co dla pełnego kroku daje 4kHz.
    Oczywiście zależy to od silnika.
    Można dać rozwiązanie "siłowe":
    8 procesorów ATtiny po2-3 zł do generowania sygnałów
    i jeden "master" do obsługi klawiatury i wysyłania sygnałów przez SPI lub I2C.

    0
  • #25 28 Lut 2009 13:22
    hotdog
    Poziom 26  

    jeżeli nie potrzebujesz drastycznej dokładności np zadowolą ciebie częstotliwości 1khz / potęgi 2 (1kHz, 500Hz, 250Hz, 125Hz...) to ja bym to tak zrobił:

    Code:

    #define MOTOR_PORT PORTC;
    #define MOTOR_DDR DDRC
    int main(void)
    {
       MOTOR_DDR = 0xFF;
       while(1);
       return 0;
    }
    volatile uint8_t wsp[8]={1,2,4,8,16,32,64,128}; //współczynniki zmieniaj w zależności od potrzeb. Pierwszy tyczy się silnika pod PC7 itd. Im większy tym mniejsza częstotliwość
    volatile uint8_t counter = 0;
    void motor() //funkcje uruchamiaj w timerze co 1KHz
    {
       MOTOR_PORT = 0;
       uint8_t i,temp;
       for(i=0;i<8;i++)
       {
          if (!(counter % wsp[i]))    // czy reszta z dzielenia zero
             temp |=0x01;
          temp<<=1;
       }
       MOTOR_PORT = temp;
       if (counter == 255)
          counter = 0;
       else
          counter++;
    }


    Można by troche zoptymalizować kod nie używając modulo (tylko przesunięcia bitowe), bo to dzielenie będzie pamięciożerne. To rozwiązanie daje 8 stopniową regulację częstotliwości silników.

    Generalnie chodziło mi o to żeby ideę przedstawić. Nie wiem czy to wchodzi w grę bo nie pisałeś nic o dokładności.

    pozdrawiam

    0
  • Pomocny post
    #26 28 Lut 2009 13:23
    Chris_W
    Poziom 37  

    Jakie to mają być w końcu te częstotliwości?
    Możesz zrobić wszystko synchronicznie względem 1 timera który służy tylko do odmierzania stałego 'rytmu'. A sygnały generujesz software'owo bazując na cyklach tego timera. Np. 1-83cykle, 2-122cykle,3-12cykli. Klawiaturę możesz odświerzać z jedną z tych częstotliwości.

    0
  • #27 02 Mar 2009 23:50
    bosman49
    Poziom 9  

    Juz odpowiadam. Po kilku testach przeprowadzonych na moich krokowcach musialem zmienic troche czestotliwosc. Maksymalna czestotliwosc to 3 khz dla max speed. Rozwiazalem to na jednym, liczniku ktory nabija 6 kHz. Nastepnie dziele te czestotliwosci (1,5 , 07 itd...) Wprzeraniu zliczam Impulsy dla wszystkich osmiu silnikow i jesli osiagne odpowiednio niska czestotliwosc zeruje licznik jednostek czasowych czyli moje czestotliwosci i licze od nowa. Zrobilem to dla 5 siu silnikow mam nadzieje ze bascom da rade z extra trzema silnikami. No niestety poczulem juz slabosci basom (kiedy zwiekszylem czestotliwosc to program juz nie wychodzil prawie z przerwania i nie bylo czasu juz na wyswietlacz). Czy bascom ma problemy z tablicami-jakis koszmar -dziwne rzeczy i przeklamania sie zdarzaja ( czy bascom numeruje od zera czy od jedynki- mam wrazenie ze zmienne sie nakladaja. Zamiast tablic uzywam tysiaca zmiennych. Chce sprobowac w C . Czy jest wogole jakis kurs dla C dla avr. Sciagnalem El. P kurs ale jakis on dziwny. Czy mozecie cos polecic innego.

    0
  • #28 03 Mar 2009 20:46
    janbernat
    Poziom 38  

    Bascom tablice numeruje od 1.
    Można w nim zrobić tylko tablice jednowymiarowe.
    Ale masz w Atmedze128 4 liczniki.
    Nigdy nie robiłem nic na ATmega128.
    Ale właśnie ściągnąłem datasheet i widzę że timer3 ma 3 rejestry OCR timer1 2 rejestry timer2 i timer0 po 1 rejestrze.
    To razem osiem.
    A jeszcze pojemność liczników ustawiana-to jeszcze 4.
    To są różne częstotliwości które można uzyskać.
    Sprawdzę jeszcze ile z nich jest wyprowadzone na zewnątrz.
    Ale ty też sprawdź.
    To jest zupełnie inna koncepcja, ale nie wiedziałem ile ATmega128 ma rejestrów porównania.
    To jest rozwiązanie sprzętowe-dużo szybsze.
    Nie wiem co z tego obsługuje Bascom.
    Ale jeśli nawet nie to możesz wstawić z Bascoma np.
    OCR3Ah=bajt1, OCR3A=bajt2 i będzie działało.

    Dodano po 4 [minuty]:

    A, jeszcze jedno.
    Sprawdź na płytkach sterowników do silników czy nie masz zworek ustawiających je w pracę półkrokową.(albo nawet ćwierćkrokową)
    Wtedy silniki chodzą płynniej ale częstotliwość na step jest
    x2 lub x4.
    Wtedy z przerwaniami może być jeszcze gorzej.

    Dodano po 53 [minuty]:

    Trochę sprawdziłem.
    OC3 ma trzy wyprowadzenia A, B, C.
    OC1 też ma trzy- ale jedno dzielone z z OC2.
    OC0 ma jedno.
    To razem siedem.
    Ale są jeszcze wyjścia z liczników.
    Da się sprzętowo-będzie śmigać.
    Ale nie tylko Bascom-datasheet i rejestry.

    0
  • #29 06 Mar 2009 22:52
    bosman49
    Poziom 9  

    Dzieki wszyskim za pomoc. wybralem rozwiazanie Chris_w - bylo dla mnie najprostsze. Na razie wszystko dziala. Mam pytanie na temat krokowcow. Jak wiadomo krokowce wykorzystywane sa do pracy krotkotrwalej a ja potrzebuje je wykorzystac do pracy ciaglej. Podczas pracy z maksymalna predkoscia silnik pracuje ok ale wraz ze spadkiem predkosci wzrasta ilosc wydzielanego ciepla.
    1. Jaka moze byc przyczyna wydzielania wiekszej ilosci ciepla przy mniejszej predkosci ?
    2. Silnik jest sterowany uniwersalnym bipolarnym sterownikiem. Czy zmiana pwm dla tej samej czestotliwoci moze miec znaczenie dla pracy silnika ( mam na mysli sygnal podawany na wejscie step sterownika silnika krokowego)?
    3. Jesli chodzi o optymalizacje predkosci (nie kodu) w bascom - co jest szybsze tablica trzyelementowa czy trzy zmienne, czy nie ma znaczenia?

    0
  • Pomocny post
    #30 07 Mar 2009 09:49
    Chris_W
    Poziom 37  

    1. Musisz mieć stały współczynnik U/f (I/f). Czyli zmieniając częstotliwość w górę musisz zwiększać prąd (np. przez wzrost napięcia). W drugą stronę podobnie zmniejszając f musisz ograniczać prąd.

    0