Перемещение и остановка шагового двигателя без использования задержки

Я использую шаговый двигатель с внешним концевым выключателем (поэтому, когда питание включено, двигатель будет знать, с чего начать) с приводом двигателя L6470. То, что я хочу сделать здесь, это

  1. когда питание включено → поверните часы (CW) до тех пор, пока он не достигнет внешнего концевого выключателя
  2. После включения концевого выключателя → Поверните против часовой стрелки (CCW) на 550 миль секунд
  3. Отдых 100 мил секунд
  4. Поверните часы Мудрый (CW) в течение 200 mil секунд
  5. Отдых 100 мил секунд
  6. Включите Anti-Clock Wise (CCW) на 200 mil секунд
  7. ....цикл от 3 до 6

Мой текущий код использует "счетчик". Это происходит потому, что я не могу использовать "задержку" в этом коде, так как она прерывает код активации концевого выключателя.

Я только написал простые коды и не знаю, как сделать его отдых без использования "задержки". Пожалуйста, помогите....

#include <Arduino.h>
#include <SPI.h>


long max_speed = 7000;

long int dd = 200;
int dt = 10;

int t_interval = 10;
int t_hold = 170;

int steps; 



#define PIN_SPI_MOSI 11
#define PIN_SPI_MISO 12
#define PIN_SPI_SCK 13
#define PIN_SPI_SS 10

#define PIN_L6470_SS PIN_SPI_SS

void L6470_write(unsigned char data);
void L6470_init(void);
void L6470_run(long speed);


long speed = 1000; 
long int n_dir = 0 ;
long offTime;


int c_step = max_speed / dd;

const int limit_sw = 7;
bool switchState = false;
int counter = 0;
int milsec = 0;
bool speedSwitch = false;

void setup()
{
 pinMode(PIN_SPI_MOSI, OUTPUT);
 pinMode(PIN_SPI_MISO, INPUT);
 pinMode(PIN_SPI_SCK, OUTPUT);
 pinMode(PIN_L6470_SS, OUTPUT);


 pinMode(limit_sw, INPUT_PULLUP );
 
 digitalWrite(PIN_L6470_SS, HIGH);

 SPI.begin();
 
 Serial.begin(9600);
 

 L6470_init();
 
 Serial.println("Start...");



 
void loop()
{
 
int value = digitalRead(limit_sw);



if(value == 0){
  counter ++;
  if(counter > 50){
    switchState = true;
    counter = 50;
  }
}
if (switchState == true){
  milsec++;
  Serial.println(milsec);
  if(milsec > 550){
    speedSwitch = !speedSwitch;
    milsec = 0;
  }

  int speed;
  if(speedSwitch == true){
    //Serial.println("speedSwitch : true");
    speed = 200;

  }

  else{
    //Serial.println("speedSwitch : false");
    speed = -200;
  }
 

}
    
 

else{

  
   L6470_run( 100 );

}
}


void L6470_write(unsigned char data)
{
 digitalWrite(PIN_L6470_SS, LOW);
 SPI.transfer(data);
 digitalWrite(PIN_L6470_SS, HIGH);
}

void L6470_init()
{
 L6470_write(0x07);

 L6470_write(0x00);
 L6470_write(0x90);
 
 L6470_write(0x09);
 L6470_write(0xFF);
 
 L6470_write(0x0A);
 //L6470_write(0xFF);
 L6470_write(0x64);
 
 L6470_write(0x0B);
 L6470_write(0xFF);
 
 L6470_write(0x0C);
 L6470_write(0xFF);
 
 L6470_write(0x13);
 L6470_write(0x0F);
 
 L6470_write(0x14);
 L6470_write(0x7F);
}

void L6470_run(long speed)
{
 unsigned short dir;
 unsigned long spd;
 unsigned char spd_h;
 unsigned char spd_m;
 unsigned char spd_l;

//spd = speed;
 
 if (speed < 0)
 {
  dir = 0x50;
  spd = -1 * speed;
 }
 else
 {
  dir = 0x51;
  spd = speed;
 }


 spd_h = (unsigned char)((0x0F0000 & spd) >> 16);
 spd_m = (unsigned char)((0x00FF00 & spd) >> 8);
 spd_l = (unsigned char)(0x00FF & spd);
 
 L6470_write(dir);
 L6470_write(spd_h);
 L6470_write(spd_m);
 L6470_write(spd_l);
 
  Serial.print( " current spd = ");
  Serial.println( spd );
}

, 👍1