Подключение драйвера шагового двигателя
- Войдите на сайт для отправки комментариев
Чт, 23/11/2017 - 23:31
Есть драйвер DM432, DM420 и подобные.
На вход принимает импульсы с изменением от 2х мкс. Подскажите, как проще всего программно реализовать функцию регулировки скорости, то есть изменение частоты импульсов hi/low на выходе?
М.б. это потянет https://playground.arduino.cc/Code/Timer1 ? Чтобы уже всё было ардуинисто, а не портографически...
А есть ли более простой способ получения сигнала с изменяемой длительностью?
Так и не удалось найти какую либо информацию
Может как то изменить библиотеку stepper или servo?
Так и не удалось найти какую либо информацию
Может как то изменить библиотеку stepper или servo?
Да, как раз читаю про нее. Она работает с драйвером, это хорошо, но я пока не совсем понимаю, как указывать направление вращения?
Собственно задача проста, нужно с плавным пуском и остановкой включать мотор в разных направлениях
управляешь этим:
objectName.moveTo(steps);
Усли steps увеличивается, получаешь вращение в одну сторону, если уменьшается - то в другую, если не изменяется, то стоит на месте.
А я-то подумал, что товарищ нестандартных решений ищет...
Вот скетч.
При приеме сигнала, значением больше 128 мотор должен начать вращаться и примерно через 6 секунд остановиться. Следующий запуск должен быть в другую сторону, но почему то вообще не работает
#include <AccelStepper.h> #include <DMXSerial.h> #define LED1 3 #define LED2 1 #define DIR 8 #define PUL 9 #define DMXLED 7 #define ADR 415 #define TIME 6000 unsigned int counter = 1; int value = 255; unsigned long tim; bool state; bool cycle; int adress[3]; AccelStepper mystepper(2, PUL, DIR); void setup () { DMXSerial.init(DMXReceiver); pinMode(LED1, OUTPUT); pinMode(LED2, OUTPUT); pinMode(DMXLED, OUTPUT); // pinMode(PUL, OUTPUT); // pinMode(DIR, OUTPUT); digitalWrite(LED1, HIGH); digitalWrite(LED2, HIGH); digitalWrite(DMXLED, HIGH); // digitalWrite(PUL, LOW); // digitalWrite(DIR, LOW); delay(1000); digitalWrite(LED1, LOW); digitalWrite(LED2, LOW); digitalWrite(DMXLED, LOW); } void loop() { mystepper.setMaxSpeed(value); // Установка максимальной скорости (оборотов в минуту). mystepper.setAcceleration(30); // Установка ускорения, в шагах в секунду за секунду. unsigned long lastPacket = DMXSerial.noDataSince(); if(mystepper.isRunning()){ digitalWrite(LED1, HIGH); } else{ digitalWrite(LED1, LOW); } if(lastPacket < 1500) { digitalWrite(DMXLED, HIGH); } else { digitalWrite(DMXLED, LOW); } if (counter%2 ==0){ value = -value; digitalWrite(LED2, HIGH); } else{ digitalWrite(LED2, LOW); } adress[1] = DMXSerial.read(ADR); adress[2] = DMXSerial.read(ADR+1); adress[3] = DMXSerial.read(ADR+2); if(cycle ==0 && adress[3] ==0 || adress[2] >= 1){ mystepper.setSpeed(adress[2]); mystepper.runSpeed(); } if(cycle ==0 && adress[2] ==0 && adress[3] >= 1){ mystepper.setSpeed(-adress[3]); mystepper.runSpeed(); } if (adress[1] >= 128){ cycle = 1; } if(cycle ==1){ mystepper.run(); } if(state ==0 && cycle == 1){ tim = millis(); state = 1; } if(millis() > tim + TIME && state == 1 && cycle ==1 ){ counter ++; mystepper.stop(); state = 0; cycle =0; } }А должен так работать? Я очень давно с этой библиотекой баловался, но что я помню, так у меня не все примеры работали, и не все функции. А задача была такая, что надо было явно говорить драйверу куда run, и на сколько run через moveTo.
Без move to полная тишина на выходах, но в моем случае мотор вращается как обычный коллекторный и режим работы с шагами мне не нужен.
Не вижу проблем. Пока мотор должен вращаться - инкременируете параметр moveTo, чтоб вращался в другую сторону - дикременируете. Ну и следить, чтобы переменная long не переполнялась.
Да я пробовал. На выходе тишина. Может нельзя использовать пины 8 и 9? Пока я остановился на таймере и функции digitalWrite(PUL, !digitalRead(PUL)); с интервалом в 10мкс с последующим увеличением. На светодиодах работает, завтра посмотрю на моторе.
Может вообще функцию tone использовать? У нее есть какие то ограничения по частотам?
Да я пробовал. На выходе тишина.
На данный момент код стер за ненадобностью. Попробую пока идею с таймером