Skocz do zawartości

Arduino - sterowanie silnikiem krokowym


Michal94

Pomocna odpowiedź

Dzień dobry,

Szukam biblioteki która pozwoli mi na sterowanie silnikiem krokowym. Obecnie korzystam z biblioteki AccelStepper.h. Sterownik silnika jest ustawiony na 12800 impulsów na obrót. W obecnym programie z którego korzystam wykorzystuje 1/10 obrotu silnika ale chciałbym zmienić tą ilość na 1/12 lub 1/14 obrotu silnika niestety wartość podziału nie jest liczbą całkowitą (Czy można wpisywać wartości po przecinku?). Przy takim ustawieniu mogę dopiero wykorzystać 1/16 obrotu lecz jest to już dla mnie zbyt duża ilość. Czy zna ktoś inny sposób na zaprogramowanie w taki sposób?


#include <AccelStepper.h>


AccelStepper stepper(1, 10, 11);
#define PRZYCISK 7            
#define CZUJNIK 5
#define PRZEKAZNIK 4

void setup()
{      
   Serial.begin(9600);
   stepper.setMaxSpeed(25000);
   stepper.setAcceleration(15000); 
   pinMode(PRZYCISK, INPUT_PULLUP);
   pinMode(LED_BUILTIN, OUTPUT); 
   pinMode(CZUJNIK, INPUT_PULLUP);
   pinMode(PRZEKAZNIK, OUTPUT);
   pinMode(CZUJNIKLICZ, INPUT_PULLUP); 
}

void loop()
{  
    if (digitalRead (CZUJNIK)== LOW) { 
    delay(50
    );
    stepper.move(-1280);
    stepper.runToPosition(); 
    delay(50);
    digitalWrite(PRZEKAZNIK, HIGH);
    delay(50);                    
    digitalWrite(PRZEKAZNIK, LOW);
    delay(50);
    }
}
    

 

Link do komentarza
Share on other sites

Gość es2
Dnia 4.12.2018 o 07:29, Michal94 napisał:

niestety wartość podziału nie jest liczbą całkowitą (Czy można wpisywać wartości po przecinku?)

Sprawdź jakiego typu funkcja wymaga,czy jest zmiennoprzecinkowy czy nie.

Link do komentarza
Share on other sites

Dnia 4.12.2018 o 07:29, Michal94 napisał:

1/16 obrotu lecz jest to już dla mnie zbyt duża ilość

A może sprzętowe 1/32 kroku - zobacz

Przy silniku np. 400 kroków na obrót takich mikrokroków musisz wykonać 400 x 32 = 12800 by obrócić oś wału o 360 stopni. Czyli 1 mikrokrok to 1/12800 obrotu.

Edytowano przez Belferek
Link do komentarza
Share on other sites

#include <AccelStepper.h>


AccelStepper stepper(1, 10, 11);
#define PRZYCISK 7            
#define CZUJNIK 5
#define PRZEKAZNIK 4

void setup()
{      
   Serial.begin(9600);
   stepper.setMaxSpeed(25000);
   stepper.setAcceleration(15000); 
   pinMode(PRZYCISK, INPUT_PULLUP);
   pinMode(LED_BUILTIN, OUTPUT); 
   pinMode(CZUJNIK, INPUT_PULLUP);
   pinMode(PRZEKAZNIK, OUTPUT);
}

void loop()
{  
    if (digitalRead (CZUJNIK)== LOW) { 
    delay(50);
    stepper.move(-12800/15);
    stepper.runToPosition(); 
    delay(50);
    digitalWrite(PRZEKAZNIK, HIGH);
    delay(150);                    
    digitalWrite(PRZEKAZNIK, LOW);
    delay(50);
    }
}

Udało się zrobić dowolny podział, niestety silnik po wykonaniu paru obrotów nie zatrzymuje się już w tym samym miejscu w którym powinien. Nie zdarzyło się takie coś kiedy przy podziale wychodził równy wynik np kiedy silnik wykonywał 1/10 obrotu.

Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

Pomyśl trochę.

Ilość kroków jest liczbą całkowitą (nieważne, czy są to kroki silnika czy krowy - krok jest jednostką niepodzielną).

12800 przez 15 nie dzieli się (znaczy owszem, dzieli się, jeszcze reszta zostaje).

W związku z tym silnik wykonuje w jednym obrocie pętli 12800/15 = 853 kroki, a po 15 obrotach ilość kroków wynosi 853 * 15 = 12795.

Rozwiązanie - użyj metody moveTo z wyliczoną pozycją w stylu (n * 12800) / 15  zamiast move.

 

Link do komentarza
Share on other sites

Ja już przestałem się na wszelki wypadek odzywać, ale może to faktycznie dobry pomysł żeby wrócić do tematu.

Więc @Michal94, problem na który się natknąłeś nie dotyczy silnika krokowego, ale ogólnie błędów zaokrągleń. Podam Ci przykład z innej dziedziny. Wyobraź sobie że kupujesz w sklepie kilkogram czegoś-tam. I to kosztuje równo 100zł. Doszedłeś jednak do wniosku, że nie potrzebujesz całego kilograma, wystarczy 1/3. Więc cena to 33 zł 33 gr.

Ale jak jednak dokupisz pozostałe 2/3 to zapłacisz nie 100zł, tylko 99 zł 99 gr. Interes może kiepski ale wyobraź sobie minę księgowej, gdy na fakturze mamy trzy pozycje po 1/3 ze 100zł i sumę 99.99.

W każdym razie takie błędy są i musimy się nauczyć z nimi żyć. To co robią programy księgowe to zwiększenie liczby miejsc po przecinku - powiedzmy do 4, czyli setnych grosza. Wtedy nawet jeśli na fakturze podzielimy coś-tam na trzy, to każda pozycja będzie po 33 zł 33gr, ale suma 100 zł - księgowa zadowolona, chociaż matematyk pewnie miałby marną minę.

Rozwiązanie w przypadku sterowania silnikami to najczęściej przechowywanie dwóch liczników. Pierwszy to pozycja zadana - z dokładnością jaką potrzebujesz. Możesz więc używać ułamków, czy setnych grosza. Drugi licznik, to aktualna wartość / pozycja. Czyli jeśli zadałeś 1/16 obrotu, ale wykonałeś 1/15.999 to w pierwszym liczniku masz 1/16, a w drugim to ile wyszło. Przy aktualizacji, zmieniasz wartość dokładną i na jej podstawie wyliczasz ile rzeczywistych kroków ma wykonać program.

Link do komentarza
Share on other sites

1 godzinę temu, ethanak napisał:

panowie,  a może byście wrócili do rozwiązania problemu? 

Część postów została wydzielona do osobnego tematu - osoby zainteresowane znajdą tam wiadomości, które odchodziły od głównej tematyki tego wątku.

Link do komentarza
Share on other sites

W praktyce robi się to inaczej,Buduje się tgz. serwosilnik, są nawet takie gotowe rozwiązania na krokówkach, dostępne nawet za rozsądne pieniądze na ali.

Jest to silnik, który na drugim końcu, ma enkoder inkrementowalny, i to za pomocą tego enkodera pozycjonuje się wał. Są też sterowniki silników krokowych które ma dzielnik kroków, będący 10 x N a nie potęgą 2., czyli 10, 100, 200, 400 itd

  • Lubię! 1
Link do komentarza
Share on other sites

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.