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.

Silnik krokowy 3Nm - Arduino

SamiJa 21 Lip 2015 18:24 1884 17
  • #1 21 Lip 2015 18:24
    SamiJa
    Poziom 10  

    Witam mam problem w zrozumieniu ustawień silnika krokowego, byłbym wdzięczny za pomoc w zrozumieniu tego wątku. Napisałem poniższy program.

    Kod: c
    Zaloguj się, aby zobaczyć kod


    i coś mi tu nie pasuje, silnik na pełny obrót wykonuje 360 stopni wykonuje 13 cykli. W tabeli sterownika wybrałem ustawienia 250 kroków SW5 = OFF, SW6 = OFF, SW7 = ON, SW8 = OFF.

    Nie rozumiem za bardzo co oznacza wartość dla 250 kroków = 50.000 . chciałbym konkretnie wysterować kroki o dokładne stopnie 1.8 stopnia. I za bardo tego nie rozumiem. Czy kwestia tu leży w tym iż biblioteka cewek ma cztery pozycje. Odpowiada to w tabeli z załączników pierwszemu krokowi. Czy powinienem wydłużyć ją o pozostałe kroki z tej tabeli ? Dlaczeko jeśli zmniejszam wartość czasową pomiędzy krokami to silnik zaczyna mi wolniej pracować, a gdy zwiększam to pracuje coraz szybciej ? To pewien paradoks ?!? Albo coś tu namąciłem. Będę wdzięczny panowie za pomoc w zrozumieniu tego wątku :)

    0 17
  • #2 21 Lip 2015 21:20
    kindlar
    Poziom 38  

    360°÷1.8°=200 kroków.

    0
  • #3 21 Lip 2015 21:39
    SamiJa
    Poziom 10  

    Tyle to wiem, poprawiłem to już dawno ale nie rozwiązało to problemu. Problem mam z ustawianiem kroków. Co oznaczają wartości o których pisałem wcześniej ? Z tymi cyklami mam problem jeśli w cyklach wpiszę 200 to nie mam 200 stopni. Przy wartości w cyklu 1 po długim czasie następuje skok.

    0
  • Pomocny post
    #4 22 Lip 2015 09:37
    tobiasz54
    Poziom 12  

    SamiJa napisał:

    Nie rozumiem za bardzo co oznacza wartość dla 250 kroków = 50.000 . chciałbym konkretnie wysterować kroki o dokładne stopnie 1.8 stopnia. I za bardo tego nie rozumiem.

    Silnik wykonuje 200 pełnych kroków na obrót. 360st co 1.8st.
    Liczba 250 to mikrokroki na 1 krok(załatwia to sterownik w zależności od ustawienia zworek), stąd 250 (mikrokroków na 1 pełny krok) x 200 kroków na pełen obrót = 50 000 mikrokroków na obrót .
    Sterowanie zrobiłbym inaczej.
    Na wejście PUL 5V podajesz impulsy(najlepiej z timera). Częstotliwością regulujesz szybkość obrotów. 1 impuls (0 1 0) to 1 mikrokrok.
    DIR - kierunek obrotów
    ENA - enable
    W tabeli masz dokładnie wypisane np:
    podział kroku mikrokroki
    2 2 - 400
    2 - 400 oznacza 2 mikrokroki na 1 pełny krok - 400 mikrokroków na pełny obrót. itd.
    Cytat:

    chciałbym konkretnie wysterować kroki o dokładne stopnie 1.8 stopnia.

    Przy tym sterowniku nie zrobisz tak, że 1 impuls(1 krok-mikrokrok) obróci o 1.8 stopnia ponieważ sterownik nie ma pełnych kroków.
    W tabeli musiałoby być 1 1-200. Czyli podział 1 - 200 kroków na obrót.
    Ustaw zworki na podział 2 - 400 i wtedy 1 impuls to 0.9 stopnia. 2 impulsy to Twoje 1.8 stopnia.

    1
  • #5 22 Lip 2015 16:19
    SamiJa
    Poziom 10  

    Teraz silnik działa elegancko :) . Natomiast mam pytanie odnośnie prędkości gdy zmieniam cykl na wyższą wartość mikrosekund to silnik przyśpiesza. Gdy zmniejszam wartość to silnik zwalnia. Pytanie jak ustawić tą częstotliwość jaka jest maksymalna dla tego silnika. Dlaczego gdy zmniejszam wartość prędkość spada a gdy zwiększam przyśpiesza. Przez to nie wiem jak określić ilość kroków w czasie. Wiesz o co w tym chodzi ?

    PS: Wielkie dzięki za objaśnienie :)

    UPS a jednak jest jeszcze mały problemik nie zauważyłem tego wcześniej bo w kodzie miałem działanie mnożenia przez 4.

    Kod: c
    Zaloguj się, aby zobaczyć kod


    Silnik ogólnie działa dobrze, lecz kroki się nie zgadzają ustawiłem pierwszą pozycję na sterowniku 2 - 400 . Lecz 400 nie równa się 360 stopni a 90 stopni ? Z tego co zrozumiałem 2 mikrokroki stanowią 1 krok 1,8 stopnia. Więc powinno być 360 stopni a nie 90 stopni. Dopiero dla mikrokroków 1.600 = 360 stopni obrotu.

    0
  • #6 22 Lip 2015 18:11
    tobiasz54
    Poziom 12  

    Wszystko zależy od tego co chcesz osiągnąć. Czy chcesz, żeby silnik kręcił z odpowiednią szybkością, czy żeby wykonał określoną liczbę kroków(obrotów).
    Dla Twojego silnika musisz znaleźć tabelę (charakterystykę częstotliwości(kroków) w funkcji trzymania(Torque)). Ja używam słabsze silniki 57BYG059 i mam charakterystykę - przy 2500Hz siła spada o 50%. Przypuszczam, że dotyczy to pełnego kroku więc:
    2500 kroków/s podzielone przez 200 kroków /obrót da 12,5 obrotu /s.
    Jeżeli chodzi o Twój kod w 1 poście - nie jest pełny, ale przypuszczam, że jeżeli zwiększasz cykl(50 000mikrokroków) to każesz mu zrobić więcej kroków w stałym czasie i dlatego przyśpiesza.
    Dlatego pisałem, żebyś wykorzystał timer a nie delay - będziesz miał większą kontrolę.
    edit:
    odpowiadałem przed zmianą twojego ostatniego postu

    0
  • #7 24 Lip 2015 16:48
    SamiJa
    Poziom 10  

    Napisałem nowy kod do sterowania silnika, wykonuje od pełny obrót w jedną i pełny obrót w drugą stronę. Ale ciągle mam problem z czasem. Mogę ustalać pokonywanie obrotów tak jak chcę aby wózek przepychał na określoną odległość. Lecz ustawienie czasu tej czynności już jest problematyczne

    Kod: c
    Zaloguj się, aby zobaczyć kod


    W tym kodzie silnik wykonuje mi obrót w 13 sekund. I tego nie rozumiem, ustawiony jest na 3.200 kroków na obrót i cykl obrotu trwa 13 sekund w przybliżeniu zmierzyłem na stoperze. Co innego jeśli zmienię polecenie delayMicroseconds na delay w tedy mogę ustalić prędkość silnika. Lecz przy kroku rzędu 1 milisekundy obroty i tak są bardzo niskie. Tylko przy delayMicroseconds silnik rozwija maksymalną prędkość. Lecz problem mam z wyregulowaniem obrotów w cyklu na sekundę.

    0
  • #8 24 Lip 2015 20:43
    kindlar
    Poziom 38  

    Po to jet tajmer abyś znał zadawaną częstotliwość i modyfikował ją w zależności od potrzeb.

    0
  • #9 25 Lip 2015 14:53
    SamiJa
    Poziom 10  

    a mógłby ktoś napisać przykład z timerem ? Nie wykorzystywałem jeszcze tej funkcji. A w sieci mało jest na ten temat jasnych przykładów.

    Odchyłka wynosi około 20% gdy zmieniłem w kodzie z 2000 milisekund na 2400 milisekund. To pełen obrót trwał prawie 2 sekundy pożądane. Przy pomiarze silnika włączonego 1 minuta i 20 sekund (40 obrotów), odchyłka wyniosła około 3 sekundy w kwestii czasu, bo kroki wykonuje idealnie pełne w pozycji. Silnik więc wykonuje pełny cykl z wyprzedzeniem, jeśli w programie ma wykonać obrót w 2400 milisekund a rzeczywisty obrót wynosi 2 sekundy. Nie wiem czy jest to spowodowane delayem. Ale byłbym wdzięczny za pomoc w zastąpieniu delaya timerem. Porównałbym wyniki i przy okazji zrozumiał kwestię timerów.

    0
  • #10 26 Lip 2015 14:45
    SamiJa
    Poziom 10  

    Witam, widzę iż nikt tu nie zaglądał ostatnio najwyraźniej. Napisałem nowy program obracający silnik w lewo i prawo. Problem mam z timerem. Czy ktoś mógłby dopisać kod w funkcji timer ? Byłbym wdzięczny, bo ciężko mi jest zrozumieć te timery. A siedzę nad tym już jakiś czas. Zapalanie diody i gaszenie to jedno, tutaj musiałbym przypisać pętli timer cykle które byłyby wywoływane w funkcji loop. Użyłem tam delaya, dlatego byłbym bardzo wdzięczny za dokończenie kodu abym mógł go przeanalizować. Próbowałem to robić z użyciem millis ale gdy wywoływałem f funkcji loop funkcje timer silnik mi nie pracował.

    Kod: c
    Zaloguj się, aby zobaczyć kod

    0
  • #11 26 Lip 2015 18:09
    atom1477
    Poziom 43  

    Tutaj nie ma niczego do dokańczania. To trzeba zrobić od początku.
    A co do Timerów to tu nie ma nic do rozumienia. Może dlatego nie możesz tego zrozumieć :D
    Po prostu chodzi o kod umieszczony w funkcji Timera. Z samym Timerem nie ma on nic wspólnego. Z Timerem "coś" wspólnego ma jedynie kod inicjalizujący Timer. Ale on się wykonuje tylko raz na początku programu. I jego na razie jeszcze nie ma. Więc i nie można go rozumieć czy też nie rozumieć :D
    Musisz dopiero zacząć go pisać i wtedy będziemy rozmawiali o nim.

    0
  • #12 26 Lip 2015 19:42
    tobiasz54
    Poziom 12  

    SamiJa napisał:
    Witam, widzę iż nikt tu nie zaglądał ostatnio najwyraźniej.

    Zagląda, zagląda
    Odniosę się do twojego postu #7
    Kod już lepszy, nie rozumiałem nazw zmiennych z pierwszego postu
    Kod: c
    Zaloguj się, aby zobaczyć kod

    W Twoim poprawionym kodzie
    Kod: c
    Zaloguj się, aby zobaczyć kod

    sądziłem, że dajesz go na ENA do sterownika(po wykonaniu 3200 kroków zatrzymuje silnik/wyłącza sterownik.
    W nowym kodzie pin10 chyba dajesz na DIR, czyli silnik cały czas kręci lewo/prawo.
    Napisałęś też:
    Cytat:

    Napisałem nowy kod do sterowania silnika, wykonuje od pełny obrót w jedną i pełny obrót w drugą stronę. Ale ciągle mam problem z czasem. Mogę ustalać pokonywanie obrotów tak jak chcę aby wózek przepychał na określoną odległość. Lecz ustawienie czasu tej czynności już jest problematyczne

    Teraz pytanie, czy chcesz aby wózek przesunął się na określoną odległość? Czy na określoną odległość w ustalonym czasie?
    Bo piszesz o 1 obrocie silnika.
    Jeżeli chodzi o odległość to musisz wg napędu(nic o tym nie pisałeś) wyliczyć o ile mm przesunie Ci wózek jeden krok/mikrokrok silnika(zębatka-przełożenie itp.) i w zależności od odległości zapodać odpowiednią ilość kroków.
    Jeżeli o czas przesunięcia to musisz odpowiednio obliczyć częstotliwość impulsów na PUL 5V sterownika.
    Mam to obcykane, ale jak napiszesz o co chodzi z tym przesuwaniem wózka, i czy na pewno czas przesunięcia jest ważny to może coś pomogę.
    Obsługę Timera i przerwań znam tylko na LPC.
    Dodam:
    Na delay są i widziałem takie softy sterującę silnikami krokowymi w drukarkach3d, ale po czytaniu tego forum nigdy nie użyję delay.
    Dlatego zainteresuj się timerami.

    0
  • #13 27 Lip 2015 15:26
    SamiJa
    Poziom 10  

    Chodziło mi z tymi cewkami o stany podawania napięcia stąd po dwie cewki tylko oznaczyłem je jako 0 i 1. W drugim kodzie faktycznie daje na DIR i po prostu w kodzie reguluje obroty lewo i prawo.

    Z tymi obrotami to mam faktycznie problem, zarówno we wcześniejszym kodzie jak i późniejszym mam problemy. Nie rozumiem jednak dlaczego piszesz iż albo kroki albo czas mam do wybrania ? Mam wózek zrobić który pracuje w jednej osi X oraz w pionie Z. Ale mam problem z pracą w czasie. Wózek ma przejechać 55 mm po czym wrócić, ma pracować tak w pętli. Drogę ma pokonywać z prędkością 10 mm/s. Więc mam określoną drogę i czas jej pokonania.

    Silnik ma wykonać swoją pracę w określonym czasie. Przekładnia jest bezpośrednia na skok 3 mm obrót lub 2 mm to jeszcze ustale. Ale jest to mało istotne, ważne jest to aby silnik wykonywał obrót w określonym czasie. Robie testy na 1 obrocie aby po prostu mieć pewność że robi obrót w określonym czasie. Jak nie będę znał czasu jedego obrotu to nie będę mógł wyliczyć przesunięcia w czasie.a niestety jest ważne aby posów trwał tyle czasu ponieważ jest to przesunięcie pracujące

    Co do timerów to musiałbym zobaczyć kilka przykładowych programów. Przykładowo to nie wiem za bardzo jak wykorzystać funkcje millis do tego silnika krokowego. Wiem jak właściwie ona działa, lecz nie wiem jak ją wykorzystać w bardziej rozbudowanym programie. Próbiwałem na silniku krokowym. Lecz nie chciał działać.

    0
  • #14 27 Lip 2015 19:31
    tobiasz54
    Poziom 12  

    Cytat:
    Mam wózek zrobić który pracuje w jednej osi X oraz w pionie Z. Ale mam problem z pracą w czasie. Wózek ma przejechać 55 mm po czym wrócić, ma pracować tak w pętli. Drogę ma pokonywać z prędkością 10 mm/s. Więc mam określoną drogę i czas jej pokonania.

    Czyli 2 silniki, jeden w X drugi w Z.
    Cytat:
    Wózek ma przejechać 55 mm po czym wrócić

    Ale 55mm to jest wektor X Z? Czy wózek ma przejechać 55 mm w osi X.
    Napiszę tak:
    -Prędkość to sobie dobierzesz ustalając delay lub łatwiej z zastosowaniem timera.
    -Nic nie pisałeś o silniku osi Z stąd musisz ustalić/wyliczyć przesunięcie w X i Z, nie sądzę że jeden silnik przesuwa wózek w dwóch osiach.
    Rozumiem, że najpierw w twoim kodzie przesuwasz wózek tylko w jednej osi.
    Bo nie ma tam drugiego sterownika i następnych pinów.

    Trochę się klamkujesz z tym co chcesz zrobić. Jednak pamiętaj o tym, że to co sobie wymyślisz już jest zrobione.
    Więc opisz, że są dwa silniki, jeden w osi X drugi w Z, że masz dwa sterowniki, że 1 silnik ma wykonać przesunięcie o 55mm w osi X , a drugi w tym samym czasie ma wykonać x mm w osi Z.
    Będzie po prostu łatwiej.
    edit:
    Cytat:

    Przekładnia jest bezpośrednia na skok 3 mm obrót lub 2 mm to jeszcze ustale. Ale jest to mało istotne, ważne jest to aby silnik wykonywał obrót w określonym czasie. Robie testy na 1 obrocie aby po prostu mieć pewność że robi obrót w określonym czasie.

    Nie idź tą drogą. Są gotowe wzory do wyliczenia mikrokrok-przesuniecie w zależności od przekładni. Trzeba je wsadzić do kodu. Czas sobie wyliczysz/ustalisz. Testujesz 1 obrót? Po co. Ma przesunąć wózek o określoną liczbę mm. Ma zrobić 500mm? Powienieneś już wiedzieć, że 1 mikrokrok(wynikający z przekładni i ustawień sterownika) to np 0,0125mm. To ma wykonać -nię będę liczył - wyliczoną ilość mikrokroków.
    To narazie tyle. Opanuj drugi silnik i timer.

    0
  • #15 28 Lip 2015 08:45
    atom1477
    Poziom 43  

    On ma wyjścia na dwa silniki:

    Kod: c
    Zaloguj się, aby zobaczyć kod

    tylko tego nie opisał.
    Pin 8 to STEP X, 9 STEP Z
    Pin 10 DIR X, 11 DIR Z.
    SamiJa: Co do Timerów to ciągle nie widać żebyś próbował coś pisać tylko czekasz na gotowca.
    No to przykładowy kod:
    Kod: c
    Zaloguj się, aby zobaczyć kod


    PS. Jeszcze raz napiszę: to jest przykładowy kod!

    0
  • #16 28 Lip 2015 21:10
    SamiJa
    Poziom 10  

    Jestem ostatnio zapracowany dlatego tak nie zaglądałem tu. Bo musze jeszcze narysować skrzynkę i wydrukować na drukarce 3D. Z timerami próbowałem coś działać ale nie póblikowałem jeszcze kodu. Bo jak mówiłem nie za bardzo wiem jak je wykorzystywać może być to łatwe ale gdybym napisał kilka kodów z nimi pewnie bym to załapał. Bo w timerach nie mogę wpisać wartości 1000 tylko pisze się to sposobem. Nie rozumiem za bardzo jak timer odmierza czas. W funkcji millis czas jest brany od procesora i względem niego jest wykonywana funkcja. W przykładzie poniższego timera wszystko rozumiem. Lecz pytanie gdzie w nim jest odniesienie do czasu ? Nie za bardzo rozumiem jak on załącza i wyłącz przykładowo diodę. Jeśli zrozumię tylko jak pobierany, jak liczony jest czas to w tedy ruszę z tym do przodu. Teraz nie mam możliwości bo jestem w pracy i dopiero jutro będę mógł przesłać kod. Może ktoś bybmi rozjaśnił na przykładzie kodu czy dobrze go rozumiem.


    Jeśli chodzi o silniki, to oczywiście są dwie osie, lecz nie pisałem o tym, bo wiem jak napisać kod. Mam jedynie problem z tym czasem. Najważniejsza jest oś X ponieważ ona pracuje w określonym cyklu czasu. Oś Z podbija wózek co każdy posów i pracuje na oddzielnym silniku i sterowniku. Pracują przemiennie. Raz jeden silnik, raz drugi. Odnośnie napisania kodu. To owszem myślałem że ktoś mógłby go poprawić, ale nie po to aby coś za mnie zrobić tylko po to abym mógł to przeanalizować. Jeden kod mnie nie zbawi, chce się nauczyć tego dla siebie. Na razie umiem jedynie liniowo programować, lecz chciałbym nauczyć się programować bez tych delayów. Starałem się wertować różne przykłady, i w pewnym sensie rozumiem je. Lecz nie są dla mnie zbyt jasne jeśli chodzi o rozbudowane programy. Postaram się jutro napisać kod z tym z czym mam problem. To może ktoś mi to zobrazuje łopatologicznie :) . W timerach za bardzo nie trybię czasu. Bo w delayach sprawa jest prosta. A w timerze nie rozumiem odniesienia czasowego w pełni. Bo w funkcji millis czas brany jest z procesora i od niego odnosi się podany czas w zmiennej który ustalamy. I tutaj mam kilka pytań na które nie mogę znaleźć odpowiedzi. Mogę jedynie domyślać się i też domyślam się lecz nie mam pewności dlatego gdyby ktoś mi przedstawił to z innego punktu pewnie bym zrozumiał. Pytanie czym się różni timer od funkcji millis ? To chyba jest w zasadzie to samo ?

    0
  • #17 28 Lip 2015 21:54
    atom1477
    Poziom 43  

    To zupełnie co innego. Millis jedynie korzysta z Timera. I to jest jedyne powiązanie pomiędzy nimi.
    Timer to układ czasowy.
    A Millis to funkcja która zwraca liczbę mówiącą o czasie jaki upłynął od włączenia płytki.
    Generalnie radził bym nie używać tej funkcji i zrobić to normalnie na Timerze.
    Timer po konfiguracji może wywoływać przerwania. Co określony czas (stały).
    A w funkcji obsługi przerwania robisz co chcesz. Np. podajesz kolejne impulsy.
    Dzięki temu że przerwania przychodzą co określony stały czas to impulsy które będziesz wystawiał w przerwaniu też będą co ten sam określony czas. A ten czas oczywiście można zmieniać przekonfugurowywując Timer.

    0
  • #18 31 Lip 2015 15:26
    SamiJa
    Poziom 10  

    W poniższym kodzie opisałem jak rozumiem zasadę jego działania. Pytanie czy dobrze to rozumiem.

    Kod: c
    Zaloguj się, aby zobaczyć kod


    Pytanie czy ten kod by zapalał diodę, powinien nią migać a nie działa. Pytanie dlaczego ?

    Kod: c
    Zaloguj się, aby zobaczyć kod

    0