ESP, IoT Зедержки при управлении шаговиком ESP32

Artem527

✩✩✩✩✩✩✩
15 Апр 2020
3
0
Всем привет. Подскажите как реализовать задержки без delay при управлении шаговым мотором. Необходимо, чтобы мотор доходил от нулевого положения сначала в одну сторону, там тормозился на заданное время, потом от нулевого в обратную сторону и тоже тормозился. В итоге мотор должен качаться из стороны в сторону, но с задержками в крайних положениях. Задержки должны иметь возможность регулирования. С таймером на millis не получается. Работает только с delay.
Установки скорости и ускорения в цикле loop т.к их необходимо регулировать их в процессе работы. Плата ESP32. Драйвер TMC2208. Таких моторов на одной плате две штуки.

C++:
#define STEP_osc2 26 //osc2
#define DIR_osc2  15 //osc2
#define EN_osc2  27 //osc2

#include <GyverStepper.h>
GStepper<STEPPER2WIRE> X2(800, STEP_osc2, DIR_osc2, EN_osc2);

void setup() {
pinMode(EN_osc2, OUTPUT);
digitalWrite(EN_osc2, LOW);
}

void loop() {
  X2.setAcceleration(500);
  X2.setMaxSpeed(200);
  if (!X2.tick()) {
    static bool dir;
    dir = !dir;
    if (dir == 0) {
      X2.setTarget(500);
      delay(1000);
    } else {
      X2.setTarget(500);
      delay(1000);
    }
  }
}
 

viktor1703

★★★✩✩✩✩
9 Дек 2021
632
150
Интересный алгоритм: если dir == 0 установить цельХ2 500, иначе установить цельХ2 500
 

Artem527

✩✩✩✩✩✩✩
15 Апр 2020
3
0
@viktor1703, Да ошибка, должно быть -500.
Так не бывает. Показывайте как делали.
C++:
void osci1() {
  X1.setAcceleration(1000);
  X1.setMaxSpeed(vosc1);
  if (!X1.tick()) {
    static bool dir;
    dir = !dir;
    if (dir == 0) {
      
      if (millis() - myTimer[0] >= del1) {
        myTimer[0] = millis();
        X1.setTarget(b1 + a1);
      }

    } else {
      
      if (millis() - myTimer[0] >= del1) {
        myTimer[0] = millis();
        X1.setTarget(-b1 + a1);
      }
    }
  }
}
Да и как только не делал, никак не получалось
 

bort707

★★★★★★✩
21 Сен 2020
3,067
915
@Artem527, и что мы должны увидеть в этом куске кода? Вы наверно уверены, что все знают, чего именно вы хотели добиться.

Код работает?
Если не работает - то расскажите, что именно не работает, как должно работать и чем одно отличается от другого?
 

Старик Похабыч

★★★★★★★
14 Авг 2019
4,272
1,303
Москва
C++:
#define STEP_osc2 26  //osc2
#define DIR_osc2 15   //osc2
#define EN_osc2 27    //osc2

#include <GyverStepper.h>
GStepper<STEPPER2WIRE> X2(800, STEP_osc2, DIR_osc2, EN_osc2);

void setup() {
  Serial.begin(115200);
  pinMode(EN_osc2, OUTPUT);
  digitalWrite(EN_osc2, LOW);
  X2.setAcceleration(500);
  X2.setMaxSpeed(200);
}

void loop() {
  static uint32_t tmr=millis()-1000;
  static bool f_pause=false;
  static bool dir;

  if (millis()-tmr<1000)
      f_pause=true;
  else
  {
    if (f_pause)
      {
        f_pause=false;
        if (dir == 0)
          X2.setTarget(500);
        else
          X2.setTarget(-500);
      }
    if (!X2.tick())
      {
      dir=!dir;
      tmr=millis();
      }
  }
}
И отдельно проверить вот этот вариант:
C++:
#define STEP_osc2 26  //osc2
#define DIR_osc2 15   //osc2
#define EN_osc2 27    //osc2

#include <GyverStepper.h>
GStepper<STEPPER2WIRE> X2(800, STEP_osc2, DIR_osc2, EN_osc2);

void setup() {
  Serial.begin(115200);
  pinMode(EN_osc2, OUTPUT);
  pinMode(DIR_osc2, OUTPUT);
  digitalWrite(EN_osc2, LOW);
  X2.setAcceleration(500);
  X2.setMaxSpeed(200);
}

void loop() {
  static uint32_t tmr=millis()-1000;
  static bool f_pause=false;
 
  if (millis()-tmr<1000)
    {
    f_pause=true;
    }
  else
  {
    if (f_pause)
      {
        f_pause=false;
        X2.setTarget(500);
      }
    if (!X2.tick())
      {
      digitalWrite(DIR_osc2,!digitalRead(DIR_osc2));
      X2.setCurrent(0);
      tmr=millis();
      }
  }
}
 
Изменено:
  • Лойс +1
Реакции: Artem527