algorytm sterowania silnikiem krokowym

Tematy różnej treści, nie zawsze związane z drukarkami
Awatar użytkownika
grzecho83
Posty: 110
Rejestracja: 09 lip 2013, 21:19
Lokalizacja: Krosno

algorytm sterowania silnikiem krokowym

Postautor: grzecho83 » 23 kwie 2018, 8:13

Witam, buduje urządzenie na arduino, w którym potrzebuje sterować jednym silnikiem krokowym. Mam problem z rampą rozpędzania i hamowania silnika. jak do tej pory stosowałem rozwiązanie wyglądające mniej więcej tak że miałem czas impulsu max i czas impulsu min odpowiadające prędkości maksymalnej i startowej. W trakcie trwania rampy od zmiennej czas impulsu była odejmowana zmienna przyśpieszenie. NIestety nie jest to dobre rozwiązanie ponieważ im krótszy czas impulsu tym zmienna jest odejmowana szybciej, poza tym jest wyczuwalna granica przejścia od rampy do ruchu jednostajnego, da się wyczuć szarpnięcie. Ale może to kwestia źle napisanego kodu. Poniżej przykład:

Kod: Zaznacz cały

int przyspieszenie = 1000;
unsigned int czas_kroku_max = 4000;
unsigned int czas_kroku_min = 200;
unsigned int tablica_rozpedzania[1000];
unsigned long start, stop;
int pulse_delay=1;


////////////////////////////////////////////////////////////////
/// GENEROWANIE TABLICY ROZPEDZANIA                         ////
/// NA PODSTAWIE PROSTEGO ODEJMOWANIA ZMIENEJ PRZYSPIESZENIE////
////////////////////////////////////////////////////////////////
void generowanie_tablicy_rozpedzania(){
 unsigned int czas_kroku = czas_kroku_max;
 int i=1;
  do{
    tablica_rozpedzania[i]=czas_kroku;
    i++;
    czas_kroku-=przyspieszenie;
    } while (czas_kroku>=czas_kroku_min);
   tablica_rozpedzania[0]=i-1;


  }

///////////////////////////////////////////////////////////
//////////// FUNKCJA PRZESUWAJĄCA WÓZEK O ZADANĄ DŁUGOŚĆ///
///////////////////////////////////////////////////////////
void moveMotor(long dystX){
  digitalWrite(X_ENA, LOW);
  delay(400);
  long X=0;
  if (dystX>0) {
      digitalWrite(X_DIR, HIGH);
      X = dystX;   
    }else {
      digitalWrite(X_DIR, LOW);
      X = dystX *(-1);
    }
  unsigned int czas_kroku = czas_kroku_max;
  long k=0;
  long rampa=0;
  long polmetek = X/2;
  while (k<polmetek) {///rozpędzanie
     start = micros(); //start odliczania czasu impulsu
    digitalWrite(X_STP, HIGH);
    delayMicroseconds(pulse_delay);//długość impulsu
    digitalWrite(X_STP, LOW);
    k++;
    while(1) {// pętla odliczająca długość kroku
      stop = micros();
      stop -= start;
      if ( stop > czas_kroku ) break;
      }
      czas_kroku-=przyspieszenie;
      if (czas_kroku<czas_kroku_min){
        czas_kroku=czas_kroku_min;
        break;//jeśli mamy max predkosc to przerywmy rozpedzanie
      }
    }
    rampa = k;
   while (k<X-rampa){// ruch jednostajny
      start = micros(); //start odliczania czasu impulsu
      digitalWrite(X_STP, HIGH);
      delayMicroseconds(pulse_delay);//długość impulsu
      digitalWrite(X_STP, LOW);
      k++;
      while(1) {// pętla odliczająca długość kroku
        stop = micros();
        stop -= start;
        if ( stop > czas_kroku ) break;
        }
    }
    while(k<X){//zwalnianie
      start = micros(); //start odliczania czasu impulsu
      digitalWrite(X_STP, HIGH);
      delayMicroseconds(pulse_delay);//długość impulsu
      digitalWrite(X_STP, LOW);
      k++;
      rampa--;
      while(1) {// pętla odliczająca długość kroku
        stop = micros();
        stop -= start;
        if ( stop > czas_kroku ) break;
        }
        czas_kroku+=przyspieszenie;
      }
   
 }


Nie mogę nigdzie znaleźć dobrego rozwiązania, podoba mi się praca silników w drukarkach niestety nie mogę w kodzie znaleźć funkcji odpowiedzialnej za ruch silnika, jeśli wiecie w którym pliku szukać to może mi pomoże.
W skrócie potrzebuje funkcji na arduino, która przesunie jeden silnik o zadaną długość. Ruch musi być płynny. Może wystarczy dobry algorytm na podstawie którego stworzę odpowiedni kod.

Wróć do „Na Każdy Temat”

Kto jest online

Użytkownicy przeglądający to forum: Obecnie na forum nie ma żadnego zarejestrowanego użytkownika i 2 gości