• Witaj na Forum Arduino Polska! Zapraszamy do rejestracji!
  • Znajdziesz tutaj wiele informacji na temat hardware / software.
Witaj! Logowanie Rejestracja


Ocena wątku:
  • 0 głosów - średnia: 0
  • 1
  • 2
  • 3
  • 4
  • 5
Czy to zadziała z silnikiem krokowym
#1
Witam

Chciałbym aby silnik krokowy podążał za kołem które osiągnie maksymalnie 5 obrotów na sekundę. Na kole zamontowany jest czujnik zbliżeniowy i tarcza z 20 wypustkami czyli maksymalnie Arduino będzie musiało tą sekwencję wykonać 100 razy na sekundę. Pytanie moje jest zasadnicze czy to jest wykonalne w tym czasie. Założenie jest takie że na każdy impuls z czujnika silnik ma wykonać 10 kroków. Program zaadoptowałem z silnika sterowanego przez enkoder.

Kod:
#define KROK 4
#define KIERUNEK 5
#define EN 6
#define ENK1 2
#define ENK2 3

void setup() {
 pinMode(KROK, OUTPUT);
 pinMode(KIERUNEK, OUTPUT);
 pinMode(EN, OUTPUT);
 pinMode(ENK1, INPUT_PULLUP);
 pinMode(ENK2, INPUT_PULLUP);
 attachInterrupt(digitalPinToInterrupt(ENK2), krocz, FALLING);
}

boolean krok = false;
boolean sleep = true;
unsigned long ostatni_krok;

void krocz()
{
 sleep = true;
 ostatni_krok = millis() + 1000;
 krok = true;
 if (digitalRead(ENK1))
   digitalWrite(KIERUNEK, LOW);
 else
   digitalWrite(KIERUNEK, HIGH);
}

void loop() {
 if(ostatni_krok < millis())
   sleep = false;
   
 digitalWrite(EN, sleep);
 
 if(krok)
 {
     digitalWrite(KROK, HIGH);
     digitalWrite(KROK, LOW);
  delay (1 / 10);
         digitalWrite(KROK, HIGH);
     digitalWrite(KROK, LOW);
       delay (1 / 10);
         digitalWrite(KROK, HIGH);
     digitalWrite(KROK, LOW);
        delay (1 / 10);
         digitalWrite(KROK, HIGH);
     digitalWrite(KROK, LOW);
       delay (1 / 10);
         digitalWrite(KROK, HIGH);
     digitalWrite(KROK, LOW);
      delay (1 / 10);
         digitalWrite(KROK, HIGH);
     digitalWrite(KROK, LOW);
  delay (1 / 10);
         digitalWrite(KROK, HIGH);
     digitalWrite(KROK, LOW);
     delay (1 / 10);
         digitalWrite(KROK, HIGH);
     digitalWrite(KROK, LOW);
delay (1 / 10);
         digitalWrite(KROK, HIGH);
     digitalWrite(KROK, LOW);
delay (1 / 10);
         digitalWrite(KROK, HIGH);
     digitalWrite(KROK, LOW);
  delay (1 / 10);
     
           
     krok = false;
 }
}
 
Odpowiedź
#2
100Hz to dla Arduino pestka, trzeba sie nagimnastykować przy 100000Hz. Natomiast z tym przekładem będzie ciężko to osiągnąć. Polecam https://forbot.pl/blog/kurs-arduino-pods...rsu-id5290, jak dojdziesz do lekcji o millis() to będziesz mniej więcej wiedział, czego nie wiesz.
Daleko nie zajedziesz znając tylko delay(), są jeszcze delayMicroseconds(), millis(), micros() i timery. No ta konstrukcja delay(1/10) ujęła moje serce Big Grin .
Do krokowca zobacz bibliotekę AccelStepper. Ma pewnie wszystkie potrzebne Ci fiuczery:
moveTo KEYWORD2
move KEYWORD2
run KEYWORD2
runSpeed KEYWORD2
setMaxSpeed KEYWORD2
setAcceleration KEYWORD2
setSpeed KEYWORD2
speed KEYWORD2
distanceToGo KEYWORD2
targetPosition KEYWORD2
currentPosition KEYWORD2
setCurrentPosition KEYWORD2
runToPosition KEYWORD2
runSpeedToPosition KEYWORD2
runToNewPosition KEYWORD2
stop KEYWORD2
disableOutputs KEYWORD2
enableOutputs KEYWORD2
setMinPulseWidth KEYWORD2
setEnablePin KEYWORD2
setPinsInverted KEYWORD2
maxSpeed KEYWORD2
 
Odpowiedź
  


Skocz do:


Przeglądający: 1 gości