Управление шаговым двигателем при помощи кнопок.
- Войдите на сайт для отправки комментариев
Уважаемые знатоки! Предлагаю Вашему вниманию два варианта кода.
Первый:
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 двигателей.Две синхронные пары и отдельный.Синхронные пары имеют Прямой ход и Реверс.Отдельный двигатель имеет только Прямой ход.
Сам я не программист и не могу сообразить что тут нужно.В первом варианте плавный старт работает,во втором нет.А должен.
Заранее благодарен!!!
когда у вас будет куча шаговиков ваши делеи вас просто задолбают - они наложатся на все моторы))))
В устройстве будет от 3 до 5 двигателей.Две синхронные пары и отдельный.Синхронные пары имеют Прямой ход и Реверс.Отдельный двигатель имеет только Прямой ход.
Используя Ардуино, даже у Онкеля вряд ли получится плавно разгонять и тормозить 5 шаговиков не синхронно.
Плавно разгонять нужно только один.Это связано со средой,которую этот двигатель крутит.Тормозить плавно не нужно.Плавный разгон на синхронных парах тоже не нужен.
Я такую задачу решал бы созданием несколько вычислительных процессов. На каждый ШД свой выч. процесс. Пусть они крутятся по своим программам.
ПС: Вот только без создания выч. процессов я перестал писать программы.
Плавно разгонять нужно только один.Это связано со средой,которую этот двигатель крутит.Тормозить плавно не нужно.Плавный разгон на синхронных парах тоже не нужен.
Задача сводится к виделению минимально возможного кванта времени и набору пауз между дерганием step для каждого мотора, с помощью этих квантов. Для двух двигателей можно и в loop() все организовать, особенно если нисего больше микроконтроллер не делает. Я как-то делал на таймере.
Используя Ардуино, даже у Онкеля вряд ли получится плавно разгонять и тормозить 5 шаговиков не синхронно.
Не вижу никаких проблем. Хватило бы ног. Тем более в случае ТС - нужно 3 пина на степпер (step, dir, enable), да и просто с H-мостами если (20 ног на 5 шаговиков в уне уже туговато вытащить, но можно как раз 20). Заводим прерывание по таймеру с минимальным временем шага, и в функции обработки этого прерывания дрыгаем ногами.
Используя Ардуино, даже у Онкеля вряд ли получится плавно разгонять и тормозить 5 шаговиков не синхронно.
простите что?)
у вас что там за шаговики и какова же скорость их вращения?))
16мгц, скорость друины, с ноги можно выжать прям в среде друины около 32кгц(если память мне не изменяет), 32кгц /5 = 6кгц на шаговик. берем стандартный шаговик 47 шагов на оборот. 6кгц /47 = 127 об\сек.
отнимем по 10 оборотов на математику( а она там простая, по 3 переменных на шаговик на момент разгона по нескольку операций сложения/умножения/деления)
получим 117, давайте даже 110 возьмем, итого 110 об\сек = 6600 об\мин(гдеб шаговиков таких набрать, чтоб 6к оборотов нормально держали). вы точно уверены что это сложно реализовать? плавный разгон+торможение 5 шаговиков?
и это всё, что написано выше, взято с диким занижением аппаратных возможностей.... и это без учета того что с 5 ног можно выжать много больше чем 32кгц сумарно, там выйдет примерно по 30кгц +/- на ногу(порядка 30к об\мин).
Друзья мои!Тут проблема не в том,чтобы разогнать двигатель до максимума!Здесь нужна приличная тяга.
if(dl > 125)
{
dl -= 1;
Вот эта фигня отлично работает в loop.Достигается скорость 600 - 700 об/мин.,при этом хорошая тяга.Но при передаче в функцию значения dl = 500;, и последующей попытке изменить его до 125 ничего не выходит!Можно всё сделать в loop.но если циклов больше одного то условия енабле начинают противоречить друг другу.
loop
енабле нет
Прямой ход
енабле да
енабле нет
Реверс
енабле да!
От енабле отказываться не хочется,потому что двигатели греются как утюги.
Внутри функции такой проблемы нет.
когда у вас будет куча шаговиков ваши делеи вас просто задолбают - они наложатся на все моторы))))
А что можно использовать вместо делей?
Используя Ардуино, даже у Онкеля вряд ли получится плавно разгонять и тормозить 5 шаговиков не синхронно.
Не вижу никаких проблем. Хватило бы ног. Тем более в случае ТС - нужно 3 пина на степпер (step, dir, enable), да и просто с H-мостами если (20 ног на 5 шаговиков в уне уже туговато вытащить, но можно как раз 20). Заводим прерывание по таймеру с минимальным временем шага, и в функции обработки этого прерывания дрыгаем ногами.
Речь шла о плавном разгоне раздельно для 5 моторов. Уточнение, что это не нужно, появилось потом.
Речь шла о плавном разгоне раздельно для 5 моторов. Уточнение, что это не нужно, появилось потом.
я понял, что там синхронно некоторые моторы включены, но тем не менее независимая работа 5 шаговиков на одном мк - задача весьма занудная, но решаемая. У меня 8 диммеров (а там частоты повыше будут) с 8 различными фэйдингами (это термин как раз для скорости изменения) крутятся. 5 шаговиков сам не делал (не было необходимости), но на 2 шаговика (в моем случае 4 ф униполярные) даже в atmega8 программа занимает 30% (менее 3к) флеша, так что число управляемых независимо шаговиков определяется лишь числом имеющихся ног.
Речь шла о плавном разгоне раздельно для 5 моторов. Уточнение, что это не нужно, появилось потом.
я понял, что там синхронно некоторые моторы включены, но тем не менее независимая работа 5 шаговиков на одном мк - задача весьма занудная, но решаемая. У меня 8 диммеров (а там частоты повыше будут) с 8 различными фэйдингами (это термин как раз для скорости изменения) крутятся. 5 шаговиков сам не делал (не было необходимости), но на 2 шаговика (в моем случае 4 ф униполярные) даже в atmega8 программа занимает 30% (менее 3к) флеша, так что число управляемых независимо шаговиков определяется лишь числом имеющихся ног.
Не могу согласиться, что задача тривиальная, и уж тем более, что она ограничена количеством ног. И прямой связи с диммерами не вижу.
порадовала скорость шаговиков без потери момента у тс))))))))))))))
наверно у него моторы с другой физикой))))))))))))))))
порадовала скорость шаговиков без потери момента у тс))))))))))))))
наверно у него моторы с другой физикой))))))))))))))))
Пока nema 23 на всех.На синхронные пары планирую 34,но их пока нет.Синхронные пары будут двигаться медленно и там наверно не будет проблем с тягой и скоростью.Проблема с одним движком ,на котором я испытываю функции приведенные выше.
Не могу согласиться, что задача тривиальная, и уж тем более, что она ограничена количеством ног. И прямой связи с диммерами не вижу.
Элементарно. Как работает многоканальный диммер? Есть два прерывания, одно - для фэйдинга (плавного изменения яркости), другое- для ШИМ, причем это физически может быть одно и то же прерывание по тому же самому таймеру, ну и в функции обработки прерывания включаются / выключаются пины, управляющие мосфитами или симисторами, и декрементируется / инкрементируется яркость, для всех каналов в одной функции прерывания. А при управлениии шаговиками вместо вкл/выкл пинов делаем перещелкивание пинов, четырех (если прямое управление) или формируем импульст step (если управление через драйвер шд), и также декрементируем / инкрементируем скорости ШД.
пы сы у меня даже физически светодиодный диммер на 8 каналов и драйвер для двух униполярных 4ф шаговиков- одно и то же, только фирмварь разная. Беру 8 канальные LED диммеры в корпусе на дин рейку, перепрошиваю и управляю cnc микрофрезером
...
и также декрементируем / инкрементируем скорости ШД.
...
Кто-то из нас двоих не в теме.
Кто-то из нас двоих не в теме.
как осуществлятеся плавный разгон / торможение шаговика, кроме как инкрементом / декрементом скорости?
Кто-то из нас двоих не в теме.
как осуществлятеся плавный разгон / торможение шаговика, кроме как инкрементом / декрементом скорости?
Какой-такой скорости?
(угловой) скорости вращения шаговика
При правильном подходе можно плавно гонять и больше пяти шаговиков с плавным разгоном и торможением и без "чистого онкелевского си", используя древнюю библиотеку "аксельстепер", при этом потребуется один таймер, а максимальная скорость будет до 200 шагов в секунду на мотор, при 5 моторах, на mega2560. Равномерность шагов достаточно приличная - плавают в пределах 5%.