Библиотека STEP/DIR для Leadshine M542

Вопросы об управлении шаговыми двигателями
=provincial=
Сообщения: 1
Зарегистрирован: 23 апр 2018, 07:10

Библиотека STEP/DIR для Leadshine M542

Сообщение =provincial= » 23 апр 2018, 08:01

Здравствуйте, хочу поделиться библиотекой StepDirDriverLA, созданной на основе библиотеки StepDirDriverL.
Библиотека адаптирована для работы с драйверами шаговых двигателей CNC Leadshine и в ней добавлен новый метод - ускорение: .setAccel
Метод .setDivider дополнен вторым параметром - делителем частоты для малого кол-ва шагов.

Метод конфигурирования ускорения:
void setAccel (int acc, int divAcc);
acc - точка ускорения/замедления (начальный делитель);
divAcc - делитель на шаг (скорость нарастания ускорения);

Метод установки делителя:
void setDivider(int divider, int dividerLo);
divider - делитель максимальной скорости;
dividerLo - делитель минимальной скорости, когда режим ускорения не активен.

Остальная функциональность сохранена из StepDirDriverL.

После вызова метода step(long steps); идёт проверка хватит ли заданного кол-ва шагов для ускорения и замедления по заданным коэффициентам.
Если да - ускорение активно и двигатель разгоняется -> работает на высокой скорости -> замедляется.
Если нет - ускорение не активно двигатель сразу вращается с минимальной скоростью по заданному параметру dividerLo, затем останавливается без замедления.

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

Выражаю благодарность Эдуарду за ресурс и помощь людям своими публикациями.
Буду рад, если кому-то пригодится новая библиотека StepDirDriverLA.
Удачи!
Вложения
StepDirDriverLA.rar
Long steps, setAccel
(3.28 КБ) 25 скачиваний


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

Re: Библиотека STEP/DIR для Leadshine M542

Сообщение Эдуард » 23 апр 2018, 12:36

Спасибо за приятные слова и за доработку библиотеки.

Moofasta
Сообщения: 4
Зарегистрирован: 26 май 2018, 16:49

Re: Библиотека STEP/DIR для Leadshine M542

Сообщение Moofasta » 17 июл 2018, 13:30

не содержит корректных библиотек...

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

Moofasta
Сообщения: 4
Зарегистрирован: 26 май 2018, 16:49

Re: Библиотека STEP/DIR для Leadshine M542

Сообщение Moofasta » 17 июл 2018, 13:56

if ( ( long(abs(_steps)) > 2*(long(_acc - _divider) * long(_divAcc) ) ) && (_acc > _divider)) {
_divAcc_count = _acc; // ускорение активно

автор не позаботился чтобы было понятно всем, условие активации ускорения

Moofasta
Сообщения: 4
Зарегистрирован: 26 май 2018, 16:49

Re: Библиотека STEP/DIR для Leadshine M542

Сообщение Moofasta » 17 июл 2018, 14:23

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

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

Re: Библиотека STEP/DIR для Leadshine M542

Сообщение WadimZ » 26 окт 2018, 13:07

=provincial= писал(а):Здравствуйте, хочу поделиться библиотекой StepDirDriverLA, созданной на основе библиотеки StepDirDriverL.
Библиотека адаптирована для работы с драйверами шаговых двигателей CNC Leadshine и в ней добавлен новый метод - ускорение: .setAccel
Метод .setDivider дополнен вторым параметром - делителем частоты для малого кол-ва шагов.

Метод конфигурирования ускорения:
void setAccel (int acc, int divAcc);
acc - точка ускорения/замедления (начальный делитель);
divAcc - делитель на шаг (скорость нарастания ускорения);

Метод установки делителя:
void setDivider(int divider, int dividerLo);
divider - делитель максимальной скорости;
dividerLo - делитель минимальной скорости, когда режим ускорения не активен.

Остальная функциональность сохранена из StepDirDriverL.

После вызова метода step(long steps); идёт проверка хватит ли заданного кол-ва шагов для ускорения и замедления по заданным коэффициентам.
Если да - ускорение активно и двигатель разгоняется -> работает на высокой скорости -> замедляется.
Если нет - ускорение не активно двигатель сразу вращается с минимальной скоростью по заданному параметру dividerLo, затем останавливается без замедления.

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

Выражаю благодарность Эдуарду за ресурс и помощь людям своими публикациями.
Буду рад, если кому-то пригодится новая библиотека StepDirDriverLA.
Удачи!


Здравствуйте,
пожалуйста разъясните начинающему пользователю:
1. Как привести данный rar архив к виду, что бы просто подключить библиотеку в arduino IDE (как это делаеться с помощью - подключить библиотеку в IDE)
2. Как заменить изначальную stepdirdriver на доработанную вами библиотеку? мне надо что бы двигатель плавно стартовал и плавно замедлялся перед конечной точкой.

Разбираюсь с программой управления шаговыми двигателями через DMX512 протокол. Подскажите - как и на что заменить?

Скетч :

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

// программа следящего электропривода без обратной связи
 
#include <TimerOne.h>
#include <StepDirDriver.h>
#include <DMXSerial.h>
#include <Button.h>

#define NUM_STEPS_MOTOR 1600  // число шагов двигателя на оборот
#define DMX_CHANEL_MOTO_1 1   // канал DMX для двигателя 1
#define DMX_CHANEL_MOTO_2 2   // канал DMX для двигателя 2

unsigned int currentStep1=0;  // текущее положение двигателя
unsigned int setStep1=0;  // заданное положение двигателя
int stepsToDo1;  // сколько шагов надо сделать
byte mode1=0;  // режим: 0 - пауза, 1 - синхронизация датчик закрыт, 2 - синхронизация датчик открыт, 3 - слежение
unsigned int currentStep2=0;  // текущее положение двигателя
unsigned int setStep2=0;  // заданное положение двигателя
int stepsToDo2;  // сколько шагов надо сделать
byte mode2=0;  // режим: 0 - пауза, 1 - синхронизация датчик закрыт, 2 - синхронизация датчик открыт, 3 - слежение
byte timer=0; // таймер

StepDirDriver myMotor1(10, 11, 12);  // создаем объект типа StepDirDriver, задаем выводы для сигналов STEP, DIR, ENABLE
StepDirDriver myMotor2(7, 8, 9);  // создаем объект типа StepDirDriver, задаем выводы для сигналов STEP, DIR, ENABLE
Button sens1 (3, 10);  // создание объекта для датчика 1
Button sens2 (2, 10);  // создание объекта для датчика 1

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

void loop() {

//--------------------------------- двигатель 1 ---------------------------
  if( mode1 == 0 ) {
    // ожидание фильтрации датчиков
    if( timer > 40 ) {
      if( sens1.flagPress == true ) mode1=2;   
      else mode1=1;     
    }   
  }

  else if( mode1 == 1 ) {
    // синхронизация датчик закрыт
    myMotor1.step(-10); // по часовой
    if( sens1.flagPress == true ) {
      myMotor1.step(0);
      mode1=3;
    }
  }

  else if( mode1 == 2 ) {
    // синхронизация датчик открыт
    myMotor1.step(10); // против часовой
    if( sens1.flagPress == false ) {
      myMotor1.step(0);
      mode1=3;
    }
  }
 
  else if( mode1 == 3 ) {
    // слежение

  // ------------------------------------ СЛЕЖЕНИЕ
   
  // проверка остановки двигателя
  if( myMotor1.readSteps() == 0) {
    // двигатель остановился

    // получение заданного положения
    setStep1 = (unsigned int)((unsigned long)DMXSerial.read(DMX_CHANEL_MOTO_1) * (NUM_STEPS_MOTOR - 1) / 255) ;
   
    // определение сколько шагов надо сделать
    stepsToDo1 = currentStep1 - setStep1; // ошибка рассогласования

//    if( abs(stepsToDo1) >= (NUM_STEPS_MOTOR / 2) ) {

//      if((stepsToDo1) > 0) stepsToDo1 -= NUM_STEPS_MOTOR;
//      else                stepsToDo1 += NUM_STEPS_MOTOR;     
//    }
 
    myMotor1.step(stepsToDo1);  // запуск двигателя
    currentStep1 = setStep1;  // перегрузка текущего положения   
  }

  }
  else mode1=0;


//--------------------------------- двигатель 2 ---------------------------
  if( mode2 == 0 ) {
    // ожидание фильтрации датчиков
    if( timer > 40 ) {
      if( sens2.flagPress == true ) mode2=2;   
      else mode2=1;     
    }   
  }

  else if( mode2 == 1 ) {
    // синхронизация датчик закрыт
    myMotor2.step(-10); // по часовой
    if( sens2.flagPress == true ) {
      myMotor2.step(0);
      mode2=3;
    }
  }

  else if( mode2 == 2 ) {
    // синхронизация датчик открыт
    myMotor2.step(10); // против часовой
    if( sens2.flagPress == false ) {
      myMotor2.step(0);
      mode2=3;
    }
  }
 
  else if( mode2 == 3 ) {
    // слежение

  // ------------------------------------ СЛЕЖЕНИЕ
   
  // проверка остановки двигателя
  if( myMotor2.readSteps() == 0) {
    // двигатель остановился

    // получение заданного положения
    setStep2 = (unsigned int)((unsigned long)DMXSerial.read(DMX_CHANEL_MOTO_2) * (NUM_STEPS_MOTOR - 1) / 255) ;
   
    // определение сколько шагов надо сделать
    stepsToDo2 = currentStep2 - setStep2; // ошибка рассогласования

//    if( abs(stepsToDo2) >= (NUM_STEPS_MOTOR / 2) ) {

//      if((stepsToDo2) > 0) stepsToDo2 -= NUM_STEPS_MOTOR;
//      else                stepsToDo2 += NUM_STEPS_MOTOR;     
//    }
 
    myMotor2.step(stepsToDo2);  // запуск двигателя
    currentStep2 = setStep2;  // перегрузка текущего положения   
  }

  }
  else mode2=0;
 
}

//-------------------------------------- обработчик прерывания 250 мкс
void  timerInterrupt() {
  timer++;
  myMotor1.control(); // управвление двигателем
  myMotor2.control(); // управвление двигателем
  sens1.filterAvarage();  // вызов метода фильтрации по среднему для датчика 1
  sens2.filterAvarage();  // вызов метода фильтрации по среднему для датчика 1
}


Большое спасибо за помощь и информацию.

С уважением,
Вадим


Вернуться в «Шаговые двигатели и драйверы»

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

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