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

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

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

Сообщение RASL94 » 28 июл 2018, 22:55

Проверить смогу только с утра, делал тоже самое, только начало действия с нажатия but2 вызывало mode1=5 , нажатие вообще не работало


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

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

Сообщение RASL94 » 29 июл 2018, 14:51

все работает, можно ли при выполнении действий по нажатию but2, допустим нажать but1. что бы вновь поставить ШД в 0 положение?

Эдуард писал(а):

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

#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++;
}

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

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

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

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

#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;       
    }   
    if( but1.flagClick == true ) mode1= 1;  // повторная синхронизация, если надо
  }

  else if ( mode1 == 5 ) {
    //------------------------------------------- пауза 2 сек
    if( timeCounter > 8000 ) {
      D1.step(-150);
      mode1= 6;     
    }
    if( but1.flagClick == true ) mode1= 1;  // повторная синхронизация, если надо
  }
 
  else if ( mode1 == 6 ) {
    //------------------------------------------- отработка -150 шагов
    if (D1.readSteps() == 0) {
      timeCounter=0;
      mode1= 7;       
    }   
    if( but1.flagClick == true ) mode1= 1;  // повторная синхронизация, если надо
  }

  else if ( mode1 == 7 ) {
    //------------------------------------------- пауза 1 сек
    if( timeCounter > 4000 ) {
      D1.step(100);
      mode1= 4;     
    }
    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();  // вызов метода фильтрации кнопки
  timeCounter++;
}

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

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

Сообщение RASL94 » 29 июл 2018, 23:58

Спасибо Тебе огромное, сам бы я не разобрался, все работает как надо. Осталось еще несколько вопросов, как сделать что бы на but3 можно было полностью отключить драйвер(enable=0)? в библиотеке придется что то еще менять?

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

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

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

Зачем. Функция setMode. Если второй аргумент false, то при остановке двигателя снимается напряжение с обмоток.

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

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

Сообщение RASL94 » 30 июл 2018, 00:26

Эдуард писал(а):Зачем. Функция setMode. Если второй аргумент false, то при остановке двигателя снимается напряжение с обмоток.

допусти ШД делает несколько оборотов, но его надо экстренно остановить, ШД не остановиться пока не сделает эти обороты?

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

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

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

Остановка делается просто: D1.step(0);

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

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

Сообщение RASL94 » 30 июл 2018, 03:55

все разобрался, у меня два ШД как сделать что бы:
нажимаем кнопку but3, схема на фото.
Вложения
ME0y7oQU_Is.jpg

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

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

Сообщение Эдуард » 03 авг 2018, 12:02

Привет! Я совсем забыл. Принцип пошагового автомата. Каждое состояние автомата отрабатывается своим программным блоком.

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

#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);
      D2.step(100);
      mode1= 4;
    }
  }

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

  else if ( mode1 == 5 ) {
    //-------------------------------------------
    if ( D2.readSteps() == 0 ) {
      timeCounter=0;
      mode1= 6;       
    }   
  }

  else if ( mode1 == 6 ) {
    //------------------------------------------- пауза 5 сек
    if( timeCounter > 20000 ) {
      D1.step(100);
      mode1= 7;     
    }
  }

  else if ( mode1 == 7 ) {
    //-------------------------------------------
    if ( D1.readSteps() == 0 ) {
      D2.step(100);
      mode1= 8;       
    }   
  }

  else if ( mode1 == 8 ) {
    //-------------------------------------------
    if ( D2.readSteps() == 0 ) {
      D1.step(100);
      mode1= 9;       
    }   
  }

  else if ( mode1 == 9 ) {
    //-------------------------------------------
    if ( D1.readSteps() == 0 ) {
      timeCounter=0;
      mode1= 10;       
    }   
  }

  else if ( mode1 == 10 ) {
    //------------------------------------------- пауза 5 сек
    if( timeCounter > 20000 ) {
      D1.step(100);
      mode1= 11;     
    }
  }

  else if ( mode1 == 11 ) {
    //-------------------------------------------
    if ( D1.readSteps() == 0 ) {
      D2.step(100);
      mode1= 12;       
    }   
  }

  else if ( mode1 == 12 ) {
    //-------------------------------------------
    if ( D2.readSteps() == 0 ) {
      timeCounter=0;
      mode1= 6;       
    }   
  }



 
  else mode1=0;

}

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

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

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

Сообщение RASL94 » 04 авг 2018, 00:09

спасибо, я просто

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

 else if ( mode1 == 10 ) {
    //------------------------------------------- пауза 5 сек
    if( timeCounter > 20000 ) {
      D1.step(100);
      mode1= 3;   
      mode2= 4 
    }
  }
 


и так поперемнно)

Эдуард писал(а):Привет! Я совсем забыл. Принцип пошагового автомата. Каждое состояние автомата отрабатывается своим программным блоком.

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

#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);
      D2.step(100);
      mode1= 4;
    }
  }

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

  else if ( mode1 == 5 ) {
    //-------------------------------------------
    if ( D2.readSteps() == 0 ) {
      timeCounter=0;
      mode1= 6;       
    }   
  }

  else if ( mode1 == 6 ) {
    //------------------------------------------- пауза 5 сек
    if( timeCounter > 20000 ) {
      D1.step(100);
      mode1= 7;     
    }
  }

  else if ( mode1 == 7 ) {
    //-------------------------------------------
    if ( D1.readSteps() == 0 ) {
      D2.step(100);
      mode1= 8;       
    }   
  }

  else if ( mode1 == 8 ) {
    //-------------------------------------------
    if ( D2.readSteps() == 0 ) {
      D1.step(100);
      mode1= 9;       
    }   
  }

  else if ( mode1 == 9 ) {
    //-------------------------------------------
    if ( D1.readSteps() == 0 ) {
      timeCounter=0;
      mode1= 10;       
    }   
  }

  else if ( mode1 == 10 ) {
    //------------------------------------------- пауза 5 сек
    if( timeCounter > 20000 ) {
      D1.step(100);
      mode1= 11;     
    }
  }

  else if ( mode1 == 11 ) {
    //-------------------------------------------
    if ( D1.readSteps() == 0 ) {
      D2.step(100);
      mode1= 12;       
    }   
  }

  else if ( mode1 == 12 ) {
    //-------------------------------------------
    if ( D2.readSteps() == 0 ) {
      timeCounter=0;
      mode1= 6;       
    }   
  }



 
  else mode1=0;

}

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

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

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

Сообщение RASL94 » 21 авг 2018, 00:47

Проблема оказалась серьезнее, важно что бы шаговый двигатель не проворачивался больше 360 градусов при калибровк. Не подскажите как это можно реализовать?


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

WadimZ
Сообщения: 26
Зарегистрирован: 25 июл 2018, 18:15

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

Сообщение WadimZ » 22 авг 2018, 22:36

[quote="RASL94"]Проблема оказалась серьезнее, важно что бы шаговый двигатель не проворачивался больше 360 градусов при калибровк. Не подскажите как это можно реализовать?



привет! так что ты хочешь собрать ? поделись девайсов


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

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

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