Управление шаговым двигателем (AccelStepper)

sssyura
Offline
Зарегистрирован: 30.06.2015

Управляю щаговым двигателем через Step/Dir драйвер с помощью библиотеки AccelStepper с ускорением/торможением. Необходимо осуществить измениние конечной позиции перемещения во время движения движка.

Для теста использую следующий код:

#include <AccelStepper.h>
#define STEP 8
#define DIR  10
#define EN   6

AccelStepper stepper(1, STEP, DIR);
int pos=0;

void setup(){  
  Serial.begin(57600);
  pinMode(STEP, OUTPUT); 
  pinMode(DIR, OUTPUT); 
  pinMode(EN, OUTPUT);
  digitalWrite(EN, 1);
  stepper.setMaxSpeed(3000);
  stepper.setAcceleration(10000);
}

void loop(){
  if (Serial.available() > 0) {  
    pos = Serial.parseInt();
    stepper.moveTo(pos*1000);
  }
  stepper.run();
}

Если, к примеру, ввести 10 то движок с ускорением и торможением прокручивается в нужную позицию. Но если ввести 20, когда двигатель еще не достиг позиции 10, то движение прерывается.

Каким способом возможно менять конечную позицию во время движения?

vvadim
Offline
Зарегистрирован: 23.05.2012

с этой библиотекой никак

нужно сразу задавать позицию куда ему ехать))))

sssyura
Offline
Зарегистрирован: 30.06.2015

Есть библиотеки (желательно поддерживающие ускорение) в которых это возможно?

vvadim
Offline
Зарегистрирован: 23.05.2012

вряд ли, т.к. идут расчёты по ускорению - торможению в зависимости от количества шагов

sssyura
Offline
Зарегистрирован: 30.06.2015

vvadim пишет:

с этой библиотекой никак

нужно сразу задавать позицию куда ему ехать))))

Начитавшись исходного кода библиотеки AccelStepper, написав свою упрощенную библиотеку выяснил: менять позицию во время движения МОЖНО!

Следующий код отлично работает:

void setup(){  
  Serial.begin(57600);
  pinMode(STEP, OUTPUT); 
  pinMode(DIR, OUTPUT); 
  pinMode(EN, OUTPUT);
  digitalWrite(EN, 1);
  stepper.setMaxSpeed(3000);
  stepper.setAcceleration(10000);
  stepper.moveTo(5000);
}

void loop(){
   
  if(stepper.currentPosition()==3000){
    stepper.moveTo(10000);
  }
 
  stepper.run();
}

Прекращение движения происходит в момент чтения данных из порта (как в случае с AccelStepper так и с самописной библиотекой). Люди помогите!) Почему так происходит?

trembo
trembo аватар
Offline
Зарегистрирован: 08.04.2011

Когда в цикле вы делаете ( ИФ позиция равная 3000) -  это событие  может никогда не произойти:
будет или недолёт или перелёт.

Сделайте (больше или равно) или (меньше или равно). Как вам надо

sssyura
Offline
Зарегистрирован: 30.06.2015

trembo, это всего лишь тестовый код. Судя по движению 3000 удачно наступает и библиотека без проблем динамически меняет конечную позицию движения. Проблема в другом: если во время движения двигателя считывать данные из сериал то движение прекращается, а двигатель издает звуки дребезжания.