Подключение драйвера шагового двигателя

Megawollt
Offline
Зарегистрирован: 06.12.2015

Есть драйвер DM432, DM420 и подобные.

На вход принимает импульсы с изменением от 2х мкс. Подскажите, как проще всего программно реализовать функцию регулировки скорости, то есть изменение частоты импульсов hi/low на выходе?

sadman41
Offline
Зарегистрирован: 19.10.2016

М.б. это потянет https://playground.arduino.cc/Code/Timer1 ? Чтобы уже всё было ардуинисто, а не портографически...

Megawollt
Offline
Зарегистрирован: 06.12.2015

А есть ли более простой способ получения сигнала с изменяемой длительностью?

Megawollt
Offline
Зарегистрирован: 06.12.2015

Так и не удалось найти какую либо информацию

Может как то изменить библиотеку stepper или servo?

5N62V
Offline
Зарегистрирован: 25.02.2016

Megawollt пишет:

Так и не удалось найти какую либо информацию

Может как то изменить библиотеку stepper или servo?

А чем Вам accelstepper плоха? Там регулируется и скорость , и ускорение.

Megawollt
Offline
Зарегистрирован: 06.12.2015

Да, как раз читаю про нее. Она работает с драйвером, это хорошо, но я пока не совсем понимаю, как указывать направление вращения?

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

5N62V
Offline
Зарегистрирован: 25.02.2016

управляешь этим:

objectName.moveTo(steps);

Усли steps увеличивается, получаешь вращение в одну сторону, если уменьшается - то в другую, если не изменяется, то стоит на месте.

 

sadman41
Offline
Зарегистрирован: 19.10.2016

А я-то подумал, что товарищ нестандартных решений ищет...

Megawollt
Offline
Зарегистрирован: 06.12.2015

Вот скетч.

При приеме сигнала, значением больше 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;
}
}


 

5N62V
Offline
Зарегистрирован: 25.02.2016

А должен так работать? Я очень давно с этой библиотекой баловался, но что я помню, так у меня не все примеры работали, и не все функции. А задача была такая, что надо было явно говорить драйверу куда run, и на сколько run  через moveTo. 

Megawollt
Offline
Зарегистрирован: 06.12.2015

Без move to полная тишина на выходах, но в моем случае мотор вращается как обычный коллекторный и режим работы с шагами мне не нужен. 

5N62V
Offline
Зарегистрирован: 25.02.2016

Не вижу проблем. Пока мотор должен вращаться - инкременируете параметр moveTo, чтоб вращался в другую сторону - дикременируете. Ну и следить, чтобы переменная long не переполнялась.

Megawollt
Offline
Зарегистрирован: 06.12.2015

Да я пробовал. На выходе тишина. Может нельзя использовать пины 8 и 9? Пока я остановился на таймере и функции digitalWrite(PUL, !digitalRead(PUL)); с интервалом в 10мкс с последующим увеличением. На светодиодах работает, завтра посмотрю на моторе.

Может вообще функцию tone использовать? У нее есть какие то ограничения по частотам?

5N62V
Offline
Зарегистрирован: 25.02.2016

Megawollt пишет:

Да я пробовал. На выходе тишина. 

Ну это вы явно что-то не так делаете. Давайте код с moveTo

Megawollt
Offline
Зарегистрирован: 06.12.2015

На данный момент код стер за ненадобностью. Попробую пока идею с таймером