Управление ШД по StepDir, с ожиданием действия и выставлением на 0 по концевому выключателю
Re: Управление ШД по StepDir, с ожиданием действия и выставлением на 0 по концевому выключателю
Проверить смогу только с утра, делал тоже самое, только начало действия с нажатия but2 вызывало mode1=5 , нажатие вообще не работало
Re: Управление ШД по StepDir, с ожиданием действия и выставлением на 0 по концевому выключателю
все работает, можно ли при выполнении действий по нажатию 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++;
}
Re: Управление ШД по StepDir, с ожиданием действия и выставлением на 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;
}
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++;
}
Re: Управление ШД по StepDir, с ожиданием действия и выставлением на 0 по концевому выключателю
Спасибо Тебе огромное, сам бы я не разобрался, все работает как надо. Осталось еще несколько вопросов, как сделать что бы на but3 можно было полностью отключить драйвер(enable=0)? в библиотеке придется что то еще менять?
Re: Управление ШД по StepDir, с ожиданием действия и выставлением на 0 по концевому выключателю
Зачем. Функция setMode. Если второй аргумент false, то при остановке двигателя снимается напряжение с обмоток.
Re: Управление ШД по StepDir, с ожиданием действия и выставлением на 0 по концевому выключателю
Эдуард писал(а):Зачем. Функция setMode. Если второй аргумент false, то при остановке двигателя снимается напряжение с обмоток.
допусти ШД делает несколько оборотов, но его надо экстренно остановить, ШД не остановиться пока не сделает эти обороты?
Re: Управление ШД по StepDir, с ожиданием действия и выставлением на 0 по концевому выключателю
Остановка делается просто: D1.step(0);
Re: Управление ШД по StepDir, с ожиданием действия и выставлением на 0 по концевому выключателю
все разобрался, у меня два ШД как сделать что бы:
нажимаем кнопку but3, схема на фото.
нажимаем кнопку but3, схема на фото.
Re: Управление ШД по StepDir, с ожиданием действия и выставлением на 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);
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++;
}
Re: Управление ШД по StepDir, с ожиданием действия и выставлением на 0 по концевому выключателю
спасибо, я просто
и так поперемнно)
Код: Выделить всё
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++;
}
Re: Управление ШД по StepDir, с ожиданием действия и выставлением на 0 по концевому выключателю
Проблема оказалась серьезнее, важно что бы шаговый двигатель не проворачивался больше 360 градусов при калибровк. Не подскажите как это можно реализовать?
Эдуард писал(а):Получится, что двигатель остановился с неизвестной стороны концевика. Даже, если концевик не фиксирует вал двигателя, то точность пострадает. С разных сторон концевик будет срабатывать по разному. Может я чего-то не понимаю. Подумайте. Если надо, то сделаю так.
Re: Управление ШД по StepDir, с ожиданием действия и выставлением на 0 по концевому выключателю
[quote="RASL94"]Проблема оказалась серьезнее, важно что бы шаговый двигатель не проворачивался больше 360 градусов при калибровк. Не подскажите как это можно реализовать?
привет! так что ты хочешь собрать ? поделись девайсов
привет! так что ты хочешь собрать ? поделись девайсов
Кто сейчас на конференции
Сейчас этот форум просматривают: нет зарегистрированных пользователей и 0 гостей