Здравствуйте, хочу поделиться библиотекой 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.
Удачи!
Библиотека STEP/DIR для Leadshine M542
-
- Сообщения: 1
- Зарегистрирован: 23 апр 2018, 07:10
Библиотека STEP/DIR для Leadshine M542
- Вложения
-
- StepDirDriverLA.rar
- Long steps, setAccel
- (3.28 КБ) 542 скачивания
Re: Библиотека STEP/DIR для Leadshine M542
Спасибо за приятные слова и за доработку библиотеки.
Re: Библиотека STEP/DIR для Leadshine M542
не содержит корректных библиотек...
надо бы zip архивчик подключилась вручную
игрался аргументами, так она и не заработала, не понятно что такое точка ускорения... ставил уже что угодно.... не работает, как ее представить то в голове эту точку?
надо бы zip архивчик подключилась вручную
игрался аргументами, так она и не заработала, не понятно что такое точка ускорения... ставил уже что угодно.... не работает, как ее представить то в голове эту точку?
Re: Библиотека STEP/DIR для Leadshine M542
if ( ( long(abs(_steps)) > 2*(long(_acc - _divider) * long(_divAcc) ) ) && (_acc > _divider)) {
_divAcc_count = _acc; // ускорение активно
автор не позаботился чтобы было понятно всем, условие активации ускорения
_divAcc_count = _acc; // ускорение активно
автор не позаботился чтобы было понятно всем, условие активации ускорения
Re: Библиотека STEP/DIR для Leadshine M542
субьективно, под управлением grbl двигатели греются меньше, может быть этому объяснение? все стоят на удержании в обоих случаях
Re: Библиотека STEP/DIR для Leadshine M542
=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
}
Большое спасибо за помощь и информацию.
С уважением,
Вадим
Re: Библиотека STEP/DIR для Leadshine M542
у кого есть скетч при котором эта библиотека нормально ускоряет nema23/34 перепробовал кучу параметров двух аргументов, плавно как в accelstepper не получается
Re: Библиотека STEP/DIR для Leadshine M542
Здравствуйте!
Уменьшите период прерывания по таймеру. Регулировка скорости будет плавнее.
Уменьшите период прерывания по таймеру. Регулировка скорости будет плавнее.
Вернуться в «Шаговые двигатели и драйверы»
Кто сейчас на конференции
Сейчас этот форум просматривают: нет зарегистрированных пользователей и 0 гостей