Arduino Nano, Шаговый двигатель и библиотека AccelStepper

ZMan
ZMan аватар
Offline
Зарегистрирован: 14.08.2015

Доброго времени суток!

Собственно, имеется Arduino nano, драйвер ШД TB6600 и  библиотека: http://www.airspayce.com/mikem/arduino/AccelStepper/ 

Задача такова: необходимо запустить двигатель с ускорением и последующей работой на определьнных оборотах, "неограниченное" время, без остановок.

У меня получается такая картинка, я могу с ускорением запустить двигатель например на N оборотов. А вот запустить с ускорением и оставить работать без указания точки остановки - не выходит.

Запуск сразу на нужных оборотах так же не возможен из за их количества (высоких оборотов получается достичь только с ускорением). 

К примеру запуск с ускорением и конечной точкой:
 

#include <LiquidCrystal.h>
#include <AccelStepper.h>

enum { LCD_WIDTH = 20, LCD_HEIGHT = 4 }; 

LiquidCrystal lcd(7, 6, 5, 4, 3, 2);
AccelStepper motor(1, 9, 8); // pin 9 = step, pin 8 = direction

  long rpm=2000;
  long maxSpeed=2000; // MAX RPM
  long maxAccel=100; // RPM accel per second
  long stepRevo=400; // steps per revolution (1:2=400)

void setup() {
  lcd.begin(LCD_WIDTH, LCD_HEIGHT);
  motor.setMaxSpeed(stepRevo*maxSpeed/60); // setMaxSpeed(stepsPerSecond)
  motor.setAcceleration(stepRevo*maxAccel/60); //setAcceleration(stepsPerSecondSquared)
}

void loop() {
  motor.runToNewPosition(0);
  motor.runToNewPosition(stepRevo*10000);
  motor.runToNewPosition(0);
  delay(2000);
}

В какую сторону копать? :(

inspiritus
Offline
Зарегистрирован: 17.12.2012

1- управляйте им сами , без библиотек

2- перепиливайте библиотеку

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

попробуйте уйти от конкретики и задайте ему дофига шагов
я так делаю, работает

 

void setup()
{
  stepper.setMaxSpeed(1600);
}

void loop()
{
  stepper.setSpeed(1000);
  stepper.setAcceleration(500);
  stepper.moveTo(100000L);
  stepper.run(); 
}

 

ZMan
ZMan аватар
Offline
Зарегистрирован: 14.08.2015

Ладно, допустим, задали мы ему 2 миллиарда шагов (делитель 1:2, 400 шагов на оборот, неделя работы). 

Теперь возникла следующая проблема. При выводе чего то на экран - скорость падает. 

Вообще суть устройства такова, крутить ШД по циклу через отрезки времени, по таймеру или просто нон стопом. Все с определенными оборотами. 

ZMan
ZMan аватар
Offline
Зарегистрирован: 14.08.2015

Вот исходник. Если закомментировать вызов displayClock - все отлично. Но если он не закоментирован то каждую секунду (при выводе на экран) проседают обороты, сбивается шаг и двигатель встает.

#include <LiquidCrystal.h>
#include <AccelStepper.h>
LiquidCrystal lcd(7, 6, 5, 4, 3, 2);
AccelStepper motor(1, 9, 8); // pin 9 = step, pin 8 = direction


// настройка ног ШД 1
int dirPin = 8;
int stepperPin = 9;

const int MAX_REVS=2000;

int hh=0;
int mm=0;
int sec=0;
unsigned long prevMillis = 0; 	
long REVS=600;
long maxSpeed=500; // MAX RPM
long maxAccel=100; // RPM accel per min
long stepRevo=400; // steps per revolution (1:2=400)
long stepperPos=0;
int StepperWorkNOW=1;


void setup() { 
	lcd.begin(20, 4);
	motor.setAcceleration(stepRevo*maxAccel/60); //setAcceleration(stepsPerSecondSquared)
	pinMode(dirPin, OUTPUT);
	pinMode(stepperPin, OUTPUT);
}

void loop() {
	unsigned long currentMillis = millis();
	if(currentMillis-prevMillis>=1000) {
		prevMillis=currentMillis;
		reClock();
	}  
	MotorGO();
	motor.run();
}

void MotorGO() {
	motor.moveTo(2016000000L);
}

void reClock() {
	sec++;
	if (sec>59) {
		sec=0;
		mm++;
	}
	if (mm>59) {
		mm=0;
		hh++;
	}
	if (hh>23) {
		hh=0;
	}
	displayClock(0,1);
}

void displayClock(int sPos, int sStr) {
	lcd.clear();
	lcd.setCursor(sPos,sStr);
	if (hh<10) {
		lcd.print("0");
	}
	lcd.print(hh); 
	lcd.print(":"); 
	if (mm<10) {
		lcd.print("0");
	}
	lcd.print(mm); 
	lcd.print(":"); 
	if (sec<10) {
		lcd.print("0");
	}
	lcd.print(sec);
}

 

trembo
trembo аватар
Онлайн
Зарегистрирован: 08.04.2011

lcd.clear (); всё тормозит.
Уберие совсем и используйте только один раз  в сэтапе.
Если надо чистить - выводите пробелы

ZMan
ZMan аватар
Offline
Зарегистрирован: 14.08.2015

trembo пишет:

lcd.clear (); всё тормозит.

Закоментил, прошил, тоже самое Т_Т

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

в связке шаговик-дисплей на дисплей выводите информацию только при её изменении

на форуме тема была по этому поводу, поищите если не лень

achest
achest аватар
Offline
Зарегистрирован: 01.10.2012

ZMan пишет:

Доброго времени суток!

Собственно, имеется Arduino nano, драйвер ШД TB6600 и  библиотека: http://www.airspayce.com/mikem/arduino/AccelStepper/ 

Задача такова: необходимо запустить двигатель с ускорением и последующей работой на определьнных оборотах, "неограниченное" время, без остановок.

В какую сторону копать? :(

У меня была такая же задача. Только еще и скорость по ходу менять.

Я долго мучался с AccelStepper, пока не выловил из нее много багов. В итоге написал свою библиотеку, на базе прерывания.https://github.com/achest/stepperQ

Вот код:

#include <stepperQ.h>

int dir_pin = 7;
int step_pin = 6 ;

void setup() {
  
  stepperq.init(dir_pin,step_pin);
  stepperq.setMaxSpeed(200);
  stepperq.setAcceleration(9900);
  stepperq.moveTo(8000);
  
  stepperq.start();
   
}
void loop () {

  if ( stepperq.distanceToGo() <4000 ) {
      stepperq.move(8000);
  }
  delay (100);
 // TODO Put your code hier.
   return ;   

}

У меня работает. Если не работает пиши, исправлю ошибки.  И вообще приглашаются Beta-Tester ;-)

Код с accestepper ничем не будет отличаться, кроме вызова run()  в лупе.

 

 

ZMan
ZMan аватар
Offline
Зарегистрирован: 14.08.2015

vvadim пишет:

в связке шаговик-дисплей на дисплей выводите информацию только при её изменении

на форуме тема была по этому поводу, поищите если не лень

Ну так по изменению и выводится, в данном случае часы тикают раз в секунду. Могу снять видео, "запор" в работе двигателя происходит именно при обновлении дисплея

ZMan
ZMan аватар
Offline
Зарегистрирован: 14.08.2015

achest пишет:

У меня была такая же задача. Только еще и скорость по ходу менять.

Я долго мучался с AccelStepper, пока не выловил из нее много багов. В итоге написал свою библиотеку, на базе прерывания.https://github.com/achest/stepperQ

Спасибо, буду пробовать, с несколькими шаговыми работает? 3шт например, но уже на Mega 2560, так же с дисплеем. Хотя сначала на nano бы завести.

achest
achest аватар
Offline
Зарегистрирован: 01.10.2012

ZMan пишет:

Спасибо, буду пробовать, с несколькими шаговыми работает? 3шт например, но уже на Mega 2560, так же с дисплеем. Хотя сначала на nano бы завести.

Нет   В Ардуино очень мало Таймеров/Прерываний, Актуально используется Timer1, соответсвенно оно не маштабируется. Я ищу решение ( см мою другую тему про моргание светодиодами). Требуемую(похожую) Библиотеку я видел, но не могу найти...

С другой стороны  все не совсем просто. Обсчитать  шаг шаговика занимает порядка 100 мкс. Это соответвуюет 8000 шагам в секунду. Реально, с учетом потерь/запаса - 4000 шагов. Если ты хочешь управлять 3 шаговиками, то мы будем говорить о 1200 шагов в секунду у каждого, не больше...  Пока ты медленно двигаешь декорации по сцене - все ок. Но как только хочешь что-то более динамичное ,  то все.   Надо переходить на более производительый процессор, на пример Stm32,  у него и с прерываниями по проще...

 

 

Кстати, с выводом на экран у меня были такие же проблемы с AccelStepper. После  3-х месяцев мытарств, я все переделал так:

Есть функция вывода на экран.

Есть функция программа. В программе While ( stepper.distanceToGo() >0 ) {stepper.run();}  .

Вызывается либо одна, либо другая. т.е. либо мы едем, или пишем на экран, реагируем и тп.

С моей новой библиотекой таких проблем нет. правда и вывод на экран я сильно сократил. Он только скорость/шаги выводит и до 1000-1500 шагов в секунду точно не сбивается. При 4000, уже были проблемы... Но только 1 раз, не могу повторить тест.

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

ZMan пишет:

Доброго времени суток!

Собственно, имеется Arduino nano, драйвер ШД TB6600 и  библиотека: http://www.airspayce.com/mikem/arduino/AccelStepper/ 

Задача такова: необходимо запустить двигатель с ускорением и последующей работой на определьнных оборотах, "неограниченное" время, без остановок.

 

 

вообще то ваша задача совсем не требует использования этой библиотеки

используйте функцию разгона и крутите мотор через прерывания

ZMan
ZMan аватар
Offline
Зарегистрирован: 14.08.2015

achest, возникла такая проблема, задана макс скорость 100RPM, и несметно длинный путь для ШД, ШД начинает бесконечно разгоняться. А с дисплеем теперь все хорошо.

#include <LiquidCrystal.h>
#include <stepperQ.h>
LiquidCrystal lcd(7, 6, 5, 4, 3, 2);


// настройка ног ШД 1
int dirPin = 8;
int stepperPin = 9;

int hh=0;
int mm=0;
int sec=0;
unsigned long prevMillis = 0; 	
const int MAX_REVS=2000;
long REVS=600;
long maxSpeed=100; // MAX RPM
long maxAccel=2;
long stepRevo=200; // steps per revolution (1:1=200, 1:2=400, 1:4=800)

void setup() { 
	lcd.begin(20, 4);
 
	stepperq.init(dirPin,stepperPin);
	stepperq.setMaxSpeed(maxSpeed*stepRevo);
	stepperq.setAcceleration(maxAccel*stepRevo);

	stepperq.start();
}

void loop() {

        stepperq.moveTo(400000L);
        stepperq.start();  
 
}
achest
achest аватар
Offline
Зарегистрирован: 01.10.2012

ZMan пишет:

achest, возникла такая проблема, задана макс скорость 100RPM, и несметно длинный путь для ШД, ШД начинает бесконечно разгоняться. А с дисплеем теперь все хорошо.

Спасибо за участие. Бета тестеры мне действительно нужны!.

1. 200*100 это 20000 шагов в секунду. ( а не минуту). Реально оно работает до 8-9 т шагов.  Теоретически возможно до 16-18т. Там нет защиты от не правильного использования. Она будет стоить "процессорного времени".

2. Не понял суть твоей проблемы. Он разгоняется медленно. Все правильно. ты ставишь всего 2*200.  У меня там стоит 800 или 19000, для не нагруженного мотора.

3.  stepperq.moveTo(400000L); 

33         stepperq.start();

не надо вызывать из лупа. Первое потому, что переменная переполнится, второе потому, что бесмысленно.

Короче пойду писать доку...

 

 

ZMan
ZMan аватар
Offline
Зарегистрирован: 14.08.2015

achest пишет:

1. 200*100 это 20000 шагов в секунду. ( а не минуту). 

А ларчик просто открывался, чуть выше ты писал что от accelStepper у тебя минимум отличий в работе, а там RPM а не RPS.

Поэтому и возникла моя проблема (Двигатель разгонялся пока просто не вставал).

vladimir62
vladimir62 аватар
Offline
Зарегистрирован: 10.11.2015

Achest, попробовал ваш StepperQ, хорошо он разгоняет, проверил на одной конфигурации (мотор PL57Р56, полушаг, драйвер на 4А, БП 30 вольт) разгон и максимальную скорость: AccelStepper не более 6 об/мин, ваш SQ 12 об/сек. Дальше не имеет смысла, кривая зависимости ШД момента на валу от частоты начинает падать. Еще поиграюсь. Вообщем положительное впечатление. Спасибо.

vladimir62
vladimir62 аватар
Offline
Зарегистрирован: 10.11.2015

Пардон! Опечатка!  У Асселя разумеется 6 об/сек

ZMan
ZMan аватар
Offline
Зарегистрирован: 14.08.2015

Возникла следующая проблема. 

Не могу скомпилировать под Atmega8.

Arduino: 1.6.8 (Windows 10), Плата:"Arduino NG or older, ATmega8"

C:\Users\Дмитрий\Documents\Arduino\libraries\stepperQ-master\stepperQ.cpp: In member function 'void StepperQ::initTimer(long int)':

C:\Users\Дмитрий\Documents\Arduino\libraries\stepperQ-master\stepperQ.cpp:299:3: error: 'TIMSK1' was not declared in this scope

   TIMSK1 = _BV(TOIE1);                                     // sets the timer overflow interrupt enable bit

   ^

exit status 1
Ошибка компиляции для платы Arduino NG or older.

Можешь что ни будь подсказать?

Deamount
Offline
Зарегистрирован: 07.05.2012

у меня драйвер L298N, Nano V3, NEMA17, напряжение 9В -12В и максимум, что accelstepper, что stepperQ дают - это 6 (шесть) оборотов в секунду... причем при 12В кажется чуть хуже чем при 9В. что не так делаю? как выжать 12-15 об/сек ?

Кстати на небольших оборотах обе библиотеки так разогревают драйвер что яйца на них жарить можно... аж подгарают ... )

trembo
trembo аватар
Онлайн
Зарегистрирован: 08.04.2011
vladimir62
vladimir62 аватар
Offline
Зарегистрирован: 10.11.2015

Deamont у меня NEMA17 подключен к 27 вольт в одном станочке и драйвер на всякий случай на 3 А и крутится он (ШД) шустро, 12  вольт маловато будет. А драйвер L298 мне кажется слабеньким, лучше уж TB6600 купить http://ru.aliexpress.com/item/High-Quality-TB6600-DC12-45V-Two-Phase-Hybrid-Stepper-Motor-Driver-Controller/32608542477.html?spm=2114.14010208.99999999.267.ljwwmx.

vladimir62
vladimir62 аватар
Offline
Зарегистрирован: 10.11.2015

Я на всякий случай поясню, для вращательного движения увеличение частоты вращения требует повышения крутящего момента, а он  в данном случае является функцией напряжения и тока, ну и кое чего еще, обойдемся без формул и теории. Вам банально не хватает "мощи". 

ZMan
ZMan аватар
Offline
Зарегистрирован: 14.08.2015

Для nema17 нужно 12В и примерно по 1.7А на двигатель, т.е. БП должен быть приличным. Драйвер L298N слабоват, лучше взять специализированный драйвер для ШД, я использовал TB6600 но только потому что у меня Nema23, тебе сойдет a4988 например

vladimir62
vladimir62 аватар
Offline
Зарегистрирован: 10.11.2015

E2E4
Offline
Зарегистрирован: 26.03.2016

Добрый день, вопрос к специалистам, поставил на принтер драйвера TB6600 через рампс 1.4 (прошивка Марлин), и в итоге движки только греются блокируя движение вала, никакого движения нет.

 

Пробовал прямое подключение драйвера к ардуинке (как указано в форуме выше без рампса и марлина) с помощью библиотек AccelStepper и stepperQ - все работает, с последней библиотекой даже живее движки работают, но через рампс и с Марлином ни в какую. 

Как я понимаю, прошивка Марлин так же может быть изменена под данные драйвера? или настолько глубоко в нее залезть нереально?

vladimir62
vladimir62 аватар
Offline
Зарегистрирован: 10.11.2015

Я - пас, относительно RAMPS1.4, у меня его нет. Мне личный 3D принтер пока не нужен. Увы.

Deamount
Offline
Зарегистрирован: 07.05.2012

частота - это же не частота вращения вращения вала, это частота импульсов?

для nema17 200шагов на оборот. получается он может работать на скорости 10000/200=50об/сек,

если на него подать 30В 2,5А. Верно я понимаю?

На 12В a4988 работает точно так же, как L298N. также чудовищно греется на малых оборотах. Опять же с использованием любой библиотеки. Я временно сделал такой выход: библиотеки не использую, в случае малых оборотов (например задержка между шагами 3мс) подаю управляющие импульсы только на 1мс, потом все нули на протяжении 2мс (не подаётся напряжение на обмотки). и т.д следующие шаги. при этом удержание конечно не высокое, но достаточное. А драйвер не дымит...

а есть более грамотное решение?

E2E4
Offline
Зарегистрирован: 26.03.2016

после конфигурации прошивки 3д принтера Марлин установил рампс 1.4 (по ошибки в дефолте был 1.3) и о чудо - движок через драйвер tb6600 заработал! плавно четко.....  но беда в другом, из трех осей заработал только один, и что еще более непонятно - заработал наполовину, т.е. в одну сторону только крутится, ну и соответственно, если поменять фазы обмотки, то в другую

какие у кого мысли? где и что поправить чтобы все три драйвера работали на полную (пробовал вместо каждой оси подставить драйвер a4988 и двигатель nema17 - все работает без глюков)

vladimir62
vladimir62 аватар
Offline
Зарегистрирован: 10.11.2015

Deamount, я эту картинку разместил, но комментарий куда то выпал. NEMA 17 бывают разные, т.е с "лица" они одного размера, а вот в профиль разные, т.е. длина разная, поэтому и моменты и напряжения разнятся. Вот у PURELOGIC такие, т.е. достаточно мощные для этого типоразмера. Что касается частоты, то там указан полушаг, т.е. не 200 импульсов на оборот , а 400. И соответственно, подсчитанные вами 50 об/сек "плавно превращаются" в 25 об/сек. Но  на таких оборотах ШД свой ротор только крутит. Что касается ваших драйверов, черт их знает чего они так "горячатся", могу лишь вам сказать, что у меня моторы работающие на приличную нагрузку очень горячие, руку долго не удержишь и это нормально для них. Драйвера тоже греются, но я каждому драйверу вентилятор (40 мм) вешаю. 

Вот кстати, Е2Е4, а  у вас  а4988 сильно греются?

 

 

E2E4
Offline
Зарегистрирован: 26.03.2016

vladimir62. все зависит от того, с какой нагрузкой двигатель работает это во первых, какой он сам мощности, это во вторых, какую силу тока (подстроечным резистором) выставляем, ну и если блокировку ставим, когда обе обмотки в противофазе блокируют вал - то в этом случае можно и обжеч руку, но это 17 нема, а если брать те что помощнее... и драйвера мощные - то и задымиться движки могут, я в свое время парочку BAUTZ хороших движков спалил, аналог NEMA 42 где то....

vladimir62
vladimir62 аватар
Offline
Зарегистрирован: 10.11.2015

 Да это ясно, у Deamounta эти драйвера греются, а с ними дел не имел и вообще сомневаюсь, что у них подстройка есть. У вас то на холостую, на полушаге, на 2-3 об/сек он греются работая на Nema 17? 

 

E2E4
Offline
Зарегистрирован: 26.03.2016

я просто сейчас не с 17 работаю, вожусь с 66 драйверами, но 17 сам двигатель при небольших нагрузках греется только в простое, а так слегка теплый

vladimir62
vladimir62 аватар
Offline
Зарегистрирован: 10.11.2015

Deamount пишет:

у меня драйвер L298N, Nano V3, NEMA17, напряжение 9В -12В и максимум, что accelstepper, что stepperQ дают - это 6 (шесть) оборотов в секунду... причем при 12В кажется чуть хуже чем при 9В. что не так делаю? как выжать 12-15 об/сек ?

Кстати на небольших оборотах обе библиотеки так разогревают драйвер что яйца на них жарить можно... аж подгарают ... )

Е2Е4 я про яйца на ваших драйверах А4988 хотел узнать :о).

E2E4
Offline
Зарегистрирован: 26.03.2016

есть такое, это же по теории то элементарно: что такое маленькие обороты? это две обмотки на высоких токах друг друга поджаривают чтоб сохранить момент, и если радиатор не обдувать, то горят драйвера как пирожки, потому на мощных драйверах и ставят радиаторы во всю плату

 

кстати, по поводу моей проблемы с рампсом только что наконец то разобрался, оказалось что прошивка Марлин хитромудро думала что все оси за пределами, т.е. барахлили концевики, и если софтом вернуть все координаты в ноль - то все три оси работают вполне прекрасно.

 

так что проблема решена

vladimir62
vladimir62 аватар
Offline
Зарегистрирован: 10.11.2015

Успокоил Deamonta!

Мне не очень нужен 3D принтер, я заказываю детали, когда требуется. А зачем TB6600 для 3D принтера?

E2E4
Offline
Зарегистрирован: 26.03.2016

у меня не совсем обычный принтер, во первых размеры больше, а во вторых пытаюсь поднять скорость в 1.4 раза по сравнению с обычными 3д принтерами

vladimir62
vladimir62 аватар
Offline
Зарегистрирован: 10.11.2015

Интригуете? Что значит не совсем и почему в 1.4? Если не секрет , конечно.

maxvalin
Offline
Зарегистрирован: 22.02.2016

И мне интересно, принтер наверное и как минифрезер используется..

 

SCHMaster
Offline
Зарегистрирован: 11.06.2016

2achest

ОРОМНЕЙШЕЕ СПАСИБО за StepperQ !!!

Наконец то удалось реализовать и управление ШД и вывод на экран информации без "заиканий!

vik300001
Offline
Зарегистрирован: 12.06.2016

Теперь и для меня вопрос актуален.


void setup()
{
  stepper.setMaxSpeed(1600);
}
void loop()
{
  stepper.setSpeed(1000);
  stepper.setAcceleration(500);
  stepper.moveTo(100000L);
  stepper.run();
}

У меня данный код работает без ускорения. В чем может быть проблема. Может загвоздка в комманде run();? Эти команды есть еще и stepper.runSpeedToPosition(); и stepper.runToNewPosition(); и еще наверное какието. Скажите в чем разница?

 

brokly
brokly аватар
Offline
Зарегистрирован: 08.02.2014

Почитайте AccelStepper.h , там каждая функция расшифрована. Могу предположить, что runTo.. блокирующие функции. То есть есть, если их вызвать, то управление вернется только после полной отработки движения (пока мотор не доедет до нужной точки, программа будет "висеть"), как delay(). 

vik300001
Offline
Зарегистрирован: 12.06.2016

 

Точно. пишет что run() блокирует.  stepper.runToNewPosition(); тоже блокирует. а runSpeedToPosition() не блокирует, но не поддержывает ускорение/замедление. 

Тогда на главный вопрос темы 

ZMan пишет:

Задача такова: необходимо запустить двигатель с ускорением и последующей работой на определьнных оборотах, "неограниченное" время, без остановок.

никто так и неответил, неужели нет решения??

 

 

brokly
brokly аватар
Offline
Зарегистрирован: 08.02.2014

В вашей простейшей задаче используйте функцию tone(), разгон - поднимпйте тон плавненько, а дальше просто на долгое время tone заряжаете. Тут уже так делали, это не я придумал. Дешево и онкелю назло :)

elt.muxeu
Offline
Зарегистрирован: 04.04.2017

День добрый форумчанам.

Вопрос на засыпку: библиотека stepperQ позволяет управлять 2-мя (и более) шаговыми двигателями?

 

rapidshe
Offline
Зарегистрирован: 31.12.2015

Блин, что за магия... почему иногда мотор разгоняется без ускорения (т.е. моментально на нужные обороты выходит) и тормозит так же. а иногда меееелдленно разгоняется и не быстрее останавливается......

над кодом как только не извращался. уже везде втыкаю ускорение. было подозрение что драйвер успевает "забыть" заданное ускорение.

 

сдается мне, я упускаю что то очень важное :/

void loop () {
 int sensorReading = analogRead(rez_pin);
 motorSpeed = map(sensorReading, 0, 1023, 12, 996); //73ед-5.5об/мин 
 Serial.println(motorSpeed);
 stepperq.setMaxSpeed(motorSpeed);
 stepperq.setAcceleration(18000);
 if (digitalRead(tumb_pin)) tumb_stepper_run = false;
 else tumb_stepper_run = true;
 if (tumb_stepper_run) 
    { 
    if (!stepper_run)
       {
       digitalWrite(enbl_pin, LOW);
       stepperq.init(dir_pin,step_pin);
       stepperq.setMaxSpeed(motorSpeed);
       stepperq.setAcceleration(18000); //ускорение мотора
       stepperq.moveTo(8000);
       stepperq.start();
       stepper_run = true; 
       }
    else if (stepperq.distanceToGo()<4000) 
       {
       stepperq.setAcceleration(18000);
       stepperq.move(8000);
       }
    else 
       {
       //setLCDdata ();
       }
    }
 else
    {
    if (stepper_run)
       {
       stepperq.setAcceleration(18000); //ускорение мотора
       stepperq.stop();
       stepper_run = false; 
       }
    }
}

 

achest
achest аватар
Offline
Зарегистрирован: 01.10.2012

elt.muxeu пишет:

Вопрос на засыпку: библиотека stepperQ позволяет управлять 2-мя (и более) шаговыми двигателями?

Нет, это технически не возможно. Используется 1 прерывание. Для управления 2-м двигателем надо использовать другое прерывание., т.е переписывать библиотеку..

Количество прерываний ограниченно. Переписывать не буду, буду разбираться с RTOS.