Gstepper останавливает вращение. Проблемы в библиотеке? (Решено)

diarus

✩✩✩✩✩✩✩
16 Апр 2023
3
0
Всем привет. Почему библиотека и библиотека-ли останавливает двигатель?
Собираю станочек. Шаговик должен двигать каретку туда-сюда без ускорения/замедления . От 0 до 2500 шагов. Каретка делает 7 приходов в ноль и мотор встаёт в нуле. Проверяю сигнал Step осциллографом на входе драйвера DM556-вижу сигнал пока мотор вращается, как встаёт-его нет. Значит Леонардо перестаёт его генерировать, драйвер не при чём. После сброса ситуация в точности повторяется, на седьмом приходе в ноль пропадает сигнал Step(11 pin Ардуины). Если изменить скорость, то остановка уже происходит не на 7-м приходе в ноль. Т.е. тоже меняется. Сброс не помогает.
Что я делаю не так?
Код ниже:
C++:
#include "GyverStepper.h"
GStepper<STEPPER2WIRE> stepper(800, 11, 4, 1);

int speedstep = 2000;//задаём скорость
const uint32_t oborot = 2500;//количество шагов в однусторону
long d;

void homming()  // шаговик едет домой, ищет концевик, позиция сбрасывается в 0
{
  if (digitalRead(6)) //проверка концевика
    { stepper.setSpeed(-2000);
      while (digitalRead(6))
      stepper.tick();
    }


  else //это если при включении ардуины каретка уже дома, но всё равно ищем верный 0
  {

    stepper.setSpeed(400);
    while (!digitalRead(6))
    {
      stepper.tick();
    }
    stepper.reset();  // тормозим, приехали
    stepper.setSpeed(-400);
    while (digitalRead(6))
    {
     stepper.tick();
    }

  }
   stepper.reset();// стоп и сброспозиции в 0
}


void setup()
{
  pinMode(6, INPUT_PULLUP);   // концевик 0
  stepper.setMaxSpeed(speedstep);
  stepper.setAcceleration(0);
  stepper.autoPower(true);
  stepper.setRunMode(KEEP_SPEED);
  homming();                //устанавливаем каретку в 0
  stepper.setSpeed(2000);
}

void loop()
{
  
    stepper.tick(); //вызываем часто, согласно совету разработчика.
    if (d != stepper.getCurrent()) //чтобы  switch срабатывал только 1 раз  в контрольной точке
    {
      switch (stepper.getCurrent())
      {

        case 0:                                          //Вот в этом нуле на седьмой раз мотор останавливается.
          d = stepper.getCurrent();
          while (digitalRead(6) == 1) {};// если мы в 0 а концевик не сработал, значит был пропуск шагов.Корректируем
          stepper.setSpeed(speedstep);
          stepper.tick();//вызываем часто, согласно совету разработчика.(Убирал-не помогает)
          break;
        case 1250:
          d = stepper.getCurrent();
          stepper.tick();//вызываем часто, согласно совету разработчика.(Убирал-не помогает)
          break;

        case 2500:
          d = stepper.getCurrent();
          stepper.setSpeed(-1 * speedstep);//разворот
          stepper.tick();//вызываем часто, согласно совету разработчика.(Убирал-не помогает)
          break;
        default:
          d = stepper.getCurrent();
          stepper.tick();//вызываем часто, согласно совету разработчика.(Убирал-не помогает)
        
      }
    }
}
 
Изменено:

PiratFox

★★★★★✩✩
13 Фев 2020
1,703
474
@diarus, первое, что бросается в глаза. Направление вращения меняется таким образом:
stepper.setSpeed(-400);. Т.е. измением знака аргумента. А что, если попробовать это делать по-другому: stepper.reverse(TRUE); , не трогая stepper.setSpeed. Я это к тому, что в библиотеке может быть связанный с этим глюк. Если честно, мне неохота в ней копаться. 😁
 
Изменено:

diarus

✩✩✩✩✩✩✩
16 Апр 2023
3
0
@PiratFox, Меняет направление только 1 раз. Второй раз смены не происходит. Если реверс поставить в двух крайних точках, то реверс опять происходит только 1 раз.

Я в растерянности. Переделал код под Accelstepper. Тоже останавливается. Что за х......
 

PiratFox

★★★★★✩✩
13 Фев 2020
1,703
474
Если изменить скорость, то остановка уже происходит не на 7-м приходе в ноль. Т.е. тоже меняется.
Похоже, тут собака и порылась. Вы же не сказали, какой у вас моторчик. Поэтому непонятно, что там будет с пропуском шагов. Думаю, копнуть надо в этом направлении. Ещё проверьте, достаточно ли напряжения/тока у источника, питающего мотор.
 
Изменено:
  • Лойс +1
Реакции: diarus

diarus

✩✩✩✩✩✩✩
16 Апр 2023
3
0
Разобрался. Проблема в строке
C++:
while (digitalRead(6) == 1) {};
// если мы в 0 а концевик не сработал, значит был пропуск шагов.Корректируем
. Ничего тут не корректировалось, просто уходило в бесконечный пустой цикл, когда происходил первый пропуск шага.
@PiratFox, спасибо за помощь, тема закрыта.