nema 17

exez
exez аватар
Offline
Зарегистрирован: 04.04.2015

Добрый день

В принципи крутить все получается. Использую а4988. Вопрос возникает в следующем. Как его максимально плавно крутить на ооочень малой скорости. Ну к примеру 1 оборот за 3-5 минут. Важно чтоб скачков резких небыло. Толкните в нужном направлении плиз.

exez
exez аватар
Offline
Зарегистрирован: 04.04.2015
//simple A4988 connection
//jumper reset and sleep together
//connect  VDD to Arduino 3.3v or 5v
//connect  GND to Arduino GND (GND near VDD)
//connect  1A and 1B to stepper coil 1
//connect 2A and 2B to stepper coil 2
//connect VMOT to power source (9v battery + term)
//connect GRD to power source (9v battery - term)


int stp = 8;  //connect pin 13 to step
int dir = 10;  // connect pin 12 to dir
int a = 0;     //  gen counter

byte    spd=25;
byte    spd1=889;

void setup() 
{       
  Serial.begin(9600);         
  pinMode(stp, OUTPUT);
  pinMode(dir, OUTPUT);       
}


void loop() 
{
  a++;
    digitalWrite(dir, HIGH);   
    digitalWrite(stp, HIGH);   
    digitalWrite(stp, LOW);  
    delay(spd); delayMicroseconds(spd1);    
    Serial.println(a);
    if (a>25600) {delay(111111111111);}
   }

В таком варианте вроде едет плавно, но все равно периодически идут рывки. напрямую связаны с тонкими свистящими звуками. MS3 +5, MS2 gnd, MS1 gnd (подтягивание последних двух к земле видимого результата не дало)

 

Скачек наблюдиает каждые примерно 120 шажков.

exez
exez аватар
Offline
Зарегистрирован: 04.04.2015

при подключении только МС3 на + получается 25600 микрошагов на оборот. скачек происходит каждые примерно 128 шагов, т.е. я вплотную приблизился к тому что написано про мотор. 200 шагов 1.8 град. это проблема в моторе?

exez
exez аватар
Offline
Зарегистрирован: 04.04.2015

Покурил пару дней свою темку и выкладываю решение.. Очень надеюсь что кому то оно пригодится!

Решено было отказаться от a4988 и его аналога drv8825. Пытаясь заряжать синусоиду и косинусоиду в L298N столкнулся с проблемой что в пиковых точках 0, 90, 180, 270 градусов движение мотора чуть-чуть замедлялось. Анализируя показания мультиметрта пришел к мысли что подаваемый ШИМ и реально значение на катушках сильно отличаются.. ЭДС? :)

Требовался контроллер тока. Итак: L6506 + L298N

Схема подключения такая:

Отпаяны лапы 1 и 15 у L298N и на них билы подключены 10ая и 15ая нога с 6506. Rsense поставлено 4Ома по 1Вт каждый. Лапа 8 у 298ой была посажена на землю.

На 16ую и 17ую лапу 6506 было подано аналоговое напряжение примерно 2.5В. Реализовано по rc-цепочке. Схема:

Тут было расчитано необходимое сопротивление и емкость кондера из расчета что ШИМ у ардуины 500Гц.:

http://tel-spb.ru/rc.html

В результате получил нереально плавное перемещение мотора на ультанизких сткоростях. 1 оборот за несколько минут. Никаких намеков на шаги и прочее.

Единственный недостаток - высокое пищание. Есть пару мыслей как его побороть, но пока в процессе.

Любые советы по улучшению и оптимизации, а так же критику с удовольствием выслушаю.

Скетч пока такой. Допиливается..

const int motorPin1 = 2;
const int motorPin2 = 3;
const int motorPin3 = 4;
const int motorPin4 = 5;




 int      d1, d2; 
 float    Rad = .01745;
 float    xx = .1;
 int      w = 55;                   // мощность ШИМ от 0 до 255;
 int      motorDelayML = 50;         // millis()
 int      motorDelayMS = 0;       // micro

 
 int x;

 
void setup() {                



    pinMode(motorPin1, OUTPUT);    
    pinMode(motorPin2, OUTPUT);    
    pinMode(motorPin3, OUTPUT);    
    pinMode(motorPin4, OUTPUT);     

  Serial.begin(9600);
}
 
void loop() {

      if ( x >= 0 && x < 90 )
      {
    digitalWrite(  motorPin1, LOW  );
    digitalWrite(  motorPin2, HIGH );
    digitalWrite(  motorPin3, HIGH );
    digitalWrite(  motorPin4, LOW  );
      }
       
      if ( x >= 90 && x < 180 )
      {
    digitalWrite(  motorPin1, HIGH );
    digitalWrite(  motorPin2, LOW  );
    digitalWrite(  motorPin3, HIGH );
    digitalWrite(  motorPin4, LOW  ); 
      }

      if ( x >= 180 && x < 270)
      {
    digitalWrite(  motorPin1, HIGH );
    digitalWrite(  motorPin2, LOW  );
    digitalWrite(  motorPin3, LOW  );
    digitalWrite(  motorPin4, HIGH );   
      }

      if ( x >= 270 && x < 360)
      {
    digitalWrite(  motorPin1, LOW  ); 
    digitalWrite(  motorPin2, HIGH );
    digitalWrite(  motorPin3, LOW  );
    digitalWrite(  motorPin4, HIGH );  
      }

    x = x + 1 ; if (x > 360) { x = 0; }
    d1 = w*cos(x*Rad) + xx;         if (d1 < 0) { d1 = -d1;}
    d2 = w*sin(x*Rad) + xx;         if (d2 < 0) { d2 = -d2;}
 //   if (x > 355  && x < 360 || x > 0  && x < 5 || x > 175 && x < 185) {d1 = d1 + 1;}
 //   if (x > 85  && x < 95 || x > 265 && x < 275) {d2 = d2 + 1;}
    analogWrite(10, d1);
    analogWrite(11, d2);
    
    delay(motorDelayML);
    delayMicroseconds(motorDelayMS);

    Serial.print("   x = ");Serial.print(x);    Serial.print("   d1 = ");Serial.print(d1);    Serial.print("   d2 = ");Serial.println(d2);
 
}

 

exez
exez аватар
Offline
Зарегистрирован: 04.04.2015

Борьба со звуком продолжается. На чоппере когда потенциометром пытаюсь загнать звук в ультразвук получается двигатель начинает шагать.. я так понимаю, что не хватает тока в обмотках на промежуточных (между полными шагамиэтапах..

exez
exez аватар
Offline
Зарегистрирован: 04.04.2015

Прошу помощи. Нужен контроллер у которого ШИМ будет иметь частоту примерно 20KHz. А еще лучше контроллер с аналоговыми выходами (2 выхода) .Подскажите есть ли такие среди ардуинок? :)

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

Лучше уж тогда нормальные контроллеры, типа planetCNC и его семейства MK*, имхо. Ну и драйверы шаговых соответствующие. Но - всё это стоит денег, порой достаточно хороших.