Управление шаговым двигателем при помощи кнопок.

Tremfeltepper
Offline
Зарегистрирован: 26.03.2015



Уважаемые знатоки! Предлагаю Вашему вниманию два варианта кода.

Первый:



int steps1 = 2;
int steps2 = 3;
int enable = 5;
 int dir = 8;
  
const int Start = 10;
int dl = 500;
int State = 0;


void setup()
{
 
 pinMode(steps1, OUTPUT);
 pinMode(steps2, OUTPUT);
    pinMode(dir, OUTPUT);
    pinMode(enable, OUTPUT);
 pinMode(Start,INPUT);
 
}

void loop()
{
    State = digitalRead(Start);
    if(State == HIGH)
    {
        digitalWrite(dir, LOW);
         digitalWrite(enable, LOW);
        delayMicroseconds(10);
    if(dl > 125)
    dl -= 1;
    //Деление шага 1/1
   
/*----------------------Полношаговый 1 фаза.*/
     digitalWrite(steps1, HIGH);//1
    digitalWrite(steps2, LOW);
    digitalWrite(steps1, LOW);
    digitalWrite(steps2, LOW);
    delayMicroseconds(dl);

    digitalWrite(steps1, LOW);//2
    digitalWrite(steps2, LOW);
    digitalWrite(steps1, HIGH);
    digitalWrite(steps2, LOW);
    delayMicroseconds(dl);

    digitalWrite(steps1, LOW); //3
    digitalWrite(steps2, HIGH);
    digitalWrite(steps1, LOW);
    digitalWrite(steps2, LOW);
    delayMicroseconds(dl);

    digitalWrite(steps1, LOW);//4
    digitalWrite(steps2, LOW);
    digitalWrite(steps1, LOW);
    digitalWrite(steps2, HIGH);
    delayMicroseconds(dl);

    }
    else
{  
    digitalWrite(steps1, LOW);
    digitalWrite(steps2, LOW);
       digitalWrite(enable, HIGH);
       delayMicroseconds(10);
    dl = 500;
    
    }
}

Здесь двигатель запускается при нажатии кнопки Start и плавно набирает скорость.

При отключении кнопки тут же останавливается.Плавный старт даёт большую скорость.

Скорость и усилие на валу являются удовлетворительными для моих целей.

Но  при большем количестве двигателей возникает путаница с enable.

Второй:



int steps1 = 2;
int steps2 = 3;
int enable = 5;
int dir = 8;

const int buttonStart = 10;
const int buttonRevers = 11;

int Revers = 0;
int Start = 0;


void Pryamoi_xod(int dl)
{
  digitalWrite(dir, HIGH);
  digitalWrite(enable, LOW);
  delayMicroseconds(10);
   if (dl > 125)
    {
    dl -= 1;
      /***************************Прямой ход*/
      digitalWrite(steps1, HIGH);//1
    digitalWrite(steps2, LOW);
    digitalWrite(steps1, LOW);
    digitalWrite(steps2, LOW);
    delayMicroseconds(dl);

    digitalWrite(steps1, LOW);//2
    digitalWrite(steps2, LOW);
    digitalWrite(steps1, HIGH);
    digitalWrite(steps2, LOW);
    delayMicroseconds(dl);

    digitalWrite(steps1, LOW); //3
    digitalWrite(steps2, HIGH);
    digitalWrite(steps1, LOW);
    digitalWrite(steps2, LOW);
    delayMicroseconds(dl);

    digitalWrite(steps1, LOW);//4
    digitalWrite(steps2, LOW);
    digitalWrite(steps1, LOW);
    digitalWrite(steps2, HIGH);
    delayMicroseconds(dl);
  }
  else
  {
    digitalWrite(steps1, LOW);
    digitalWrite(steps2, LOW);
    //delayMicroseconds(dl);                                   
  }
  digitalWrite(enable, HIGH);
  delayMicroseconds(10);
}

void Rewers(int rv)
{
  digitalWrite(dir, LOW);
  digitalWrite(enable, LOW);//В начале может  быть в цикле и за пределами цикла!В конце только за пределами цикла!!!
  delayMicroseconds(10);
 
    if (rv > 300)
    {
      rv -= 1;
    digitalWrite(steps1, HIGH);//1
    digitalWrite(steps2, LOW);
    digitalWrite(steps1, LOW);
    digitalWrite(steps2, LOW);
    delayMicroseconds(rv);

    digitalWrite(steps1, LOW);//2
    digitalWrite(steps2, HIGH);
    digitalWrite(steps1, LOW);
    digitalWrite(steps2, LOW);
    delayMicroseconds(rv);

    digitalWrite(steps1, LOW); //3
    digitalWrite(steps2, LOW);
    digitalWrite(steps1, HIGH);
    digitalWrite(steps2, LOW);
    delayMicroseconds(rv);

    digitalWrite(steps1, LOW);//4
    digitalWrite(steps2, LOW);
    digitalWrite(steps1, LOW);
    digitalWrite(steps2, HIGH);
    delayMicroseconds(rv);

  }
  else
  {
    digitalWrite(steps1, LOW);//4
    digitalWrite(steps2, LOW);
    digitalWrite(dir, HIGH);
  }
  //Если впереди enable за пределами цикла,то и сзади тоже!!!!!
  digitalWrite(enable, HIGH);
  delayMicroseconds(10);
}

void setup()
{
  pinMode(steps1, OUTPUT);
  pinMode(steps2, OUTPUT);
  pinMode(enable, OUTPUT);
  pinMode(dir, OUTPUT);
  pinMode(buttonStart, INPUT);
  pinMode(buttonRevers, INPUT);


}

void loop()
{
  Start = digitalRead(buttonStart);
  if (Start == HIGH)
  {
    Pryamoi_xod (500);
  }

  Revers = digitalRead(buttonRevers);
  if (Revers == HIGH)
  {
    Rewers(500);
  }
}

Здесь созданы функции Прямой ход и Реверс.Путаницы с enable не возникает.Но не работает плавный старт.Из за этого двигатель не достигает нужной скорости.

В устройстве будет от 3 до 5 двигателей.Две синхронные пары и отдельный.Синхронные пары имеют Прямой ход и Реверс.Отдельный двигатель имеет только Прямой ход.

Сам я не программист и не могу сообразить что тут нужно.В первом варианте плавный старт работает,во втором нет.А должен.

Заранее благодарен!!!

 

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

когда у вас будет куча шаговиков ваши делеи вас просто задолбают - они наложатся на все моторы))))

Gippopotam
Gippopotam аватар
Offline
Зарегистрирован: 12.09.2014

Tremfeltepper пишет:

В устройстве будет от 3 до 5 двигателей.Две синхронные пары и отдельный.Синхронные пары имеют Прямой ход и Реверс.Отдельный двигатель имеет только Прямой ход.

Используя Ардуино, даже у Онкеля вряд ли получится плавно разгонять и тормозить 5 шаговиков не синхронно.

Tremfeltepper
Offline
Зарегистрирован: 26.03.2015

Плавно разгонять нужно только один.Это связано со средой,которую этот двигатель крутит.Тормозить плавно не нужно.Плавный разгон на синхронных парах тоже не нужен.

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

Я такую задачу решал бы созданием несколько вычислительных процессов. На каждый ШД свой выч. процесс. Пусть они крутятся по своим программам.

ПС: Вот только без создания выч. процессов я перестал писать программы.

Gippopotam
Gippopotam аватар
Offline
Зарегистрирован: 12.09.2014

Tremfeltepper пишет:

Плавно разгонять нужно только один.Это связано со средой,которую этот двигатель крутит.Тормозить плавно не нужно.Плавный разгон на синхронных парах тоже не нужен.

Задача сводится к виделению минимально возможного кванта времени и набору пауз между дерганием step для каждого мотора, с помощью этих квантов. Для двух двигателей можно и в loop() все организовать, особенно если нисего больше микроконтроллер не делает. Я как-то делал на таймере.

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

Gippopotam пишет:

Используя Ардуино, даже у Онкеля вряд ли получится плавно разгонять и тормозить 5 шаговиков не синхронно.

Не вижу никаких проблем. Хватило бы ног. Тем более в случае ТС - нужно  3 пина на степпер (step, dir, enable), да и просто с H-мостами если (20 ног на 5 шаговиков в уне уже туговато вытащить, но можно как раз 20). Заводим прерывание по таймеру с минимальным временем шага, и в функции обработки этого прерывания дрыгаем ногами.

ToRcH2565
Offline
Зарегистрирован: 16.05.2015

Gippopotam пишет:

Используя Ардуино, даже у Онкеля вряд ли получится плавно разгонять и тормозить 5 шаговиков не синхронно.

простите что?) 

у вас что там за шаговики и какова же скорость их вращения?))

16мгц, скорость друины, с ноги можно выжать прям в среде друины около 32кгц(если память мне не изменяет), 32кгц /5 = 6кгц на шаговик. берем стандартный шаговик 47 шагов на оборот. 6кгц /47 = 127 об\сек.

отнимем по 10 оборотов на математику( а она там простая, по 3 переменных на шаговик на момент разгона по нескольку операций сложения/умножения/деления)

получим 117, давайте даже 110 возьмем, итого 110 об\сек = 6600 об\мин(гдеб шаговиков таких набрать, чтоб 6к оборотов нормально держали). вы точно уверены что это сложно реализовать? плавный разгон+торможение 5 шаговиков?

и это всё, что написано выше, взято с диким занижением аппаратных возможностей....  и это без учета того что с 5 ног можно выжать много больше чем 32кгц сумарно, там выйдет примерно по 30кгц +/- на ногу(порядка 30к об\мин). 

Tremfeltepper
Offline
Зарегистрирован: 26.03.2015

Друзья мои!Тут проблема не в том,чтобы разогнать двигатель до максимума!Здесь нужна приличная тяга.

  if(dl > 125)

{

dl -= 1;

Вот эта фигня отлично работает  в loop.Достигается скорость 600 - 700 об/мин.,при этом хорошая тяга.Но при передаче в функцию значения  dl = 500;, и последующей попытке изменить его до 125 ничего не выходит!Можно всё сделать в loop.но если циклов больше одного то условия енабле начинают противоречить друг другу.

loop

енабле нет

Прямой ход

енабле да

енабле нет

Реверс

енабле да!

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

Внутри функции такой проблемы нет.

 

Tremfeltepper
Offline
Зарегистрирован: 26.03.2015

vvadim пишет:

когда у вас будет куча шаговиков ваши делеи вас просто задолбают - они наложатся на все моторы))))

А что можно использовать вместо делей?

 

Gippopotam
Gippopotam аватар
Offline
Зарегистрирован: 12.09.2014

Onkel пишет:

Gippopotam пишет:

Используя Ардуино, даже у Онкеля вряд ли получится плавно разгонять и тормозить 5 шаговиков не синхронно.

Не вижу никаких проблем. Хватило бы ног. Тем более в случае ТС - нужно  3 пина на степпер (step, dir, enable), да и просто с H-мостами если (20 ног на 5 шаговиков в уне уже туговато вытащить, но можно как раз 20). Заводим прерывание по таймеру с минимальным временем шага, и в функции обработки этого прерывания дрыгаем ногами.

Речь шла о плавном разгоне раздельно для 5 моторов. Уточнение, что это не нужно, появилось потом.

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

Gippopotam пишет:

Речь шла о плавном разгоне раздельно для 5 моторов. Уточнение, что это не нужно, появилось потом.

я понял, что там синхронно некоторые моторы включены, но тем не менее независимая работа 5 шаговиков на одном мк - задача весьма занудная, но решаемая. У меня 8 диммеров (а там частоты повыше будут) с 8 различными фэйдингами (это термин как раз для скорости изменения) крутятся. 5 шаговиков сам не делал (не было необходимости), но на 2 шаговика (в моем случае 4 ф униполярные) даже в atmega8 программа занимает 30% (менее 3к) флеша, так что число управляемых независимо шаговиков определяется лишь числом имеющихся ног.

Gippopotam
Gippopotam аватар
Offline
Зарегистрирован: 12.09.2014

Onkel пишет:

Gippopotam пишет:

Речь шла о плавном разгоне раздельно для 5 моторов. Уточнение, что это не нужно, появилось потом.

я понял, что там синхронно некоторые моторы включены, но тем не менее независимая работа 5 шаговиков на одном мк - задача весьма занудная, но решаемая. У меня 8 диммеров (а там частоты повыше будут) с 8 различными фэйдингами (это термин как раз для скорости изменения) крутятся. 5 шаговиков сам не делал (не было необходимости), но на 2 шаговика (в моем случае 4 ф униполярные) даже в atmega8 программа занимает 30% (менее 3к) флеша, так что число управляемых независимо шаговиков определяется лишь числом имеющихся ног.

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

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

порадовала скорость шаговиков без потери момента у тс))))))))))))))

наверно у него моторы с другой физикой))))))))))))))))

Tremfeltepper
Offline
Зарегистрирован: 26.03.2015

vvadim пишет:

порадовала скорость шаговиков без потери момента у тс))))))))))))))

наверно у него моторы с другой физикой))))))))))))))))

Пока nema 23 на всех.На синхронные пары планирую 34,но их пока нет.Синхронные пары будут двигаться медленно и там наверно не будет проблем с тягой и скоростью.Проблема с одним движком ,на котором я испытываю функции приведенные выше.

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

Gippopotam пишет:

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

Элементарно. Как работает многоканальный диммер? Есть два прерывания, одно - для фэйдинга (плавного изменения яркости), другое- для ШИМ, причем это физически может быть одно и то же прерывание по тому же самому таймеру, ну и в функции обработки прерывания включаются / выключаются пины, управляющие мосфитами или симисторами, и декрементируется / инкрементируется яркость, для всех каналов в одной функции прерывания. А при управлениии шаговиками вместо вкл/выкл пинов делаем перещелкивание пинов, четырех (если прямое управление) или формируем импульст step (если управление через драйвер шд), и также декрементируем / инкрементируем скорости ШД.

пы сы у меня даже физически светодиодный диммер на 8 каналов и драйвер для двух униполярных 4ф шаговиков- одно и то же, только фирмварь разная. Беру 8 канальные LED диммеры в корпусе на дин рейку, перепрошиваю и управляю   cnc микрофрезером

Gippopotam
Gippopotam аватар
Offline
Зарегистрирован: 12.09.2014

Onkel пишет:

...

и также декрементируем / инкрементируем скорости ШД.

...

Кто-то из нас двоих не в теме.

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

Gippopotam пишет:

Кто-то из нас двоих не в теме.

как осуществлятеся плавный разгон / торможение шаговика, кроме как инкрементом / декрементом скорости?

Gippopotam
Gippopotam аватар
Offline
Зарегистрирован: 12.09.2014

Onkel пишет:

Gippopotam пишет:

Кто-то из нас двоих не в теме.

как осуществлятеся плавный разгон / торможение шаговика, кроме как инкрементом / декрементом скорости?

Какой-такой скорости?

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

(угловой) скорости вращения шаговика

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

При правильном подходе можно плавно гонять и больше пяти шаговиков с плавным разгоном и торможением и без "чистого онкелевского си", используя древнюю библиотеку "аксельстепер", при этом потребуется один таймер, а максимальная скорость будет до 200 шагов в секунду на мотор, при 5 моторах, на mega2560. Равномерность шагов достаточно приличная - плавают в пределах 5%.