Управление шаговым двигателем (AccelStepper)
- Войдите на сайт для отправки комментариев
Ср, 02/09/2015 - 19:46
Управляю щаговым двигателем через 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, то движение прерывается.
Каким способом возможно менять конечную позицию во время движения?
с этой библиотекой никак
нужно сразу задавать позицию куда ему ехать))))
Есть библиотеки (желательно поддерживающие ускорение) в которых это возможно?
вряд ли, т.к. идут расчёты по ускорению - торможению в зависимости от количества шагов
с этой библиотекой никак
нужно сразу задавать позицию куда ему ехать))))
Начитавшись исходного кода библиотеки 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 так и с самописной библиотекой). Люди помогите!) Почему так происходит?
Когда в цикле вы делаете ( ИФ позиция равная 3000) - это событие может никогда не произойти:
будет или недолёт или перелёт.
Сделайте (больше или равно) или (меньше или равно). Как вам надо
trembo, это всего лишь тестовый код. Судя по движению 3000 удачно наступает и библиотека без проблем динамически меняет конечную позицию движения. Проблема в другом: если во время движения двигателя считывать данные из сериал то движение прекращается, а двигатель издает звуки дребезжания.