Управление ШД по StepDir, с ожиданием действия и выставлением на 0 по концевому выключателю

Рабочие проекты Ардуино
Аватара пользователя
RASL94
Сообщения: 29
Зарегистрирован: 25 июл 2018, 19:10

Управление ШД по StepDir, с ожиданием действия и выставлением на 0 по концевому выключателю

Сообщение RASL94 » 25 июл 2018, 20:12

Есть два двигателя с драйверами, необходимо что бы при запуске и нажатии кнопки они выставились в ,,0,, по концевому выключателю, а затем были в режиме ожидания. По команде (нажатие на кнопку) они должны поворачиваться на заданный угол. помогите пожалуйста разобраться, из уроков понят примерно как нужно сделать, только вот цикл повторяется, не знаю как сделать чтобы двигатели были в режиме ожидания нажатия на кнопку, и после выставления по концевикам не перемещались.


Эдуард
Администратор
Сообщения: 401
Зарегистрирован: 30 окт 2016, 20:53

Re: Управление ШД по StepDir, с ожиданием действия и выставлением на 0 по концевому выключателю

Сообщение Эдуард » 25 июл 2018, 21:44

Здравствуйте!
А у вас схема собрана? К каким выводам двигатели и кнопки подключены?
У меня нет собранного макета вашего устройства. Поэтому я могу предложить поэтапно разрабатывать программу. Каждый этап вы будете проверять. Соберите для начала схему и перечислите выводы, которые вы используете.
Если вопрос, как остановить двигатели в режиме ожидания, то это просто. Задать 0 шагов myMotor.step(0);

Аватара пользователя
RASL94
Сообщения: 29
Зарегистрирован: 25 июл 2018, 19:10

Re: Управление ШД по StepDir, с ожиданием действия и выставлением на 0 по концевому выключателю

Сообщение RASL94 » 25 июл 2018, 22:10

#include <TimerOne.h>
#include <StepDirDriver.h>
#include <Button.h>

#define NUM_STEPS_MOTOR 200 // число шагов двигателя на оборот

StepDirDriver D1(5,6,7); // создаем объект типа StepDirDriver, задаем выводы для сигналов D1
StepDirDriver D2(10,11,12); // создаем объект типа StepDirDriver, задаем выводы для сигналов D2

Button limit1 (4, 10); // создание объекта для концевика D1
Button limit2 (13, 10); // создание объекта для концевика D2

Button but1 (8, 10); // создание объекта для кнопки первого действия
Button but2 (9, 10); // создание объекта для кнопки второго действия

unsigned int currentStepD1=0; // текущее положение двигателя D1
unsigned int currentStepD2=0; // текущее положение двигателя D2


unsigned int setStepD1=0; // заданное положение двигателя D1
unsigned int setStepD2=0; // заданное положение двигателя D2


byte limirD1=0; // режим: 0 - пауза, 1 - синхронизация концевик не нажат, 2 - синхронизация концевик нажат, 3 - ожидание надатия кнопки действия
byte limirD2=0; // режим: 0 - пауза, 1 - синхронизация концевик не нажат, 2 - синхронизация концевик нажат, 3 - ожидание надатия кнопки действия


byte timer=0; // таймер



void setup() {
Timer1.initialize(250); // инициализация таймера 1, период 250 мкс
Timer1.attachInterrupt(timerInterrupt, 250); // задаем обработчик прерываний
D1.setMode(0, false); // шаговый режим, без фиксации при остановке
D2.setMode(0, false);
D1.setDivider(20); // делитель частоты 20 (1 оборот в сек)
D2.setDivider(20);
}

void loop() {


Эдуард
Администратор
Сообщения: 401
Зарегистрирован: 30 окт 2016, 20:53

Re: Управление ШД по StepDir, с ожиданием действия и выставлением на 0 по концевому выключателю

Сообщение Эдуард » 26 июл 2018, 00:09

Попробуйте этот вариант.
Реализована синхронизация 1 двигателя по кнопке. Если нажали на кнопку, а двигатель находился на датчике, то он сначала сходит с датчика, потом останавливается на нем. Это сделано для того, чтобы найти край датчика. Если не надо, то можно выбросить.
Еще надо правильно выставить направление вращения двигателя.
Проверьте, мог ошибиться.

Код: Выделить всё

#include <TimerOne.h>
#include <StepDirDriver.h>
#include <Button.h>

#define NUM_STEPS_MOTOR 200 // число шагов двигателя на оборот

StepDirDriver D1(5,6,7); // создаем объект типа StepDirDriver, задаем выводы для сигналов D1
StepDirDriver D2(10,11,12); // создаем объект типа StepDirDriver, задаем выводы для сигналов D2

Button limit1 (4, 10); // создание объекта для концевика D1
Button limit2 (13, 10); // создание объекта для концевика D2

Button but1 (8, 100); // создание объекта для кнопки первого действия
Button but2 (9, 100); // создание объекта для кнопки второго действия

byte mode1=0; // режим: 0 - ожидание, 1 - сход с датчика, 2 - поиск датчика, 3 - остановка на датчике

void setup() {
  Timer1.initialize(250); // инициализация таймера 1, период 250 мкс
  Timer1.attachInterrupt(timerInterrupt, 250); // задаем обработчик прерываний
  D1.setMode(0, false); // шаговый режим, без фиксации при остановке
  D2.setMode(0, false);
  D1.setDivider(20); // делитель частоты 20 (1 оборот в сек)
  D2.setDivider(20);

  delay(50);
  but1.flagClick=false;
  but2.flagClick=false;
 
}

void loop() {

  if( mode1 == 0 ) {
    //------------------------------------------- ожидание
    D1.step(0);
    if( but1.flagClick == true ) mode1= 1;   
  }

  else if ( mode1 == 1 ) {
    //------------------------------------------- сход с датчика
    D1.step(-32000);  // в сторону от датчика
    if( limit1.flagPress == false ) {
      // с датчика сошли
      mode1= 2;
    }     
  }

  else if ( mode1 == 2 ) {
    //------------------------------------------- поиск датчика
    D1.step(32000);  // к датчику
    if( limit1.flagPress == true ) {
      // датчик сработал
      mode1= 3;
      but1.flagClick=false;
    }     
  }

  else if ( mode1 == 3 ) {
    //------------------------------------------- остановка на датчике
    D1.step(0); 
    if( but1.flagClick == true ) mode1= 1;  // повторная синхронизация, если надо
   
  }
 
  else mode1=0;

}

//-------------------------------------- обработчик прерывания 0,25 мс
void  timerInterrupt() {
  D1.control(); // управвление двигателем
  D2.control(); // управвление двигателем
  limit1.filterAvarage();  // вызов метода фильтрации кнопки
  limit2.filterAvarage();  // вызов метода фильтрации кнопки
  but1.filterAvarage();  // вызов метода фильтрации кнопки
  but2.filterAvarage();  // вызов метода фильтрации кнопки
}

Аватара пользователя
RASL94
Сообщения: 29
Зарегистрирован: 25 июл 2018, 19:10

Re: Управление ШД по StepDir, с ожиданием действия и выставлением на 0 по концевому выключателю

Сообщение RASL94 » 26 июл 2018, 15:19

Спасибо, все срабатывает как надо, возможно сделать что бы он не совершал оборот, а допустим 150 шагов по часовой, если нет датчика, то 200 против часовой?

Эдуард
Администратор
Сообщения: 401
Зарегистрирован: 30 окт 2016, 20:53

Re: Управление ШД по StepDir, с ожиданием действия и выставлением на 0 по концевому выключателю

Сообщение Эдуард » 26 июл 2018, 18:09

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

Аватара пользователя
RASL94
Сообщения: 29
Зарегистрирован: 25 июл 2018, 19:10

Re: Управление ШД по StepDir, с ожиданием действия и выставлением на 0 по концевому выключателю

Сообщение RASL94 » 26 июл 2018, 21:39

пример, ШД находиться в положении 1: делает 150 шагов по стрелке, концевик не сработал.
2: делает 200 шагов в обратную сторону до срабатывания концевика
можно как то реализовать срабатывание при включении, без нажатия кнопки, но что бы и кнопка работала?
Вложения
EGh7TVjSwWE.jpg

Эдуард
Администратор
Сообщения: 401
Зарегистрирован: 30 окт 2016, 20:53

Re: Управление ШД по StepDir, с ожиданием действия и выставлением на 0 по концевому выключателю

Сообщение Эдуард » 26 июл 2018, 23:33

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

Аватара пользователя
RASL94
Сообщения: 29
Зарегистрирован: 25 июл 2018, 19:10

Re: Управление ШД по StepDir, с ожиданием действия и выставлением на 0 по концевому выключателю

Сообщение RASL94 » 26 июл 2018, 23:43

Эдуард писал(а):Получится, что двигатель остановился с неизвестной стороны концевика. Даже, если концевик не фиксирует вал двигателя, то точность пострадает. С разных сторон концевик будет срабатывать по разному. Может я чего-то не понимаю. Подумайте. Если надо, то сделаю так.


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

Эдуард
Администратор
Сообщения: 401
Зарегистрирован: 30 окт 2016, 20:53

Re: Управление ШД по StepDir, с ожиданием действия и выставлением на 0 по концевому выключателю

Сообщение Эдуард » 26 июл 2018, 23:49

Да, конечно. Щель имеет определенную ширину. Я в этой программе при нахождении на просвете специально схожу с датчика, чтобы найти край щели.

Аватара пользователя
RASL94
Сообщения: 29
Зарегистрирован: 25 июл 2018, 19:10

Re: Управление ШД по StepDir, с ожиданием действия и выставлением на 0 по концевому выключателю

Сообщение RASL94 » 27 июл 2018, 00:18

Эдуард писал(а):Да, конечно. Щель имеет определенную ширину. Я в этой программе при нахождении на просвете специально схожу с датчика, чтобы найти край щели.

спасибо,попробую переделать, пока что оставлю так.
как быть с автоматическим выставлением на 0 при запуске?

добавил действие для but2, происходит что то непонятное, не останавливается вообще, после совершения 100 шагов.

if( mode2 == 0 ) {
//------------------------------------------- ожидание
D1.step(0);

if( but2.flagClick == true ) mode2= 1;

}

else if ( mode2 == 1 ) {
//------------------------------------------- делает 100 шагов
D1.step(100);
if( but2.flagClick == false)
{

mode2= 2;

}
}



else if ( mode2 == 2 ) {
D1.step(0);
//------------------------------------------- повтпорить при надатии
if( but2.flagClick == true )
{
mode2= 1;

}


}
else mode2=0;

Эдуард
Администратор
Сообщения: 401
Зарегистрирован: 30 окт 2016, 20:53

Re: Управление ШД по StepDir, с ожиданием действия и выставлением на 0 по концевому выключателю

Сообщение Эдуард » 27 июл 2018, 00:35

Можно убрать режим 0. Можно добавить переход с режима 0 на режим 1.

Код: Выделить всё

  if( mode1 == 0 ) {
    //------------------------------------------- ожидание
    D1.step(0);
    if( but1.flagClick == true ) mode1= 1; 
    mode1 = 1; 
  }

Аватара пользователя
RASL94
Сообщения: 29
Зарегистрирован: 25 июл 2018, 19:10

Re: Управление ШД по StepDir, с ожиданием действия и выставлением на 0 по концевому выключателю

Сообщение RASL94 » 27 июл 2018, 00:49

Эдуард писал(а):Можно убрать режим 0. Можно добавить переход с режима 0 на режим 1.

Код: Выделить всё

  if( mode1 == 0 ) {
    //------------------------------------------- ожидание
    D1.step(0);
    if( but1.flagClick == true ) mode1= 1; 
    mode1 = 1; 
  }



ничего не поменялось


if( mode2 == 0 ) {
//------------------------------------------- ожидание
D1.step(0);
if( but2.flagClick == true ) mode2= 1;
mode2= 1;
}

else if ( mode2 == 1 ) {
//------------------------------------------- делает 100 шагов
D1.step(100);
if( but2.flagClick == false)
{

mode2= 2;

}
}



else if ( mode2 == 2 ) {
D1.step(0);
//------------------------------------------- повтпорить при надатии
if( but2.flagClick == true )
{
mode2= 1;

}


}
else mode2=0;

Эдуард
Администратор
Сообщения: 401
Зарегистрирован: 30 окт 2016, 20:53

Re: Управление ШД по StepDir, с ожиданием действия и выставлением на 0 по концевому выключателю

Сообщение Эдуард » 27 июл 2018, 11:48

Код: Выделить всё

#include <TimerOne.h>
#include <StepDirDriver.h>
#include <Button.h>

#define NUM_STEPS_MOTOR 200 // число шагов двигателя на оборот

StepDirDriver D1(5,6,7); // создаем объект типа StepDirDriver, задаем выводы для сигналов D1
StepDirDriver D2(10,11,12); // создаем объект типа StepDirDriver, задаем выводы для сигналов D2

Button limit1 (4, 10); // создание объекта для концевика D1
Button limit2 (13, 10); // создание объекта для концевика D2

Button but1 (8, 100); // создание объекта для кнопки первого действия
Button but2 (9, 100); // создание объекта для кнопки второго действия

byte mode1=0; // режим: 0 - ожидание, 1 - сход с датчика, 2 - поиск датчика, 3 - остановка на датчике

void setup() {
  Timer1.initialize(250); // инициализация таймера 1, период 250 мкс
  Timer1.attachInterrupt(timerInterrupt, 250); // задаем обработчик прерываний
  D1.setMode(0, false); // шаговый режим, без фиксации при остановке
  D2.setMode(0, false);
  D1.setDivider(20); // делитель частоты 20 (1 оборот в сек)
  D2.setDivider(20);

  delay(50);
  but1.flagClick=false;
  but2.flagClick=false;
 
}

void loop() {

  if( mode1 == 0 ) {
    //------------------------------------------- ожидание
    D1.step(0);
    if( but1.flagClick == true ) mode1= 1;   
    mode1= 1;
  }

  else if ( mode1 == 1 ) {
    //------------------------------------------- сход с датчика
    D1.step(-32000);  // в сторону от датчика
    if( limit1.flagPress == false ) {
      // с датчика сошли
      mode1= 2;
    }     
  }

  else if ( mode1 == 2 ) {
    //------------------------------------------- поиск датчика
    D1.step(32000);  // к датчику
    if( limit1.flagPress == true ) {
      // датчик сработал
      mode1= 3;
      but1.flagClick=false;
    }     
  }

  else if ( mode1 == 3 ) {
    //------------------------------------------- остановка на датчике
    D1.step(0); 
    if( but1.flagClick == true ) mode1= 1;  // повторная синхронизация, если надо
   
  }
 
  else mode1=0;

}

//-------------------------------------- обработчик прерывания 0,25 мс
void  timerInterrupt() {
  D1.control(); // управвление двигателем
  D2.control(); // управвление двигателем
  limit1.filterAvarage();  // вызов метода фильтрации кнопки
  limit2.filterAvarage();  // вызов метода фильтрации кнопки
  but1.filterAvarage();  // вызов метода фильтрации кнопки
  but2.filterAvarage();  // вызов метода фильтрации кнопки
}

Аватара пользователя
RASL94
Сообщения: 29
Зарегистрирован: 25 июл 2018, 19:10

Re: Управление ШД по StepDir, с ожиданием действия и выставлением на 0 по концевому выключателю

Сообщение RASL94 » 27 июл 2018, 12:00

Ааааа, про обнуление при включении, это да отрабатывает, спасибо.
можно ведь добавить на but2 действие, поворот на 100 шагов и ожидание дальнейших команд?

Эдуард
Администратор
Сообщения: 401
Зарегистрирован: 30 окт 2016, 20:53

Re: Управление ШД по StepDir, с ожиданием действия и выставлением на 0 по концевому выключателю

Сообщение Эдуард » 27 июл 2018, 12:53

Код: Выделить всё

#include <TimerOne.h>
#include <StepDirDriver.h>
#include <Button.h>

#define NUM_STEPS_MOTOR 200 // число шагов двигателя на оборот

StepDirDriver D1(5,6,7); // создаем объект типа StepDirDriver, задаем выводы для сигналов D1
StepDirDriver D2(10,11,12); // создаем объект типа StepDirDriver, задаем выводы для сигналов D2

Button limit1 (4, 10); // создание объекта для концевика D1
Button limit2 (13, 10); // создание объекта для концевика D2

Button but1 (8, 100); // создание объекта для кнопки первого действия
Button but2 (9, 100); // создание объекта для кнопки второго действия

byte mode1=0; // режим: 0 - ожидание, 1 - сход с датчика, 2 - поиск датчика, 3 - остановка на датчике
// 4 - отработка 100 по кнопке

void setup() {
  Timer1.initialize(250); // инициализация таймера 1, период 250 мкс
  Timer1.attachInterrupt(timerInterrupt, 250); // задаем обработчик прерываний
  D1.setMode(0, false); // шаговый режим, без фиксации при остановке
  D2.setMode(0, false);
  D1.setDivider(20); // делитель частоты 20 (1 оборот в сек)
  D2.setDivider(20);

  delay(50);
  but1.flagClick=false;
  but2.flagClick=false;
 
}

void loop() {

  if( mode1 == 0 ) {
    //------------------------------------------- ожидание
    D1.step(0);
    if( but1.flagClick == true ) mode1= 1;   
    mode1= 1;
  }

  else if ( mode1 == 1 ) {
    //------------------------------------------- сход с датчика
    D1.step(-32000);  // в сторону от датчика
    if( limit1.flagPress == false ) {
      // с датчика сошли
      mode1= 2;
    }     
  }

  else if ( mode1 == 2 ) {
    //------------------------------------------- поиск датчика
    D1.step(32000);  // к датчику
    if( limit1.flagPress == true ) {
      // датчик сработал
      mode1= 3;
      but1.flagClick=false;
      but2.flagClick=false;
    }     
  }

  else if ( mode1 == 3 ) {
    //------------------------------------------- остановка на датчике
    D1.step(0); 
    if( but1.flagClick == true ) mode1= 1;  // повторная синхронизация, если надо
    if( but2.flagClick == true ) {
      D1.step(100);
      mode1= 4;
    }
  }

  else if ( mode1 == 4 ) {
    //------------------------------------------- отработка 100 шагоыв по кнопке but2
    if (D1.readSteps() == 0) {
      but1.flagClick=false;
      but2.flagClick=false; 
      mode1= 3;       
    }   
  }
 
  else mode1=0;

}

//-------------------------------------- обработчик прерывания 0,25 мс
void  timerInterrupt() {
  D1.control(); // управвление двигателем
  D2.control(); // управвление двигателем
  limit1.filterAvarage();  // вызов метода фильтрации кнопки
  limit2.filterAvarage();  // вызов метода фильтрации кнопки
  but1.filterAvarage();  // вызов метода фильтрации кнопки
  but2.filterAvarage();  // вызов метода фильтрации кнопки
}

Аватара пользователя
RASL94
Сообщения: 29
Зарегистрирован: 25 июл 2018, 19:10

Re: Управление ШД по StepDir, с ожиданием действия и выставлением на 0 по концевому выключателю

Сообщение RASL94 » 27 июл 2018, 13:12

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

Аватара пользователя
RASL94
Сообщения: 29
Зарегистрирован: 25 июл 2018, 19:10

Re: Управление ШД по StepDir, с ожиданием действия и выставлением на 0 по концевому выключателю

Сообщение RASL94 » 27 июл 2018, 13:45

все работает, но возникли проблемы: 1- с пропусканием шагов, то есть, сделав 100 шагов и -100 шагов, возвращается не в то же самое место; 2- возможно ли сделать что бы допустим при нажатии but4, он сначала обнулился, а потом сделал действие?
3- можно ли зациклить действие, пример: по нажатию but5, (он делает 100 шагов, пауза 2 секунды, делает -150 шагов,пауза 1 секунду) и так по кругу.

Код: Выделить всё

#include <TimerOne.h>
#include <StepDirDriver.h>
#include <Button.h>

#define NUM_STEPS_MOTOR 200 // число шагов двигателя на оборот

StepDirDriver D1(5,6,7); // создаем объект типа StepDirDriver, задаем выводы для сигналов D1
StepDirDriver D2(10,11,12); // создаем объект типа StepDirDriver, задаем выводы для сигналов D2

Button limit1 (4, 10); // создание объекта для концевика D1
Button limit2 (13, 10); // создание объекта для концевика D2

Button but1 (8, 100); // создание объекта для кнопки действия №1 (сброс)
Button but2 (9, 100); // создание объекта для кнопки действия №2 (100 шагов)
Button but3 (2, 100); // создание объекта для кнопки действия №3 (-100 шагов)
Button but4 (1, 100); // создание объекта для кнопки действия №4 (150 шагов)
Button but5 (3, 100); // создание объекта для кнопки действия №5 (-150 шагов)




byte mode1=0; // режим: 0 - ожидание, 1 - сход с датчика, 2 - поиск датчика, 3 - остановка на датчике
// 4 - отработка 100 по кнопке, 5 - отработка -100 по кнопке, 6 - отработка 150 по кнопке,
// 7 - отработка -150 по кнопке,

void setup() {
  Timer1.initialize(250); // инициализация таймера 1, период 250 мкс
  Timer1.attachInterrupt(timerInterrupt, 250); // задаем обработчик прерываний
  D1.setMode(0, false); // шаговый режим, без фиксации при остановке
  D2.setMode(0, false);
  D1.setDivider(20); // делитель частоты 20 (1 оборот в сек)
  D2.setDivider(20);

  delay(50);
  but1.flagClick=false;
  but2.flagClick=false;
  but3.flagClick=false;
  but4.flagClick=false;
  but5.flagClick=false;
 
}

void loop() {

  if( mode1 == 0 ) {
    //------------------------------------------- ожидание
    D1.step(0);
    if( but1.flagClick == true ) mode1= 1;   
    mode1= 1;
  }

  else if ( mode1 == 1 ) {
    //------------------------------------------- сход с датчика
    D1.step(-32000);  // в сторону от датчика
    if( limit1.flagPress == false ) {
      // с датчика сошли
      mode1= 2;
    }     
  }

  else if ( mode1 == 2 ) {
    //------------------------------------------- поиск датчика
    D1.step(32000);  // к датчику
    if( limit1.flagPress == true ) {
      // датчик сработал
      mode1= 3;
      but1.flagClick=false;
      but2.flagClick=false;
      but3.flagClick=false;
      but4.flagClick=false;
      but5.flagClick=false;
    }     
  }

  else if ( mode1 == 3 ) {
    //------------------------------------------- остановка на датчике
    D1.step(0); 
    if( but1.flagClick == true ) mode1= 1;  // повторная синхронизация, если надо
    if( but2.flagClick == true ) {
      D1.step(-100);
      mode1= 4;
    }
     if( but3.flagClick == true ) {
      D1.step(100);
      mode1= 5;
    }
if( but4.flagClick == true ) {
      D1.step(150);
      mode1= 6;
    }
if( but5.flagClick == true ) {
      D1.step(-150);
      mode1= 7;
    }
 
 
  }
 

  else if ( mode1 == 4 ) {
    //------------------------------------------- отработка 100 шагоыв по кнопке but2
    if (D1.readSteps() == 0) {
      but1.flagClick=false;
      but2.flagClick=false;
      but3.flagClick=false;
      but4.flagClick=false;
      but5.flagClick=false;
      mode1= 3;   
         
    }   
  }


   else if ( mode1 == 5 ) {
    //------------------------------------------- отработка -100 шагоыв по кнопке but3
    if (D1.readSteps() == 0) {
      but1.flagClick=false;
      but2.flagClick=false;
      but3.flagClick=false;
      but4.flagClick=false;
      but5.flagClick=false;
      mode1= 3;   
         
    } 
   }
 else if ( mode1 == 6 ) {
    //------------------------------------------- отработка 150 шагоыв по кнопке but4
    if (D1.readSteps() == 0) {
      but1.flagClick=false;
      but2.flagClick=false;
      but3.flagClick=false;
      but4.flagClick=false;
      but5.flagClick=false;
      mode1= 3;   
         
    } 
   }
else if ( mode1 == 7) {
    //------------------------------------------- отработка -150 шагоыв по кнопке but5
    if (D1.readSteps() == 0) {
      but1.flagClick=false;
      but2.flagClick=false;
      but3.flagClick=false;
      but4.flagClick=false;
      but5.flagClick=false;
      mode1= 3;   
         
    } 
   }
 
  else mode1=0;

}

//-------------------------------------- обработчик прерывания 0,25 мс
void  timerInterrupt() {
  D1.control(); // управвление двигателем
  D2.control(); // управвление двигателем
  limit1.filterAvarage();  // вызов метода фильтрации кнопки
  limit2.filterAvarage();  // вызов метода фильтрации кнопки
  but1.filterAvarage();  // вызов метода фильтрации кнопки
  but2.filterAvarage();  // вызов метода фильтрации кнопки
  but3.filterAvarage();  // вызов метода фильтрации кнопки
  but4.filterAvarage();  // вызов метода фильтрации кнопки
  but5.filterAvarage();  // вызов метода фильтрации кнопки

Эдуард
Администратор
Сообщения: 401
Зарегистрирован: 30 окт 2016, 20:53

Re: Управление ШД по StepDir, с ожиданием действия и выставлением на 0 по концевому выключателю

Сообщение Эдуард » 27 июл 2018, 14:26

Может шаги пропускает потому что установлен режим снятия тока с обмоток при остановке. Надо сделать
D1.setMode(0, true);
В этом режиме, если механическая нагрузка в пределах нормы, шаги пропускать не должен.

Аватара пользователя
RASL94
Сообщения: 29
Зарегистрирован: 25 июл 2018, 19:10

Re: Управление ШД по StepDir, с ожиданием действия и выставлением на 0 по концевому выключателю

Сообщение RASL94 » 27 июл 2018, 15:08

разброс чуть меньше, но все равно есть, может вместо концевика использовать потенциометр, для отслеживания положения ШД, так как нет необходимости движения больше 300 градусов?

Эдуард
Администратор
Сообщения: 401
Зарегистрирован: 30 окт 2016, 20:53

Re: Управление ШД по StepDir, с ожиданием действия и выставлением на 0 по концевому выключателю

Сообщение Эдуард » 27 июл 2018, 15:31

Шаги пропускать не должен. Возможно механическая нагрузка большая. Какой драйвер используется? Есть STEP/DIR драйвера, которые автоматически уменьшают ток при прекращении импульсов STEP.
У меня есть разработка - система управления сверлильным станком. Там синхронизация происходит один раз при включении питания. После этого все работает часами без пропуска шагов. Надо разбираться.

Аватара пользователя
RASL94
Сообщения: 29
Зарегистрирован: 25 июл 2018, 19:10

Re: Управление ШД по StepDir, с ожиданием действия и выставлением на 0 по концевому выключателю

Сообщение RASL94 » 27 июл 2018, 16:06

нагрузки пока что вообще нет, драйвер OMD 15v2.

для корректной работы заменил в библиотеке

Код: Выделить всё

/ инициирует поворот двигателя на заданное число шагов
void  StepDirDriver::step(int steps) {

  // блокировка
  if ( (steps == 0) && (_fixStop == false) ) digitalWrite(_pinEn, LOW); //заменил (_pinEn, HIGH) на (_pinEn, LOW)
  else digitalWrite(_pinEn, HIGH);//заменил (_pinEn, LOW) на (_pinEn, HIGH)


Аватара пользователя
RASL94
Сообщения: 29
Зарегистрирован: 25 июл 2018, 19:10

Re: Управление ШД по StepDir, с ожиданием действия и выставлением на 0 по концевому выключателю

Сообщение RASL94 » 27 июл 2018, 20:49

при старте действия при нажатии на кнопу, ШД с начало дергается, затем делает нужное количество шагов, дело похоже в том что я не совсем адекватно редактировал библиотеку.

Аватара пользователя
RASL94
Сообщения: 29
Зарегистрирован: 25 июл 2018, 19:10

Re: Управление ШД по StepDir, с ожиданием действия и выставлением на 0 по концевому выключателю

Сообщение RASL94 » 27 июл 2018, 22:02

это не важно, работает адекватно теперь)
RASL94 писал(а):при старте действия при нажатии на кнопу, ШД с начало дергается, затем делает нужное количество шагов, дело похоже в том что я не совсем адекватно редактировал библиотеку.

Аватара пользователя
RASL94
Сообщения: 29
Зарегистрирован: 25 июл 2018, 19:10

Re: Управление ШД по StepDir, с ожиданием действия и выставлением на 0 по концевому выключателю

Сообщение RASL94 » 27 июл 2018, 22:08

Можно ли зациклить действие, пример: по нажатию but3, (он делает 100 шагов, пауза 2 секунды, делает -150 шагов,пауза 1 секунду) и так по кругу.

Аватара пользователя
RASL94
Сообщения: 29
Зарегистрирован: 25 июл 2018, 19:10

Re: Управление ШД по StepDir, с ожиданием действия и выставлением на 0 по концевому выключателю

Сообщение RASL94 » 28 июл 2018, 14:13

RASL94 писал(а):Можно ли зациклить действие, пример: по нажатию but3, (он делает 100 шагов, пауза 2 секунды, делает -150 шагов,пауза 1 секунду) и так по кругу.


что то не так работает, по нажатию but2 ШД делает поворот на 100 шагов и стоит, нажимаю еще раз but2 ничего не происходит, нажимаю еще раз делает -100 шагов. что не так?

Код: Выделить всё


#include <TimerOne.h>
#include <StepDirDriver.h>
#include <Button.h>

StepDirDriver D1(10, 11, 12);  // создаем объект типа StepDirDriver, задаем выводы для сигналов
Button limit1 (13, 10); // создание объекта для концевика D2
Button but1 (8, 100); // создание объекта для кнопки действия №1 (сброс)
Button but2 (9, 100); // создание объекта для кнопки действия №2


unsigned int timeCounter; // счетчик времени
byte md;  // режим: 0 - - делает -100 шагов, 1 - пауза, 2 - делает -100 шагов, 3 - пауза/
byte mode1 = 0;// режим: 0 - ожидание, 1 - сход с датчика, 2 - поиск датчика, 3 - остановка на датчике
// 4 - отработка режима md по кнопке,

void setup() {
  Timer1.initialize(250);  // инициализация таймера 1, период 250 мкс
  Timer1.attachInterrupt(timerInterrupt, 250);  // задаем обработчик прерываний
  D1.setMode(0, false);  // шаговый режим, без фиксации при остановке
  D1.setDivider(20);     // делитель частоты 20 (1 оборот в сек)
 

  delay(50);
  but1.flagClick = false;
  but2.flagClick = false;

}

void loop() {

  if ( mode1 == 0 ) {
    //-----------------------------------------— ожидание
    D1.step(0);
    if ( but1.flagClick == true ) mode1 = 1;
    mode1 = 1;
  }

  else if ( mode1 == 1 ) {
    //-----------------------------------------— сход с датчика
    D1.step(-32000); // в сторону от датчика
    if ( limit1.flagPress == false ) {
      // с датчика сошли
      mode1 = 2;
    }
  }
  else if ( mode1 == 2 ) {
    //-----------------------------------------— поиск датчика
    D1.step(32000); // к датчику
    if ( limit1.flagPress == true ) {
      // датчик сработал
      mode1 = 3;
      but1.flagClick = false;
      but2.flagClick = false;

    }
  }
  else if ( mode1 == 3 ) {
    //-----------------------------------------— остановка на датчике
    D1.step(0);
    if ( but1.flagClick == true ) mode1 = 1; // повторная синхронизация, если надо
   
    if ( but2.flagClick == true ) //выполнить режим md
    {
      if (md == 0)  {
        // 2 оборота по часовой стрелке
        if (D1.readSteps() == 0) {
          md = 1;
          timeCounter = 0;
        }
      }
      else if (md == 1) {
        // пауза 1 сек
        if (timeCounter >= 1000)  {
          md = 2;
          D1.step(-100);
        }
      }
      else if (md == 2) {
        // 2 оборота против часовой стрелки
        if (D1.readSteps() == 0) {
          md = 3;
          timeCounter = 0;
        }
      }
      else {
        // пауза 1 сек
        if (timeCounter >= 1000)  {
          md = 0;
          D1.step(100);
        }
      }
      mode1 = 4;
    }
  }

  else if ( mode1 == 4 ) {
    //-----------------------------------------— отработка  по кнопке but2
    if (D1.readSteps() == 0) {
      but1.flagClick = false;
      but2.flagClick = false;

      mode1 = 3;

    }
  }





  // управление вращением двигателя
  else mode1 = 0;
}

//-------------------------------------- обработчик прерывания 0,25 мс
void  timerInterrupt() {
  D1.control(); // управвление двигателем
  limit1.filterAvarage(); //вызов метода фильтрации кнопки
  but1.filterAvarage(); // вызов метода фильтрации кнопки
  but2.filterAvarage(); // вызов метода фильтрации кнопки
  timeCounter++; // счетчик времени
}


Эдуард
Администратор
Сообщения: 401
Зарегистрирован: 30 окт 2016, 20:53

Re: Управление ШД по StepDir, с ожиданием действия и выставлением на 0 по концевому выключателю

Сообщение Эдуард » 28 июл 2018, 14:18

Здравствуйте!
Вечером или завтра посмотрю. Сейчас совсем нет времени.

Аватара пользователя
RASL94
Сообщения: 29
Зарегистрирован: 25 июл 2018, 19:10

Re: Управление ШД по StepDir, с ожиданием действия и выставлением на 0 по концевому выключателю

Сообщение RASL94 » 28 июл 2018, 14:57

Эдуард писал(а):Здравствуйте!
Вечером или завтра посмотрю. Сейчас совсем нет времени.

Спасибо, пока что сам попробую разобраться)

Эдуард
Администратор
Сообщения: 401
Зарегистрирован: 30 окт 2016, 20:53

Re: Управление ШД по StepDir, с ожиданием действия и выставлением на 0 по концевому выключателю

Сообщение Эдуард » 28 июл 2018, 22:49

Код: Выделить всё

#include <TimerOne.h>
#include <StepDirDriver.h>
#include <Button.h>

#define NUM_STEPS_MOTOR 200 // число шагов двигателя на оборот

StepDirDriver D1(5,6,7); // создаем объект типа StepDirDriver, задаем выводы для сигналов D1
StepDirDriver D2(10,11,12); // создаем объект типа StepDirDriver, задаем выводы для сигналов D2

Button limit1 (4, 10); // создание объекта для концевика D1
Button limit2 (13, 10); // создание объекта для концевика D2

Button but1 (8, 100); // создание объекта для кнопки первого действия
Button but2 (9, 100); // создание объекта для кнопки второго действия

volatile unsigned int timeCounter; // счетчик времени
byte mode1=0; // режим: 0 - ожидание, 1 - сход с датчика, 2 - поиск датчика, 3 - остановка на датчике
// 4 - отработка 100 по кнопке

void setup() {
  Timer1.initialize(250); // инициализация таймера 1, период 250 мкс
  Timer1.attachInterrupt(timerInterrupt, 250); // задаем обработчик прерываний
  D1.setMode(0, false); // шаговый режим, без фиксации при остановке
  D2.setMode(0, false);
  D1.setDivider(20); // делитель частоты 20 (1 оборот в сек)
  D2.setDivider(20);

  delay(50);
  but1.flagClick=false;
  but2.flagClick=false;
 
}

void loop() {

  if( mode1 == 0 ) {
    //------------------------------------------- ожидание
    D1.step(0);
    if( but1.flagClick == true ) mode1= 1;   
    mode1= 1;
  }

  else if ( mode1 == 1 ) {
    //------------------------------------------- сход с датчика
    D1.step(-32000);  // в сторону от датчика
    if( limit1.flagPress == false ) {
      // с датчика сошли
      mode1= 2;
    }     
  }

  else if ( mode1 == 2 ) {
    //------------------------------------------- поиск датчика
    D1.step(32000);  // к датчику
    if( limit1.flagPress == true ) {
      // датчик сработал
      mode1= 3;
      but1.flagClick=false;
      but2.flagClick=false;
    }     
  }

  else if ( mode1 == 3 ) {
    //------------------------------------------- остановка на датчике
    D1.step(0); 
    if( but1.flagClick == true ) mode1= 1;  // повторная синхронизация, если надо
    if( but2.flagClick == true ) {
      D1.step(100);
      mode1= 4;
    }
  }

  else if ( mode1 == 4 ) {
    //------------------------------------------- отработка 100 шагоыв по кнопке but2
    if (D1.readSteps() == 0) {
      timeCounter=0;
      mode1= 5;       
    }   
  }

  else if ( mode1 == 5 ) {
    //------------------------------------------- пауза 2 сек
    if( timeCounter > 8000 ) {
      D1.step(-150);
      mode1= 6;     
    }
  }
 
  else if ( mode1 == 6 ) {
    //------------------------------------------- отработка -150 шагов
    if (D1.readSteps() == 0) {
      timeCounter=0;
      mode1= 7;       
    }   
  }

  else if ( mode1 == 7 ) {
    //------------------------------------------- пауза 1 сек
    if( timeCounter > 4000 ) {
      D1.step(100);
      mode1= 4;     
    }
  }
 
 
  else mode1=0;

}

//-------------------------------------- обработчик прерывания 0,25 мс
void  timerInterrupt() {
  D1.control(); // управвление двигателем
  D2.control(); // управвление двигателем
  limit1.filterAvarage();  // вызов метода фильтрации кнопки
  limit2.filterAvarage();  // вызов метода фильтрации кнопки
  but1.filterAvarage();  // вызов метода фильтрации кнопки
  but2.filterAvarage();  // вызов метода фильтрации кнопки
  timeCounter++;
}


Вернуться в «Проекты Ардуино»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 0 гостей