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

Bascom AVR - polecenie Config Servo

01 Paź 2006 16:06 5252 20
  • Poziom 10  
    Znalazłem informację o tym, że w BASCOM AVR jest wbudowane polecenie dotyczące pulsacyjnego (impulsowego) sterowania serwami, przy czym nie ma znaczenia, czy pod piny będą podpięte sterowniki serw czy silników krokowych, co jest oczywiście. W wszystko byłoby dobrze, gdyby nie to, że polecenie to korzysta z przerwań zegara Timer0 ustawionych na stałą (podawaną oczywiście) wartość interwału czasowego dla wszystkich serw jednocześnie. To jest niestety bezużyteczne!

    Dlaczego? Dlatego, że w większości przypadków chcemy, aby serwa zadziałały tak, by koniec maipulatora poruszał się po zadanej trajektorii, co WYMUSZA (!!!) zastsowanie różnych interwałów dla każdego z poruszanych serw.

    Przykład: frezarka 3 osiowa CNC. Mamy poruszyć maszynę z np. 0,0,0 o wektor 100,200,30. Musi być to wykonane współczasowo (jedncześnie - np w ciągi 1 sek.), tak więc do każdej z osi (serw) wyłać należy inną ilość imulsów w tym samym czasie.

    Pytanie: jak poradzić sobie Z takim problemem? Czy ktoś ma jakiś pomysł?
  • Poziom 26  
    rakuś napisał:
    przy czym nie ma znaczenia, czy pod piny będą podpięte sterowniki serw czy silników krokowych, co jest oczywiście.


    silniki krokowe i serwa steruje sie całkiem inaczej, config servo służy do sterowania serv modelarskich, nie do silników krokowych.


    rakuś napisał:
    W wszystko byłoby dobrze, gdyby nie to, że polecenie to korzysta z przerwań zegara Timer0 ustawionych na stałą (podawaną oczywiście) wartość interwału czasowego dla wszystkich serw jednocześnie. To jest niestety bezużyteczne!

    Dlaczego? Dlatego, że w większości przypadków chcemy, aby serwa zadziałały tak, by koniec maipulatora poruszał się po zadanej trajektorii, co WYMUSZA (!!!) zastsowanie różnych interwałów dla każdego z poruszanych serw.

    serwa poruszają się niezależnie tylko są sterowane z jednego timera.


    rakuś napisał:

    Przykład: frezarka 3 osiowa CNC. Mamy poruszyć maszynę z np. 0,0,0 o wektor 100,200,30. Musi być to wykonane współczasowo (jedncześnie - np w ciągi 1 sek.), tak więc do każdej z osi (serw) wyłać należy inną ilość imulsów w tym samym czasie.
    serwa modelarskie na pewno sie nie nadają do maszyn CNC, a prawdziwe serwa mają dedykowane sterowniki i steruje sie je cyfrowo.

    radzę trochę poczytać na początek

    pozdrawiam
  • Poziom 10  
    hunterhouse napisał:

    silniki krokowe i serwa steruje sie całkiem inaczej, config servo służy do sterowania serv modelarskich, nie do silników krokowych.


    Kolego - wciągnij się głębiej w temat, a nie odpowiadaj, jak nie wiesz. Podstawą jest wysyłanie impulsów do sterownika (układu sterującego - np. IMT901). Ten układ wysterowuje silnik na podstawie generowania impulsów taktu i kierunku. Sporo wiem o CNC. Zbudowałe maszynę, 2 zupełnie różne sterowniki i sam je umiem oprogramować. A Ty poczytaj forum www.cnc.info.pl.

    hunterhouse napisał:

    [...]config servo służy do sterowania serv modelarskich, nie do silników krokowych


    Czytałeś opis tej funkcji? Przecież tam jest wyraźnie napisane, że generowane są impulsy o czasie trwania określonym zmienną Reload. Może nadaje się to do serw cyfrowych, ale raczej nie do standardowych modelarskich serw analogowych, bo te sterujemy napęciowo i to w znikomym zakresie rzędu 0.6V. A nawet jeśli rzeczywiście tak jest, bo w końcu można sterować wypełnieniem impulsu, to tą metodą nie można tego robić newspółbieżnie, o co mi chodzi.

    hunterhouse napisał:

    serwa poruszają się niezależnie tylko są sterowane z jednego timera.


    No masz rację, ale nie chodzi o niezależność serw, bo ona jest oczywista, tylko o ich niewspółbieżne i współczasowe sterowanie. Przeczytaj dobrze, co napisałem.

    hunterhouse napisał:

    radzę trochę poczytać na początek


    A ja proszę czytać to, co jest napisane i odpowiadać, gdy się wie, a nie przypuszcza, że wie. Czy to będą serwomotory (w sensie ich sterowniki), czy silniki krokowe (w sensie sterowników) czy serwa modelarskie (wysterowywane zupełnie inaczej, bo napięciowo - czyli analogowo, nielicząc tych cyfrowych) to nie ma znaczenia. Chodzi mi jedynie o współczasowe, zróżnicowane w długości trwania zmiany stanów wysokich i niskich (impulsy) na dowolnych pinach wyjściowych, wysyłane w jednej jednostcz czasowej, ale nie jednocześnie.

    Pomyślcie o tym, jakby to była praca na oddzielnych timerach, każdy działający z inną częstotliwością, a jest ich powiedzmy 8 (dla 4 osi).
  • Poziom 26  
    tak się składa że też jestem troche zainteresowany tematem CNC i czesto czytam www.cnc.info.pl z tym że raczej tam nie pisze.
    a co do AVR i Bascoma to mam bardzo duże doświadczenie w tym temacie, i niepróbuje kolegi wprowadzić w maliny.

    więc sterowniki sermomotorów i silników krokowych w CNC steruje się cyfrowo tak jak kolega pisze sygnałami
    DIR - kierunek
    STEP - następny krok
    i czasami Enable - luzowanie silnika

    i jeśli kolega chce sterować taki napęd z uP to niepotrzebne jest urzywanie config servo.

    teraz serwa modelarskie to takie małe silniczki z sterownikiem i przekłądnią w jedym. i one obracają sie tylko o około 270° (zależy od wykonania serva modelarskiego) steruje sie je w dość dziwny sposub. co 20ms trzeba im wysłać impuls o długości od 1 do 3 ms. zależnie od długości tego sygnału serwo na wyjscu ustawi siew odpowiednim stanie
    dla 1ms w jedym koncu
    dla 2ms w pozycji środkowej
    dla 3 ms w drógiej skrajnej pozycji

    tak że jak kolega widzi nazwanie serva (serwa modelarskiego) i serva (serwomotoru do zastosowań przemysłowych takich jak maszyny CNC) to nieporozumienie. i to całekim inne rzeczy.

    config serwo korzysta z jedego timera do odliczania czasu ale jest tak zrobione że nawet dla 8 serv modelarskich każde można obrucić o inny kąt i robić to niezależnie a ustawienia te zapisuje sie w tablicy servo(8)
    nawiasem mówiąc config servo w bascomie działa tak sobie i do bardziej precyzyjnego sterowania sienie nadaje i trzeba to pisać na piechotę.

    może kolega napisze dokłądniej co chce sterować i w jaki sposub, to coś doradzimy.

    pozdrawiam
  • Poziom 10  
    Cytat:
    tak że jak kolega widzi nazwanie serva (serwa modelarskiego) i serva (serwomotoru do zastosowań przemysłowych takich jak maszyny CNC) to nieporozumienie. i to całekim inne rzeczy.


    I tu kolego znów się mylisz. Serwo modelarskie poza tym, że obraca się tylko o niewielki kąt to w istocie rzeczy jest zbudowane podobnie do serw przemysłowych. Może kolega o tym nie wie, ale oba serwa mają oprócz silników i przekłdni tzw. pozycjonery. W serwie modelarskim jest to najczęściej potencjometr, bo serwo takie działa w układzie nadążnym. Natomiast serwo przemysłowe ma tzw. enkoder, różniący się jedynie tym, że przy jego pomocy zliczane są n-te części obrotu.

    Serwem modelarskim można sterować napięciowo. Układ dostaraja się (obraca) do momentu, gdy wartość spadku napięcia na potencjometrze pozycjonującym zrówna się z wartością podawaną.

    Ale do sedna, bo nigdy nie wyjdziemy z tego pata. Już napisałem w pierwszym poście co chcę zrobić!!! (dobrze jest czytać poprzednie posty, wiadomo wtedy, o co w nim chodzi).

    Jest tak: należy w jednym czasie przemieścić 3 silniki krokowe (lub serwa), każde o różną ilość impulsów. Jak to zrobić w Bascomie, skoro wg Ciebie polecenie Config Servos jest niezbyt precyzyjne? Serwa przemieszczasz wysyłając tylko na przemian stany wysokie i niskie. Między stanem wysokim i niskim na pinie odpowiedzialnym za krok robimy przerwę, z której będzie wynikała prędkość impulsowania.

    Każdą oś przesuwam o inną ilość kroków w tym samym czasie. Czyli interwał impulsów dla danej osi jest sumarycznie różny. Wyliczam, że np. potrzebuję wysłać 4350 kroków w osi X, 2340 w osi Y i 235 kroków w Z.

    Dane:
    stałe: Pin1 = KROKX, Pin2 = KIERX... Pin5 = KZ, Pin6 = KIERZ...

    Algorytm:
    kierunek osi w tym momencie nie istostny;

    stan wysoki = 1, stan niski = 0, kroków do wykonania = k

    wyliczam interwały dla każdej osi (względem najdłuższej, czyli tej którą trzeba przesunąć najdalej);
    dx=k/X, dy=k/y, dz=k/Z;

    Pin2 = 1 jeśli kręcimy w prawo, albo = 0 jeśli w lewo.
    Pin4 = 1 jeśli kręcimy w prawo, albo = 0 jeśli w lewo.
    Pin6 = 1 jeśli kręcimy w prawo, albo = 0 jeśli w lewo.

    dla k powtórzeń w najdłuższej osi wykonaj:
    jesli k+dx to Pin1 = 1
    jesli k+dy to Pin3 = 1
    jesli k+dz to Pin5 = 1
    sumuj wartości [Pin1...Pin6]
    wyslij do portu,
    poczekaj założony interwał czasowy,
    Pin1 = 0; Pin3 = 0; Pin5 = 0;
    sumuj wartości [Pin1...Pin6]
    wyslij do portu,
    k = k+1
    koniec

    Czy ten algorytm jest dla Kolegi jasny?
  • Poziom 26  
    hmm dalej nie rozumiem. znaczy się trochę rozumiem ale nie wiem do końca jaki jest cel całego urządzenia. czy to ma być urządzenie będzie generować sygnały dla sterowników napędu w maszynie cnc czyli będzie robić to co normalnie robi komputer??

    a może ma to być sterownik silnika krokowego lub DC który będzie odbierał sygnały z kompa i sterował bezpośrednio (za pomocą tranzystorów) silnikami.

    co do samego algorytmu to raczej radził bym napisać go na piechotę. AVRy mają 3 niezależne timery i każdy może generować przerwania, więc można to zrobić ręcznie tylko niech kolega napisze dokładnie w jakie miejsce to urządzenie ma być wpięte i czym sterować.

    pozdrawiam
  • Poziom 10  
    hunterhouse napisał:
    hmm dalej nie rozumiem. znaczy się trochę rozumiem ale nie wiem do końca jaki jest cel całego urządzenia. czy to ma być urządzenie będzie generować sygnały dla sterowników napędu w maszynie cnc czyli będzie robić to co normalnie robi komputer??


    Tak. Bo komputer pod Windowsami nie jest w stanie wygenerować odpowiedniej ilości impulsów jednocześnie z analizą danych i przedstawieniem ich graficznie na komuterze. Potrzeba do tego co najmniej uruchomienia 3 procesów jednocześnie. Albo, sterować pod DOSem. Polecam stronę:

    http://www.boenigk-electronics.com/pl

    hunterhouse napisał:
    a może ma to być sterownik silnika krokowego lub DC który będzie odbierał sygnały z komputera i sterował bezpośrednio (za pomocą tranzystorów) silnikami.


    A po co? Są świetne, specjalizowane sterowniki silników krokowych.

    hunterhouse napisał:
    co do samego algorytmu to raczej radził bym napisać go na piechotę. AVRy mają 3 niezależne timery i każdy może generować przerwania, więc można to zrobić ręcznie tylko niech kolega napisze dokładnie w jakie miejsce to urządzenie ma być wpięte i czym sterować.


    Kolega widzę nie bardzo potrafi zanalizować to, co ja podaję. Proszę może jacyś inni są w stanie doradzić (pomóc) w tej kwestii?
  • Poziom 17  
    rakuś napisał:
    Proszę może jacyś inni są w stanie doradzić (pomóc) w tej kwestii?

    To skoro kolega prosi, to ja też napiszę, chociaż widzę, że kolega sam wie najlepiej i też zaraz zostanę zrugany :D .
    1. Na początek serwa modelarskie - sterowane są dokładnie tak, jak pisze hunterhouse z tą uwagą, że standard większości producentów przewiduje 1.5ms środek serwa a 1.5ms±0.5ms to położenia skrajne. Takie impulsy są powtarzane z interwałem 20ms. Nie spotkałem się z serwem modelarskim sterowanym napięciem.

    2. Sterowanie CNC: napisałeś "Czyli interwał impulsów dla danej osi jest sumarycznie różny" - ja się poddaję, może ktoś jest w stanie zrozumieć o co chodzi :?:
    Poza tym to komplikujesz strasznie. Jeżeli chcesz liczyć te interwały to przecież sprawa jest prosta. Pomijając kierunek i zezwolenie to przecież algorytm jest prosty - oś w której masz wykonać największą liczbę kroków pulsujesz z maksymalną częstotliwością (najktótszy interwał) zależną od sterownika silników, samych silników, mechaniki twojej maszyny etc. Tę wartość po prostu musisz znać i tyle. Oczywiście możesz to robić wolniej - wydłuży się czas wykonania zadania przez maszynę.
    Cząstotliwość pulsowania w pozostałych osiach ma być proporcjonalna do ilorazu ilości kroków w danej osi do tej, w której wykonujemy najdłuższy ruch. Mówiąc o interwałach to interwał ma być proporcjonalny do odwrotności wyżej wspomnianego ilorazu. Tak wyliczonymi wartościami odpowiednio karmisz timery uC i w przerwaniach robisz pulsy.
    Tyle filozofia sterowania wg mojego stanu wiedzy, a zarówno serwami modelarskimi jak i CNC wg powyższej wiedzy udaje mi się sterować :D
    Jak zwykle diabeł będzie tkwił w szczegółach i te szczegóły będziesz musiał rozwikłać sam bo sądząc po twoich reakcjach na posty "niosące pomoc" to grono chętnych do pomocy szybko stopnieje :cry: .
    I już tak zupełnie na koniec dwie sprawy
    - bascom'owe config servos zupełnie nie nadaje się do sterowania CNC gdzie napędem są silniki krokowe :D a i do modelarskich też nie bardzo, bo albo bascom wygeneruje duża tablicę i zajmie mnóstwo pamięci, albo rozdzielczość sterowania będzie marna :cry:
    - hunterhaus - czy możesz napisać na ile moja wypowiedź jest dla ciebie zrozumiała :?:
  • Poziom 10  
    zbig_wwl napisał:
    To skoro kolega prosi, to ja też napiszę, chociaż widzę, że kolega sam wie najlepiej i też zaraz zostanę zrugany :D .
    1. Na początek serwa modelarskie - sterowane są dokładnie tak, jak pisze hunterhouse z tą uwagą, że standard większości producentów przewiduje 1.5ms środek serwa a 1.5ms±0.5ms to położenia skrajne. Takie impulsy są powtarzane z interwałem 20ms. Nie spotkałem się z serwem modelarskim sterowanym napięciem.


    Ok. Dziękuję i zamknijmy tę kwestię. Widziałem sterowanie napięciowe, ale w tej kwestii mogę się mylić - nie jestem elektronikiem.

    zbig_wwl napisał:
    2. Sterowanie CNC: napisałeś "Czyli interwał impulsów dla danej osi jest sumarycznie różny" - ja się poddaję, może ktoś jest w stanie zrozumieć o co chodzi :?: Poza tym to komplikujesz strasznie. Jeżeli chcesz liczyć te interwały to przecież sprawa jest prosta. Pomijając kierunek i zezwolenie to przecież algorytm jest prosty - oś w której masz wykonać największą liczbę kroków pulsujesz z maksymalną częstotliwością (najktótszy interwał) zależną od sterownika silników, samych silników, mechaniki twojej maszyny etc. Tę wartość po prostu musisz znać i tyle. Oczywiście możesz to robić wolniej - wydłuży się czas wykonania zadania przez maszynę.


    1. Nie komplikuję, bo 3 timery nie wystarczą. Chcę zrobić sterownik uniwersalny do sterowania max. 6 osiami z krańcówkami z podawaniem informacji zwrotnej do PCta.

    2. Tę wartość muszę znać, czyli wyliczyć. Oczywiście! Dokładnie to napisałem w algorytnie powyżej. Tyle, że nie biorę pod uwagę przerwań timerów, bo timery wg mojej wiedzy są tylko 3, a to zdecydowanie za mało. Chcę, tak jak w algorytmie powyżej użyć jednego timera i dla każdej osi wyliczać procentowo interwał impulsowania danej osi względem osi o największej ilości impulsów do wysłania.

    zbig_wwl napisał:
    Cząstotliwość pulsowania w pozostałych osiach ma być proporcjonalna do ilorazu ilości kroków w danej osi do tej, w której wykonujemy najdłuższy ruch. Mówiąc o interwałach to interwał ma być proporcjonalny do odwrotności wyżej wspomnianego ilorazu. Tak wyliczonymi wartościami odpowiednio karmisz timery uC i w przerwaniach robisz pulsy.


    No właśnie tak! Tyle, że muszę się podpiąć pod jeden timer. Dwoma innymi chcę sprawdzać stany krańcówek i wyłącznika awaryjnego oraz poawać informacę zwrtoną do PC i na LCD o stanie, w jakim obecnie jest wykonywanie ruchów. A na którymś z przerwań Int0 lub Int1 będę pobierał kolejne informacje o ruchach do wykonania.

    zbig_wwl napisał:
    Tyle filozofia sterowania wg mojego stanu wiedzy, a zarówno serwami modelarskimi jak i CNC wg powyższej wiedzy udaje mi się sterować :D Jak zwykle diabeł będzie tkwił w szczegółach i te szczegóły będziesz musiał rozwikłać sam bo sądząc po twoich reakcjach na posty "niosące pomoc" to grono chętnych do pomocy szybko stopnieje :cry: .
    I już tak zupełnie na koniec dwie sprawy - bascom'owe config servos zupełnie nie nadaje się do sterowania CNC gdzie napędem są silniki krokowe :D a i do modelarskich też nie bardzo, bo albo bascom wygeneruje duża tablicę i zajmie mnóstwo pamięci, albo rozdzielczość sterowania będzie marna :cry:


    No i o o mi chodziło! Takiej odpowiedzi oczekiwałem!!! A czy potrafiłbyś napisać dla mnie taki algorytm? Niestety nie mam programatora ani płytki testowej.

    zbig_wwl napisał:
    - hunterhaus - czy możesz napisać na ile moja wypowiedź jest dla ciebie zrozumiała :?:


    Dla mnie jest!
  • Poziom 26  
    zbig_wwl napisał:

    - hunterhaus - czy możesz napisać na ile moja wypowiedź jest dla ciebie zrozumiała :?:
    dla mnie tak :) a tak w ogóle to huntrehouse ale luz :)

    teraz kolega rakuś widzi że nie tylko ja miałem problemy ze zrozumieniem problemu

    czyli napiszmy to jasno, ukontroler dostaje z PC wektor o jaki musi przesunąć frez, czyli x, y, z, no i jakaś informacja o czasie jaki na to mamy , lub prędkosci freza, bo inaczej to bez sensu.
    ja bym to zrobił tak:
    ustawił przerwanie timera na 10kHz, z takim czasem powinniśmy się wyrobić a rozdielczość będze zadowalająca.

    teraz tak znając czas potrzebny na wykonanie ruchu i czestotiwośc przerwań możemy wyliczyć ile przerwań mamy na wykonanie ruchu

    teraz w każdym przerwaniu liczymy
    x=(nr. aktualnego przerwania)*(ilośc ktoków do wykonania przez oś X)/(iośc przerwań które mamy na wykonanie ruchu)
    teraz x to będzie ilość kroków w którym silnik musi się znaleść, teraz wystarczy zapamiętać wartość z poprzedniego liczenia i porównać , jeśli poprzedni wynik był mniejszy o 1 to bobimy krok silnikiem jeśli taki sam to nic nie robimy. takie coś w przerwaniu należy wykonać dla każdej osi osobno.


    jeśli kolega chce to moge sprubować przepisać to w bascomie ale potrzebował bym wiecej danych, np: w jakim sposub program dostanie czas jaki mamy na wykonanie przesunięcia, a moze to będzie prędkość freza oraz jakie będą zakresy liczb kroków, niemoze być za duzo bo AVR to 8-bitowce i zaduże liczby bardo go spowolnią.

    pozdrawiam
  • Poziom 10  
    hunterhouse napisał:
    teraz kolega rakuś widzi że nie tylko ja miałem problemy ze zrozumieniem problemu


    No moi drodzy - analiza wymaga czytania! Nawet Lenin mawaił: CZYTAĆ!

    hunterhouse napisał:
    czyli napiszmy to jasno, ukontroler dostaje z PC wektor o jaki musi przesunąć frez, czyli x, y, z, no i jakaś informacja o czasie jaki na to mamy, lub prędkosci freza, bo inaczej to bez sensu.


    No wreszcie kolega zrozumiał. Brawo!

    hunterhouse napisał:
    ja bym to zrobił tak:
    ustawił przerwanie timera na 10kHz, z takim czasem powinniśmy się wyrobić a rozdielczość będze zadowalająca.


    10kHz dla krokowców wystarczy, ale dla serw nie bardzo.

    Q1. Czy jeśli ATTINY2313 jest traktowany częstotliwością 20 MHz oznacza, że przerwanie timera może być równie często generowane?

    Q2. Przypuśćmy, że parametry maszyny są następujące: enkoder 500 imulsów na obrót, posuw 5mm/obrót, prędkość docelowa 1m/s (dla serw to nie powinien być problem). Czyli na 1mm wysyłamy 100 impulsów, na 1 m 10000 impulsów. I to przy marnym enkoderze (a są przecież takie, któe mają rozdzielczość 25000/obrót). Czy coś więcej z ATTINY da się wyciągnąć, czy trzeba myśleś o tym nowym 32-bitowym?

    hunterhouse napisał:
    jeśli kolega chce to moge sprubować przepisać to w bascomie ale potrzebował bym wiecej danych, np: w jakim sposub program dostanie czas jaki mamy na wykonanie przesunięcia, a moze to będzie prędkość freza oraz jakie będą zakresy liczb kroków, niemoze być za duzo bo AVR to 8-bitowce i zaduże liczby bardo go spowolnią.


    1. Duże liczby nie wchodzą w grę. Zwykły integer powinien wystarczyć.
    2. Dane do ATTINY będziemy wysyłać w posaci ciągów ruchów zakodowanych np:

    >XXXXXXYYYYYYZZZZZZKXKYKXSPEED

    gdzie:

    XXXXXX, YYYYYY, ZZZZZZ - to ilość impulsów do przesłania do odpowiedniego Pinu procesora (ruch osi),
    KX, KY, KZ zmienna kierunku (np. 0- prawo, 1- lewo),
    SPEED - prędkość (częstotliwość impulsowania). Może być też pobierana z przetwornika A/C - czyli regulowana potencjometrem.

    Jesteś w stanie takie coś napisać? Jakie jeszcze dane potrzebujesz?
  • Poziom 17  
    hunterhouse napisał:
    a tak w ogóle to huntrehouse

    Sorry - w sumie nie wiedziałem, że mam dyslekcję i to w wydaniu angielskim :D ale oduszczam sobie grzech, bo widzę, że sam pomyliłeś się w swoim pseudo :D .

    do kolegi rakuś
    Co do sterownika to ja odpuszczam - myślałem, że chodzi o pomoc w wykonaniu a nie wykonanie - skoro nie masz nawet programatora, to co ci pomoże to, że nawet ktoś ci ten program napisze ? Poza tym napisanie kodu (pierwszej wersji) takiego sterownika to 5% pracy - reszta to uruchomienie go i doprowadzenie do użyteczności.
    (zastrzegam, że podane 5% to wg. mojej osobistej pracowni badań opinii publicznej wykonującej badania na mnie samym i wynik może być całkiem nieadekwatny do możliwości reszty społeczeństwa :D)
  • Poziom 26  
    jakby kolega na początku napisał o co mu chodzi to było by mniej problemów.

    Cytat:
    Q1. Czy jeśli ATTINY2313 jest traktowany częstotliwością 20 MHz oznacza, że przerwanie timera może być równie często generowane?

    niestety nie. 20MHz to czestotliwośc taktowania, timerów i rdzenia.
    samo wywołanie przerwania i potem wyjście z niego to około 15 cykli.
    jak będziesz to pisął w bascomie to w sumie potrzeba ze 100instrukcji na odłożenie wszystkoego na stosie i podobne rzeczy. do tego dochodzi to co w przerwaniu sie znajduje to też zajmuje czas, a jak bedzie trzeba liczyć na dużych liczbać to bedzie siejeszcze przedłuzać.

    Cytat:
    2. Przypuśćmy, że parametry maszyny są następujące: enkoder 500 imulsów na obrót, posuw 5mm/obrót, prędkość docelowa 1m/s (dla serw to nie powinien być problem). Czyli na 1mm wysyłamy 100 impulsów, na 1 m 10000 impulsów. I to przy marnym enkoderze (a są przecież takie, któe mają rozdzielczość 25000/obrót). Czy coś więcej z ATTINY da się wyciągnąć, czy trzeba myśleś o tym nowym 32-bitowym?
    1m/s ?? czy 1 mm/s bo jak 1 m/s to co to za maszyna ??

    jeśli trzeba by generować 10 000 impulsów na sekunde to zeby uzyskać w miare liniowośc to nalezało by mieć przerwanie 10 razy cześciej czyli 100 000 razy na sekunde. procesor dział na 20 000 000 czyli na jedno przerwanie mamy 200 cykli, hmm mało ale w asm dało by się coś zrobić, chyba :D dla jednej osi napewno, ale przerwanie musi być mądrze napisane

    ADD:
    zbig_wwl napisał:
    hunterhouse napisał:
    a tak w ogóle to huntrehouse

    Sorry - w sumie nie wiedziałem, że mam dyslekcję i to w wydaniu angielskim :D ale oduszczam sobie grzech, bo widzę, że sam pomyliłeś się w swoim pseudo :D .

    ale wtopa :D ale ja też mam dys...... cały komplet więc niema sprawy rozumiem to :D
  • Poziom 10  
    0. Tak, 1m/s nie 1mm/s. Przy serwach to nie jest problem.

    1. Panowie, nie macie dysgrafii i dysleksji, tylko nie chce się Wam zwyczajnie czytać. Czem pomagają solidne pasy od ojca.

    2. Czy to jest grzech, że nie mam kompilatora i programatora? Nie mam i nie chcę mieć - całą sprawę chętnie zlecę. A jak widzicie wiem czego chcę, czyli co ma być na tych pinach, o które pytał Hounterhouse.

    Ergo (czyli) pomogliście mi w następujących kwestiach:

    a. polecenie Config Servos nie nadaje się do moich celów,
    b. trzeba skorzystać z jednego timera,
    c. timer generuje przerwanie co 15 cykli.

    Czy uważacie, że program taki musi być pisany w asemblerze, czy można spróbować w Bascomie?

    Kto podejmie się współpracy w stworzeniu takiego sterownika i napisaniu oprogramowania?
  • Poziom 26  
    rakuś napisał:
    timer generuje przerwanie co 15 cykli.

    nie co 15 cykli tylko tyle trwa minimalny czas obsługi przerwania. przerwanie można generowac co różny czas zależny od wartości wpisanej w odpowiednie rejesty, maxymalni może to być nawet kilka sekund a minimalnie około 15 cykli.

    teraz niestety niemam czasu ale wieczorem sprubuje coś więcej pomyśleć.

    czy było by do zaakceptowania stosowanie 3 uP do każdej osi osobny ??
    albo nalezało by zastosować osobne przerwania do każdej osi
  • Poziom 10  
    hunterhouse napisał:

    teraz niestety niemam czasu ale wieczorem sprubuje coś więcej pomyśleć.

    czy było by do zaakceptowania stosowanie 3 uP do każdej osi osobny ??
    albo nalezało by zastosować osobne przerwania do każdej osi


    Jasne, że tak! Tylko jak zrobić ich synchronizację?

    Może inaczej: jeden procek do sterowania, drugi do krańcówek i trzeci do wymiany danych z PC?
  • Poziom 17  
    Pogubiłem się całkowicie :D

    Kolego rakuś - czytać, czytać, czytać .... , czyli stosować się do własnych rad :D . Nigdzie nie jest napisane, że timer generuje przerwanie co 15 cykli zegara - napisane jest, że samo wejście i wyjście do/z obsługi przerwania zajmuje ok. 15 cylki zegara.
    Nigdzie też nie jest napisane, że mam dysleksję :D, chociaż nie twierdzę, że nie mam - jak chodziłem do szkoły dysleksja była mało popularna, więc może jestem przypadek niezdiagnozowany :D

    Co do mojego pogubienia się - co masz na myśli mówiąc "serwo" :D . Widzę, że nie chodzi bynajmniej o sterowanie silnikiem krokowym, bo tu żaden enkoder nie jest potrzebny - to podstawowa zaleta tego silnika pośród szeregu wad.
    Sterowniki serw (moje rozumienie terminu "serwo") to wyższa szkoła jazdy. Tu się kłania kilka sposobów sterowania - w tym przypadku prędkościowy wydaje się optymalny. Ale to wymaga jakiegoś regulatora typu PID i to da się zrobić dobrze (optymalnie) tylko znając parametry mechaniczne napędzanego urządzenia.

    Pozdrawiam
  • Poziom 10  
    No nie wiem, dlaczego Panowie się tak szybko gubicie. Poza tym dajmy spokój wyższości "serw jedych nad drugimi" i innymi "15 taktami procesora" bo nie wyjdziemy na prostą!

    Z moich doświadczeń i obserwacji wynika, że każdy specjalizowany sterownik osi, czy to silika krokowego czy serwonapędu można wysterować za pomocą 2 standardowych połączeń (czytaj sygnałów sterujących) - krok i kierunek. To czy jest to serwomechanizm ze sterownikiem PID, czy np. bardzo popularny na cnc.info.pl ostatnio sterownik UHU - nie ma znaczenia.

    Polecam stronę: http://www.cnc-papst.de , gdzie (niestety po niemiecku) jest pokazany sterownik 3 silników krokowych (zostańmy już przy nich) działający na takiej zasadzie, jaką starałem się tu Wam - Panowie - przybliżyć.

    W nim ATTINY2313 odbiera polecenia wysyłane z PC przez RS232, interpretuje je i przesyła impulsy do kości sterujących, którymi są kości IMT901 (TA8345) - sterowniki silników krokowych.
  • Poziom 26  
    Code:
    ' czestotliwość
    
    $crystal = 20000000

    'procesorek Atmega8 mój ulubiony :)
    $regfile = "m8def.dat"
    '$regfile = "attiny2313.dat"

    'stosy, jak program będzie działał to mozna je pozminiejszać
    $hwstack = 32
    $swstack = 10
    $framesize = 10
    Const Ile = 12                                              ' ilość miejśc po przecinku w przyblizaniu, im wiecej tym dokładniej liczy ale mniejsze zakresy liczb

    'konfiguracja timera
    Config Timer1 = Timer , Prescale = 1 , Clear Timer = 1

    Stop Timer1
    Const Fps = 20000
    Const Tim1 =(_xtal / Fps) - 2
    On Compare1a Interrupt
    Enable Compare1a
    Enable Interrupts
    Compare1a = Tim1


    'zmienne o jaki wektor ma być przesunięty frazz, dane wejściowe
    Dim Wektor_x As Long
    Dim Wektor_y As Long
    Dim Wektor_z As Long


    'zmienne które mówią przy któym przerwaniu ma nasąpić następny krok
    Dim Wtedy_x As Long
    Dim Wtedy_y As Long
    Dim Wtedy_z As Long

    'zmienne mówiące ile kroków już zrobiono
    Dim Akt_x As Long
    Dim Akt_y As Long
    Dim Akt_z As Long

    'zmienne liczace przerania
    Dim Count As Long
    Dim Count_end As Long


    Dim Tmpx As Long
    Dim Tmpy As Long
    Dim Tmpz As Long

    Dim Alfax As Long
    Dim Alfay As Long
    Dim Alfaz As Long

    Gosub Zacznij                                               ' przesuń o wektor


    Do                                                          ' pusta pętla co by procesor się nie nudził jak niema co robić
    Waitms 100
    Loop





    Zacznij:

    'wpisanie wartości wektora, przykładowe dane
    Wektor_x = 54
    Wektor_y = 108
    Wektor_z = 216
    Count_end = 1000



    'zerowanie count
    Count = 0

    'ustawianie aktualnych pozycji kroków
    Akt_x = 1
    Akt_y = 1
    Akt_z = 1

    'obliczenie kiedy ma nastąpić 1 krok
    Alfax = Count_end
    Shift Alfax , Left , Ile
    Alfax = Alfax / Wektor_x

    Alfay = Count_end
    Shift Alfay , Left , Ile
    Alfay = Alfay / Wektor_y

    Alfaz = Count_end
    Shift Alfaz , Left , Ile
    Alfaz = Alfaz / Wektor_z

    Wtedy_x = Alfax * Akt_x
    Shift Wtedy_x , Right , Ile

    Wtedy_y = Alfay * Akt_y
    Shift Wtedy_y , Right , Ile

    Wtedy_z = Alfaz * Akt_z
    Shift Wtedy_z , Right , Ile


    'Wtedy_x = Count_end * Akt_x
    'Wtedy_x = Wtedy_x \ Wektor_x

    'Wtedy_y = Count_end * Akt_y
    'Wtedy_y = Wtedy_y \ Wektor_y

    'Wtedy_z = Count_end * Akt_z
    'Wtedy_z = Wtedy_z \ Wektor_z

    Timer1 = 0
    Start Timer1

    Return






    Interrupt:
    Incr Count

    'jeśli czas sieskończył to zatrzyman timer
    If Count = Count_end Then
       Stop Timer1
    End If

    ' jeśli mam zrobić krok to zrób i oblicz kiedy następny krok x3 dla każdej osi
    If Wtedy_x = Count Then
       'krok do przodu
       Incr Tmpx
       Incr Akt_x
       Wtedy_x = Alfax * Akt_x
       Shift Wtedy_x , Right , Ile
       'Wtedy_x = Count_end * Akt_x
       'Wtedy_x = Wtedy_x \ Wektor_x
    End If

    If Wtedy_y = Count Then
       'krok do przodu
       Incr Tmpy
       Incr Akt_y
       Wtedy_y = Alfay * Akt_y
       Shift Wtedy_y , Right , Ile
       'Wtedy_y = Count_end * Akt_y
       'Wtedy_y = Wtedy_y \ Wektor_y
    End If


    If Wtedy_z = Count Then
       'krok do przodu
       Incr Tmpz
       Incr Akt_z
       Wtedy_z = Alfaz * Akt_z
       Shift Wtedy_z , Right , Ile
       'Wtedy_z = Count_end * Akt_z
       'Wtedy_z = Wtedy_z \ Wektor_z
    End If



    Return


    coś takiego udało mi się naskrobać, nawet ładnie działa przynajmniej dla rozdzielczosci 1kHz, dla większej też działa ale nie miałem czasu sprawdzać przy ilu sie wykłada. wiem że dla 10khz już zdechnie.
    a wszystko przez dzielenie :( jedno zabiera około 800 cykli więc jak się trafia 3 w jednym obrocie to kicha, zrobiłem tak że przerwania mogą się zazębiać ale chwilami i to nie pomaga i chyba stosy się konczą albo co. narazie niemam więcej czas bo sam składam małą maszynkę cnc (konstrukcja czysto amatorska i bezbudrzetowa :D), to chyba dlatego mam na kolegę tyle cierpliwości :D

    w każdym razie jutro przy czasie sprubuje jakoś to zoptymalizować.
    jeszcze się odezwę :D

    ADD:
    jeden mały pomysł a ile może zmienić przezuiłem zerowanie timera na sprzęt, teraz dzieje się to automatycznie
    i wyelminowało to duzy błą, bo teraz jak układ dostanie zaduzó dzilelenia w jednej kolejce to poprostu pominie jeden cykl i poleci dalej z małym opużnieniem, zadne kroki nie będą pomienięte poprostu jeden z kroków troszkę się przedłuży ale to będą niewielkie przestoje prawdopodobnie nie zauważalne nawet.
  • Poziom 10  
    No stary [Hunterhouse], zaimponowałeś mi! Po pierwszych "wymądrzaniach" nie myślałem, że aż tak daleko zajdziemy. Wielkie dzięki!!!

    Mam jednak co do tego sterowania pomysł na troszkę inny algorytm, o którym Ci opowiem już na maila. O tyle jest to istotne, że może wspólnie zrobimy ten sterownik, a oprogramowanie jest właściwie napisane. W każdym razie jesteśmy, jak widzę, w stanie pójść w "jedynie słusznym kierunku" i zrobić coś fajnego.

    Podaj mi swojego maila i napisz skąd jesteś. Ja mieszkam w Warszawie.
    Mój mail: pwr(malpa)zdalniesterowane.pl
  • Poziom 26  
    mail jest pod każdą moją wiadomością a jak nie to proszę hunterhouse(malpa)wp.pl

    skąd jestem, też pisze w profilu :) poznań, prawie :D

    co do programu to tamta wersja miała troche błędów, takich co sie ujawniają dopiero przy niektórych danych, wiec troszke go zmieniłem, usunołem też dzielenie i zastosowałem liczbę ze stałym przeciniem. teraz chodzi troche szybciej i niepowinno robić błedów ale to i tak wyjdzie przy testowaniu.

    jak juz wszystko będzie oki to mozna najbardziej cyklożerny moment przepisać w ASM to też sporo przyspieszy. w tej chwili mamy około 20kHz a to i tak juz całkiek sporo.
    co do programu to edytowałem tamten post i wkleiłem nowy program co by nie zasmiecać forum.

    pozdrawiam