GyverStepper. Обсуждение библиотеки

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

★★★★★★★
14 Авг 2019
4,281
1,306
Москва
Надо посмотреть описание библиотеки. Алекс не зря писал, там все достаточно подробно написано, SetSpeed(4) это 4 шага двигателя в секунду. Соотв. 240 шагов в минуту. А сколько шагов в обороте зависит от характеристик мотора.
 

zErrOo

✩✩✩✩✩✩✩
27 Мар 2021
3
0
Здравствуйте. Задача вот какая: нужно управлять шаговыми двигателями(задавать кол-во шагов, которое нужно пройти по одно из осей) через монитор порта. Управление идет через RAMPS 1.4 с DRV8825 . Для этого пытался использовать следующий код:
C++:
#include "GyverStepper.h"

#define STEP_A 54// step
#define STEP_B 60
#define STEP_C 46
#define STEP_D 26
#define DIR_A 55 // dir направления вращения
#define DIR_B 61
#define DIR_C 48
#define DIR_D 28
#define EN_A 38// enable вкл/выкл
#define EN_B 56
#define EN_C 62
#define EN_D 24

char thisChar;
byte availableBytes;
String strData = "";
boolean recievedFlag;
int step_X,
    step_Y,
    step_Z;
                                                          // Расположение двигателей (вид сверху)
GStepper<STEPPER2WIRE> stepperA(100, STEP_A, DIR_A, EN_A);//             B*******A
GStepper<STEPPER2WIRE> stepperB(100, STEP_B, DIR_B, EN_B);//             *       *
GStepper<STEPPER2WIRE> stepperC(100, STEP_C, DIR_C, EN_C);//             *       *
GStepper<STEPPER2WIRE> stepperD(100, STEP_D, DIR_D, EN_D);//             D*******C

void setup() {
  Serial.begin(115200);

  stepperA.setRunMode(FOLLOW_POS);
  stepperA.setMaxSpeed(2000);
  stepperA.setAcceleration(1000);
  stepperA.autoPower(true);
  stepperA.enable();
  
  stepperB.setRunMode(FOLLOW_POS);
  stepperB.setMaxSpeed(2000);
  stepperB.setAcceleration(1000);
  stepperB.autoPower(true);
  stepperB.enable();

  
  stepperC.setRunMode(FOLLOW_POS);
  stepperC.setMaxSpeed(2000);
  stepperC.setAcceleration(1000);
  stepperC.autoPower(true);
  stepperC.enable();

  stepperD.setRunMode(FOLLOW_POS);
  stepperD.setMaxSpeed(2000);
  stepperD.setAcceleration(1000);
  stepperD.autoPower(true);
  stepperD.enable();
}

void move_X(long steps)
{
    stepperA.setTarget(-steps);
    stepperB.setTarget(steps);
    stepperC.setTarget(-steps);
    stepperD.setTarget(steps);
    stepperA.tick();
    stepperB.tick();
    stepperC.tick(); 
    stepperD.tick();
}
void move_clock(long steps)
{
  stepperA.setTarget(-steps);
  stepperB.setTarget(-steps);
  stepperC.setTarget(-steps);
  stepperD.setTarget(-steps);
  stepperA.tick();
  stepperB.tick();
  stepperC.tick(); 
  stepperD.tick();
}
void move_Y(long steps)
{
  stepperA.setTarget(steps);
  stepperB.setTarget(steps);
  stepperC.setTarget(-steps);
  stepperD.setTarget(-steps);
  stepperA.tick();
  stepperB.tick();
  stepperC.tick(); 
  stepperD.tick();
}

void loop() 
{
  if (Serial.available() > 0) {                 // если есть что то на вход
    strData = "";                               // очистить строку
    while (Serial.available() > 0) {            // пока идут данные
      strData += (char)Serial.read();           // забиваем строку принятыми данными
      delay(2);                                 // обязательно задержка, иначе вылетим из цикла раньше времени
    }
    recievedFlag = true;                        // поднять флаг что получили данные
  }
  if (recievedFlag) 
  {                                             // если есть принятые данные
    int intVal = strData.substring(1).toInt();  // перевести в int всю строку кроме первых двух символов!
    String header = strData.substring(0, 1);    // создать мини строку, содержащую первые два символа
    if (strData.startsWith("X"))                // если строка начинается с X
      step_X = (long)intVal;
    if (strData.startsWith("Y"))                // если строка начинается с Y
      step_Y = (long)intVal;
    if (strData.startsWith("Z"))                // если строка начинается с Z
      step_Z = (long)intVal;
    
    Serial.print(step_X); Serial.print(" ");  move_X(purp);
    Serial.print(step_Y); Serial.print(" ");  move_Y(step_Y);
    Serial.print(step_Z); Serial.println(" ");move_clock(step_Z);
      
    recievedFlag = false;                       // данные приняты, мой капитан!
    // выводим в порт для отладки
  }
}
Порты указаны правильно, и с другой прошивкой (без монитора порта) все работает, как прописываю через Serial шаговик начинает дрожать.
 

poty

★★★★★★✩
19 Фев 2020
3,292
953
Какой используется МП?
Зачем delay при чтении?
Что такое purp и где она определена?
 
Изменено:

zErrOo

✩✩✩✩✩✩✩
27 Мар 2021
3
0
Какой используется МП?
Зачем delay при чтении?
Что такое purp и где она определена?
Использую Arduino Mega 2560.
Без delay цикл while заканчивается на первом знаке.
purp - устаревшая переменная для отладки, на самом деле стоит step_X.
 

poty

★★★★★★✩
19 Фев 2020
3,292
953
Тогда рассказывайте поточнее. Как задаются команды и обеспечивается время между символами не более 2мс? Почему не отслеживаете конец строки или признак конца команды вместо наличия символов в буфере и delay? Что означает "шаговик начинает дрожать": он дрожит в момент ввода или постоянно, даже без ввода?
Неплохо было бы исправить скетч на актуальный в первом сообщении и привести рабочий вариант (без Serial).
 

zErrOo

✩✩✩✩✩✩✩
27 Мар 2021
3
0
Тогда рассказывайте поточнее. Как задаются команды и обеспечивается время между символами не более 2мс? Почему не отслеживаете конец строки или признак конца команды вместо наличия символов в буфере и delay? Что означает "шаговик начинает дрожать": он дрожит в момент ввода или постоянно, даже без ввода?
Неплохо было бы исправить скетч на актуальный в первом сообщении и привести рабочий вариант (без Serial).
Алгоритм парсинга брал из этой статьи.
После ввода в монитор напряжение на обмотку идёт, драйвера шумят, но сам двигатель не проворачивается.
GyverStepper без Serial:
#define STEP_A 54// step
#define STEP_B 60
#define STEP_C 46
#define STEP_D 26
#define DIR_A 55 // dir направления вращения
#define DIR_B 61
#define DIR_C 48
#define DIR_D 28
#define EN_A 38// enable вкл/выкл
#define EN_B 56
#define EN_C 62
#define EN_D 24

#include "GyverStepper.h"

GStepper<STEPPER2WIRE> stepperA(200, STEP_A, DIR_A, EN_A);
GStepper<STEPPER2WIRE> stepperB(200, STEP_B, DIR_B, EN_B);
GStepper<STEPPER2WIRE> stepperC(200, STEP_C, DIR_C, EN_C);
GStepper<STEPPER2WIRE> stepperD(200, STEP_D, DIR_D, EN_D);

void setup() {
  Serial.begin(9600);
  Serial.println("Start");
  // мотор A,B,C будет перемещаться в заданную позицию
  stepperA.setRunMode(FOLLOW_POS);
  stepperA.setMaxSpeed(2000);
  stepperA.setAcceleration(2000);
  stepperA.autoPower(true);
  stepperA.enable();
 
  stepperB.setRunMode(FOLLOW_POS);
  stepperB.setMaxSpeed(2000);
  stepperB.setAcceleration(1000);
  stepperB.autoPower(true);
  stepperB.enable();

 
  stepperC.setRunMode(FOLLOW_POS);
  stepperC.setMaxSpeed(2000);
  stepperC.setAcceleration(1000);
  stepperC.autoPower(true);
  stepperC.enable();

  stepperD.setRunMode(FOLLOW_POS);
  stepperD.setMaxSpeed(2000);
  stepperD.setAcceleration(1000);
  stepperD.autoPower(true);
  stepperD.enable();
}
void move_A(int steps){stepperA.setTarget(steps);}
void move_B(int steps){stepperB.setTarget(steps);}
void move_C(int steps){stepperC.setTarget(steps);}
void move_D(int steps){stepperD.setTarget(steps);}

void move_X(int steps)
{
    stepperA.setTarget(-steps);
    stepperB.setTarget(steps);
    stepperC.setTarget(-steps);
    stepperD.setTarget(steps);
    stepperA.tick();
    stepperB.tick();
    stepperC.tick();
    stepperD.tick();
}
void move_clock(int steps)
{
  move_A(-steps);
  move_B(-steps);
  move_C(-steps);
  move_D(-steps);
  stepperA.tick();
  stepperB.tick();
  stepperC.tick();
  stepperD.tick();
}
void move_Y(int steps)
{
  move_A(steps);
  move_B(steps);
  move_C(-steps);
  move_D(-steps);
  stepperA.tick();
  stepperB.tick();
  stepperC.tick();
  stepperD.tick();
}

void loop() {
 
  int purp = 10000;
  move_Y(purp);
  Serial.println(stepperA.getCurrent());
}
 

poty

★★★★★★✩
19 Фев 2020
3,292
953
Т.е. Вы вводите команды вручную через терминал? Тогда понятно, почему так происходит. Достаточно набирать медленнее, чем 500 символов в секунду и символы в буфере закончатся быстрее, чем Вы закончите набирать команду.
По хорошему надо иметь признак начала команды (в принципе, используемых Вами "X", "Y", "Z" достаточно) и либо неизменную длину команды (допустим, 5 символов: Х12345), либо ограничитель команды (допустим, символ "$" или перевод строки). Строки 95-99 переписать так, чтобы получить сначала полную команду, а потом её парсить.
 

Amadei

✩✩✩✩✩✩✩
4 Дек 2018
11
2
Здравствуйте уважаемые форумчане. Подскажите пожалуйста.
Столкнулся с такой проблемой, метод stop(), в библиотеке GyverStepper, не сбрасывает tick(). Он продолжает показывать true, во что бы то и стало.
Как сбросить tick() на ноль?

В догонку такой еще вопрос. Можно ли как-то изменить скорость вращения шагового двигателя, пока он едет к позиции в режиме FOLLOW_POS?
Заранее спасибо за информацию.
 

Greendumb

✩✩✩✩✩✩✩
22 Апр 2021
2
0
Здравствуйте!
В кодинге не сильно разбираюсь, в основном делаю все на примерах и по наитию, и вот столкнулся с такой проблемой, которую сам не могу решить:
скетч:
#define BLYNK_PRINT Serial
#include <ESP8266WiFi.h>
#include <BlynkSimpleEsp8266.h>
#include <GyverStepper.h>
GStepper<STEPPER2WIRE> stepper(800, D8, D7, D6);

char auth[] = "...";
char ssid[] = "...";
char pass[] = "...";

void setup()
{
  Serial.begin(9600);
  Blynk.begin(auth, ssid, pass);
  stepper.setRunMode(FOLLOW_POS);
  stepper.setMaxSpeed(1000);
  stepper.setAcceleration(1000);
 }

BLYNK_WRITE(V1)
{
  int pinValue = param.asInt();
  stepper.setTarget(pinValue);
}

void loop()
{
  Blynk.run();
}
То есть суть скетча: получить значение с виртуального пина V1 в приложении и передать его в stepper.setTarget() для перемещения на указанное значение.
Такой вариант самый простой и он работает, например, с сервой и другими библиотеками для шаговиков, но с GyverStepper почему-то нет. Видимо он не хочет работать внутри функции BLYNK_WRITE().
Добавлял для проверки "качалку" мотора туда-сюда
C++:
void loop() {
  Blynk.run();
// просто крутим туды-сюды
  if (!stepper.tick()) {
    static bool dir;
    dir = !dir;
    stepper.setTarget(dir ? -400 : 400);
  }
Работает, значит глобального конфликта библиотек нет.

Возможно есть какой-то вариант применить значение переменной pinValue за пределами функции BLYNK_WRITE() и добавить, например, stepper.setTarget(pinValue) в void loop()?

Очень хочу чтобы эта связка заработала, т.к. Blynk очень удобен, а библиотека GyverStepper наверное единственная, с которой удобно работать с TMC2208.

Буду рад любой помощи! Заранее благодарю!
 

Duet

✩✩✩✩✩✩✩
11 Май 2021
6
0
Здравствуйте. Уровень любитель. Вообще не много разочаровался в ардуинке. Не думал что управление шаговым двигателем это почти не посильная задача для ардуино. От управления двумя шд на одной ардуинке вообще отказался, не говоря уже о дисплее. Задача управление одним DM542 несколькими кнопками с четко установленными оборотами. В скетче только кнопки и подсветка кнопок на 595 микросхеме. Даже при такой простой программе не могу добиться нормальной работы шд. Что-то мешает работе библиотеке GyverStepper.
C++:
#define DRIVER_STEP_TIME 4
#include <GyverStepper.h>
GStepper<STEPPER2WIRE> stepper(200, 3, 4);
#include <Button.h>
#include <Click.h>
Button BUTTON_01;     //Кнопка Вкл,выкл режимов оборотов X+
Button BUTTON_06;     //Кнопка Вкл,выкл режимов оборотов X-
Button BUTTON_02;     //Переключатель оборотов режим 1
Button BUTTON_03;     //Переключатель оборотов режим 2
Button BUTTON_07;     //Переключатель оборотов режим 3
Button BUTTON_08;     //Переключатель оборотов режим 4
Button BUTTON_09;     //Переключатель оборотов режим 5
Button BUTTON_010;    //Переключатель оборотов режим 6
Button BUTTON_011;    //Переключатель оборотов режим 7
Button BUTTON_012;    //Переключатель оборотов режим 8
Button BUTTON_013;    //Переключатель оборотов режим 9

Button BUTTON_04;     //Кнопка режим ручной
Button BUTTON_05;     //Кнопка режим автомат
int ggg = 0;          //Переменная кнопки X+
int ggg2 = 0;         //Переменная кнопки X-
int kkk = 0;          //Переменная переключения режимов ручной или автомат вращение +
int kkk2 = 0;         //Переменная переключения режимов ручной или автомат вращение -

int latchPin = 10;
int clockPin = 12;
int dataPin = 11;

int led1 = B00000000; //-Х              B00000010   прав
int led2 = B00000000; //+Х              B00000100
int led3 = B00000000; //Ручной режим    B10000000
int led4 = B00000000; //Авто режим      B01000000

void setup ()
{
  pinMode(latchPin, OUTPUT);
  pinMode(clockPin, OUTPUT);
  pinMode(dataPin, OUTPUT);
  stepper.setRunMode(KEEP_SPEED);
  BUTTON_01.button(6);
  BUTTON_02.button(8);   //Режим оборотов 1
  BUTTON_03.button(9);   //Режим оборотов 2
  BUTTON_07.button(16);  //Режим оборотов 3
  BUTTON_08.button(17);  //Режим оборотов 4
  BUTTON_09.button(18);  //Режим оборотов 5
  BUTTON_010.button(19); //Режим оборотов 6
  BUTTON_011.button(2);  //Режим оборотов 7
  BUTTON_012.button(5);  //Режим оборотов 8
  BUTTON_013.button(13); //Режим оборотов 9

  BUTTON_04.button(14);
  BUTTON_05.button(15);
  BUTTON_06.button(7);
  pinMode(4, OUTPUT);
  pinMode(3, OUTPUT);
}
void loop() {
 
  digitalWrite(latchPin, LOW);
  shiftOut(dataPin, clockPin, MSBFIRST,led1 | led2 | led3 | led4);
  digitalWrite(latchPin, HIGH);
  BUTTON_01.read();
  BUTTON_02.read();
  BUTTON_03.read();
  BUTTON_04.read();
  BUTTON_05.read();
  BUTTON_06.read();
  BUTTON_07.read();
  BUTTON_08.read();
  BUTTON_09.read();
  BUTTON_010.read();
  BUTTON_011.read();
  BUTTON_012.read();
  BUTTON_013.read();
//Кнопки перемещения X-
if (BUTTON_01.event_click_Dn()&& kkk == 2) //вкл,выкл режимов оборотов автомат
{
  ggg = !ggg;
  if (!ggg)stepper.stop();
  ggg2 = 0;
}
if (ggg == 1) {led1 = B10000000;}
if (ggg == 0) {led1 = B00000000;}
if (ggg2 == 1) {led2 = B01000000;}
if (ggg2 == 0) {led2 = B00000000;}
 
if (BUTTON_01.event_click_Dn() && kkk == 1) //вкл режимов оборотов ручной
{
  ggg = 1;
  ggg2 = 0;
}
if (BUTTON_01.event_click_Up() && kkk == 1)//выкл режимов оборотов ручной
{
  ggg = 0;
  stepper.stop();
}
//Кнопки перемещения X+
if (BUTTON_06.event_click_Dn()&& kkk2 == 2) //вкл,выкл режимов оборотов автомат
{
  ggg2 = !ggg2;
  if (!ggg2)
  stepper.stop();
  ggg = 0;
}
if (BUTTON_06.event_click_Dn() && kkk2 == 1) //вкл режимов оборотов ручной
{
  ggg2 = 1;
  ggg = 0;
}
if (BUTTON_06.event_click_Up() && kkk2 == 1)//выкл режимов оборотов ручной
{
  ggg2 = 0;
  stepper.stop();
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//Кнопки выбора режима. Ручной или Автомат.
if (BUTTON_04.event_click_Dn()){kkk = 1; kkk2 = 1; led3 = B00000100; led4 = B00000000;}  //кнопка ручной режим
if (BUTTON_05.event_click_Dn()){kkk = 2; kkk2 = 2; led4 = B00000010; led3 = B00000000;}  //кнопка авто  режим
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//переключатель оборотов
if (BUTTON_02.state_button() && ggg == 1) { motor_s1(); } //переключатель оборотов режим 1 +
                                                                                        //....
if (BUTTON_013.state_button() && ggg == 1){ motor_s9(); } //переключатель оборотов режим 9 +

if (BUTTON_02.state_button() && ggg2 == 1) { motor_s11(); } //переключатель оборотов режим 1 -
                                                                                        // ....
if (BUTTON_013.state_button() && ggg2 == 1){ motor_s19(); } //переключатель оборотов режим 9 -
   stepper.tick(); 
}
void motor_s1() {
  stepper.setMaxSpeed(1000);
  stepper.setAcceleration(500);
  stepper.setSpeed(1000); 
}
//...
void motor_s9() {
  //stepper.setRunMode(KEEP_SPEED);
  stepper.setAcceleration(200);
  stepper.setSpeed(1000);
}
void motor_s11() {
  //stepper.setRunMode(KEEP_SPEED);
  stepper.setAcceleration(200);
  stepper.setSpeed(-1000); 
}
//...
void motor_s19() {
  //stepper.setRunMode(KEEP_SPEED);
  stepper.setAcceleration(200);
  stepper.setSpeed(-1000);
}
 

Duet

✩✩✩✩✩✩✩
11 Май 2021
6
0
Короче ей мешает все что в loop. Что бы не прописал, начинаются сбои в работе оборотов. Только в setup если, тогда работает хорошо, но зачем она тогда нужна если я даже кнопку прицепить не могу. Единственная библиотека которая работает это написанная на таймер счетчике, но она по функционалу не дописанная и только один шд.
 

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

★★★★★★★
14 Авг 2019
4,281
1,306
Москва
Для мотора что главное ? равномерность! Пробуй освоить библиотеку гайвера ГайверТаймер(с) и вызывать тик мотора внутри обработчика таймера.
 

Duet

✩✩✩✩✩✩✩
11 Май 2021
6
0
Для мотора что главное ? равномерность! Пробуй освоить библиотеку гайвера ГайверТаймер(с) и вызывать тик мотора внутри обработчика таймера.
Спасибо за совет! Почитал, освоил немного.

Что я не так делаю? Режимы двигателя не устанавливаются, работают оба режима на одних одинаковых оборотах которые даже не задавал.
C++:
#include <GyverTimers.h>
//#define DRIVER_STEP_TIME 1
#include <GyverStepper.h>
GStepper<STEPPER2WIRE> stepper(200, 3, 4);
#include <Button.h>
#include <Click.h>
Button BUTTON_01;     
Button BUTTON_02;   
Button BUTTON_03;     
Button BUTTON_04;     
Button BUTTON_05;     
int ggg = 0;         
int kkk = 0;         
int kkk2 = 0;         
void setup ()
{
  Timer2.setPeriod(stepper.getMinPeriod() / 2);
  Timer2.enableISR();
  stepper.setRunMode(KEEP_SPEED);
  BUTTON_01.button(6);
  BUTTON_02.button(8);   
  BUTTON_03.button(9);   
  BUTTON_04.button(14);
  BUTTON_05.button(15);

  pinMode(4, OUTPUT);
  pinMode(3, OUTPUT);
}
ISR(TIMER2_A) {
  stepper.tick();
}
void loop() {
  BUTTON_01.read();
  BUTTON_02.read();
  BUTTON_03.read();
  BUTTON_04.read();
  BUTTON_05.read();
//Кнопки перемещения X-
if (BUTTON_01.event_click_Dn()&& kkk == 1) //вкл,выкл режимов оборотов автомат
{
  ggg = !ggg;
  if (!ggg)stepper.stop();
}
if (BUTTON_01.event_click_Dn() && kkk2 == 1) //вкл режимов оборотов ручной
{
  ggg = 1;
}
if (BUTTON_01.event_click_Up() && kkk2 == 1)//выкл режимов оборотов ручной
{
  ggg = 0;
  stepper.stop();
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//Кнопки выбора режима. Ручной или Автомат.
if (BUTTON_04.event_click_Dn()){kkk2 = 1; kkk = 0;}  //кнопка ручной режим
if (BUTTON_05.event_click_Dn()){kkk = 1; kkk2 = 0;}  //кнопка авто  режим
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//переключатель оборотов
if (BUTTON_02.state_button() && ggg == 1) { motor_s1(); } //переключатель оборотов режим 1
if (BUTTON_03.state_button() && ggg == 1) { motor_s2(); } //переключатель оборотов режим 2   
}
void motor_s1() {
  stepper.setMaxSpeed(3000);
  stepper.setAcceleration(2000);
  stepper.setSpeed(1000);
}
void motor_s2() {
  stepper.setMaxSpeed(3000);
  stepper.setAcceleration(2000);;
  stepper.setSpeed(3000);
}
 

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

★★★★★★★
14 Авг 2019
4,281
1,306
Москва
Частота таймера в 2 раза выше периода мотора. Может надо период таймера менять при изменении скорости мотора ? По идее тикер мотора должен сам понять. Попробуй сделать период таймера раз в 10-20 короче.
 

Duet

✩✩✩✩✩✩✩
11 Май 2021
6
0
Избыточное цитирование
Частота таймера в 2 раза выше периода мотора. Может надо период таймера менять при изменении скорости мотора ? По идее тикер мотора должен сам понять. Попробуй сделать период таймера раз в 10-20 короче.
Приблизительно методом тыка Timer2.setPeriod(130); на оба режима, но это методом тыка, больше или меньше сбои сильные.
 

Duet

✩✩✩✩✩✩✩
11 Май 2021
6
0
Переписал кнопки, теперь все от автора, но проблема осталась. Обороты вместо 3000 шаг. сек, около 400. Собрано на UNO, драйвер TB6560+nema 17 настроенный на полный шаг. В параметре GStepper<STEPPER2WIRE> stepper(200, 3, 4); заданное количество шагов не на что не влияет, любые числа, работает одинаково. Работает очень не стабильно, задержка при вкл. выкл около 2 секунды, акселератор работает не всегда, во время вращения в одном положении сбой как бы удар. Не чего не пойму, хотя вроде все без ошибок.
C++:
#include <GyverButton.h>
#include <GyverTimers.h>
#include <GyverStepper.h>
#define BTN_PIN1 6
#define BTN_PIN2 14
#define BTN_PIN3 15
#define BTN_PIN4 8
#define BTN_PIN5 9
GStepper<STEPPER2WIRE> stepper(200, 3, 4);
GButton butt1(BTN_PIN1,LOW_PULL,NORM_OPEN);
GButton butt2(BTN_PIN2,LOW_PULL,NORM_OPEN);
GButton butt3(BTN_PIN3,LOW_PULL,NORM_OPEN);
GButton butt4(BTN_PIN4,LOW_PULL,NORM_OPEN);
GButton butt5(BTN_PIN5,LOW_PULL,NORM_OPEN);   
int ggg = 0;         
int kkk = 0;         
int kkk2 = 0;         
void setup ()
{
  Timer2.setPeriod(stepper.getMinPeriod() / 2); //stepper.getMinPeriod()
  Timer2.enableISR();
  stepper.setRunMode(KEEP_SPEED);
  stepper.setMaxSpeed(3000);
  stepper.setAcceleration(2500);
  pinMode(4, OUTPUT);
  pinMode(3, OUTPUT);
}
ISR(TIMER2_A) {
  stepper.tick();
}
void loop() {
  butt1.tick();
  butt2.tick();
  butt3.tick();
  butt4.tick();
  butt5.tick();
//Кнопка вкл. выкл
if (butt1.isSingle()&& kkk == 1)
{
  ggg = !ggg;
  if (!ggg)stepper.stop();
}
if (butt1.isHolded() && kkk2 == 1)
{
  ggg = 1;
}
if (butt1.isRelease() && kkk2 == 1)
{
  ggg = 0;
  stepper.stop();
}
//Кнопки выбора режима. Ручной или Автомат.
if (butt2.isSingle()){kkk2 = 1; kkk = 0;}  //кнопка ручной режим
if (butt3.isSingle()){kkk = 1; kkk2 = 0;}  //кнопка авто  режим
//переключатель оборотов
if (butt4.state() && ggg == 1) { motor_s1();} //переключатель оборотов режим 1
if (butt5.state() && ggg == 1) { motor_s2();} //переключатель оборотов режим 2   
}
void motor_s1() {
    stepper.setSpeed(200);
}
void motor_s2() {
    stepper.setSpeed(3000);
}
 

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

★★★★★★★
14 Авг 2019
4,281
1,306
Москва
Я так скду, у меня нема с а4988 крути максимум 6 оборотов в секунду (на любом шаге) для полого шага это 1200. Если нагрузка посущественней, то я ограничиваюсь 5-ю оборотами, т.е. 1000 шагов в секунду. Что бы 3000 в секунду это вентилятор
 

AlexGyver

★★★★★★✩
Команда форума
30 Июл 2018
359
574
@Duet, достаточно было изучить документацию на библиотеку или хотя бы встроенные примеры, там всё написано про работу в прерывании...
 

fetus

✩✩✩✩✩✩✩
12 Дек 2020
17
0
Задача тикать шаговик в прерывании таймера на esp32 . Нашел библиотеку...светодиод когда один - мигает , шаговик или светик вместе с шаговиком ни в какую. Кто имел дело с этой библиотекой? Может я что то не так делаю?
C++:
#include "ESP32TimerInterrupt.h"
#include <GyverStepper.h>
GStepper<STEPPER2WIRE> stepper(1, 32, 33);

void IRAM_ATTR TimerHandler0(void)
{
  static bool toggle0 = false;

  digitalWrite(22, toggle0);
  toggle0 = !toggle0;
}


/*
void IRAM_ATTR TimerHandler1(void)
{
   stepper.tick();
}
*/

// Instantiate ESP32 timer0 and 1
ESP32Timer ITimer0(3);
//ESP32Timer ITimer1(1);

void setup()
{

  // режим следования к целевй позиции
  stepper.setRunMode(FOLLOW_POS);

  // установка макс. скорости в шагах/сек
  stepper.setMaxSpeed(400);

  // установка ускорения в шагах/сек/сек
  stepper.setAcceleration(500);

//ITimer1.attachInterruptInterval(stepper.getMinPeriod(), TimerHandler1);

  ITimer0.attachInterruptInterval(100000, TimerHandler0);

  pinMode(22, OUTPUT);

}

void loop()
{
  // просто крутим туды-сюды
  if (!stepper.tick()) {  // тут всё равно вызываем для смены направления
    static bool dir;
    dir = !dir;
    stepper.setTarget(dir ? -400 : 400);
  }



  // задержка, чтобы показать работу степпера в прерывании
  delay(100);
}
 

fetus

✩✩✩✩✩✩✩
12 Дек 2020
17
0
Заменил в библиотеке GyverStepper все float на double.....заработало.