ARDUINO Шаговый двигатель, со своим драйвером.

Sascha.

✩✩✩✩✩✩✩
15 Авг 2020
39
2
Доброго дня. Есть комплект от струйного принтера, ШД ЕМ-257, драйвер этого двигателя LB1845, блок питания с выходом 42в. и 5в.
Благодаря даташиту на этот драйвер удалось запустить всё это от ардуино УНО, но не могу понять как сделать реверс, может кто знает.Спасибо
 

Вложения

Эдуард Анисимов

★★★★★★✩
23 Сен 2019
2,265
944
58
Марий-Эл
Тот сигнал, что подавали на обмотку А, подать на обмотку В.
А с обмотки В на обмотку А.
Естественно не перепайкой проводов, а сменой управляющих сигналов.
 
  • Лойс +1
Реакции: Sascha.

Sascha.

✩✩✩✩✩✩✩
15 Авг 2020
39
2
Тот сигнал, что подавали на обмотку А, подать на обмотку В.
Спасибо. Получилось. Ещё вопрос, как работать с этими входами I01, I11, I02, I12?
По описанию это входа для установки выходного тока, 1/3, 2/3 и полного. Это для управления шагом или можно как то и тормозить двигатель?
 

Эдуард Анисимов

★★★★★★✩
23 Сен 2019
2,265
944
58
Марий-Эл
Я конкретно не разбирался, так по быстрому глянул.
Люди говорят что с помощью их задаётся ток обмоток при дробном шаге. Но шаг драйвера не совпадает с дробностью шага и они используют их для более плавного вращения. Но как, не вдавался в подробности.
 
  • Лойс +1
Реакции: Sascha.

Шал

✩✩✩✩✩✩✩
26 Мар 2020
23
5
@Sascha.

Выкладывай скетч и схему подключения, оч интересно посмотреть.
 

Sascha.

✩✩✩✩✩✩✩
15 Авг 2020
39
2
Выкладывай скетч и схему
Схему не рисовал, думаю со скетча будет ясно, все по даташиту, крутим в одну сторону с шагом 2/3, в другую полный шаг, драйвер выпилил с платы, на фото все видно.
C++:
volatile int phase1 = 13;
volatile int phase2 = 12;
int I01 = 11;
int I11 = 10;
int I02 = 9;
int I12 = 8;

int period = 1000;

int a = 0;

void setup()
{
  pinMode(phase1, OUTPUT);
  pinMode(phase2, OUTPUT);
  pinMode(I01, OUTPUT);
  pinMode(I11, OUTPUT);
  pinMode(I02, OUTPUT);
  pinMode(I12, OUTPUT);
}

void loop()
{
  if (a < period)
  {
    a++;
    stp ();
    {
      //0 1
      digitalWrite(phase1, LOW);
      digitalWrite(phase2, LOW);
      delay(1.5);
      digitalWrite ( I11, LOW);
      digitalWrite (I12, HIGH);
      digitalWrite (I01, LOW);
      digitalWrite (I02, HIGH);
      //2 0
      digitalWrite(phase1, LOW);
      digitalWrite(phase2, LOW );
      delay(1.5);
      digitalWrite ( I11, HIGH);
      digitalWrite (I12, LOW);
      digitalWrite (I01, HIGH );
      digitalWrite (I02, LOW );
      //4 1
      digitalWrite(phase1, HIGH );
      digitalWrite(phase2, LOW );
      delay(1.5);
      digitalWrite ( I11, LOW);
      digitalWrite (I12, HIGH);
      digitalWrite (I01, LOW);
      digitalWrite (I02, HIGH);
      //6 0
      digitalWrite(phase1, LOW);
      digitalWrite(phase2, HIGH );
      delay(1.5);
      digitalWrite ( I11, HIGH);
      digitalWrite (I12, LOW);
      digitalWrite (I01, HIGH );
      digitalWrite (I02, LOW );
    }
  }

  else {

    dir (); {
      a ++;
      //1 2/3
      digitalWrite(phase1, LOW);
      digitalWrite(phase2, LOW );
      delay(1.5);
      digitalWrite (I12, LOW);
      digitalWrite ( I11, LOW);
      digitalWrite (I01, HIGH);
      digitalWrite (I02, HIGH );
      //3 2/3
      digitalWrite(phase1, HIGH );
      digitalWrite(phase2, LOW );
      delay(1.5);
      digitalWrite ( I11, LOW);
      digitalWrite (I12, LOW);
      digitalWrite (I01, HIGH);
      digitalWrite (I02, HIGH);
      //5 2/3
      digitalWrite(phase1, HIGH );
      digitalWrite(phase2, HIGH );
      delay(1.5);
      digitalWrite ( I11, LOW);
      digitalWrite (I12, LOW);
      digitalWrite (I01, HIGH);
      digitalWrite (I02, HIGH);
      //7 2/3
      digitalWrite(phase1, LOW);
      digitalWrite(phase2, HIGH);
      delay(1.5);
      digitalWrite ( I11, LOW);
      digitalWrite (I12, LOW);
      digitalWrite (I01, HIGH);
      digitalWrite (I02, HIGH);


      if ( a > period * 2)
      {
        a = 0;
        stp ();
      }
    }
  }
}
void stp ()
{ phase1 = 13;
  phase2 = 12;
}
void dir ()
{ phase1 = 12;
  phase2 = 13;
}
 

Вложения

  • Лойс +1
Реакции: Шал

Sascha.

✩✩✩✩✩✩✩
15 Авг 2020
39
2
Доброго дня. Может кто подскажет как правильно понять таблицу с даташит. Полный шаг, 1/3, 2/3 отдельно работает, а как 1/4 шага получить.
 

Вложения

Sascha.

✩✩✩✩✩✩✩
15 Авг 2020
39
2
Доброго дня. Попытаюсь поясница, может кто и отзовётся, в даташите приведены две таблицы, так вот если их как они переведены переписать в код, двигатель не будет крутится. Но если выбрать значение, например для 2/3 шага он отлично крутится с этим шагом. Вопрос, эти таблицы так и пишутся, а каждый сам выбирает какой нужен шаг? Если так тогда действительно 1/4 там нет. Кто понимает даташит отзовитесь!
 

VICLER

★★★★★★✩
9 Дек 2019
801
656
Hamburg
Если все действия с таблицы переписанны верно, а двигатель не крутится, то возможно, что двигатель подключен не правильно. Попробуйте менять порядок подключения пока не заработает.
Шага 2/3 не бывает, это ток. Шаг всегда делится на 2, то есть 1/2, 1/4, 1/8 и т.д. В первой таблицае указанны последовательности для 1/2 шага, во второй для 1/4
и зачем задержка, к тому же такая большая после изменения phase1,2?
 
  • Лойс +1
Реакции: Sascha.

Sascha.

✩✩✩✩✩✩✩
15 Авг 2020
39
2
Шага 2/3 не бывает, это ток.
Вы правы, заигрался. Без задержки не работает, время задержки брал с таблицы, правда там указано время задержки переключения между фазой и контролем включения, выключения. Пробовал всякие варианты, тем более двигатель подключён как и был в принтере. По таблице всё перепроверил не раз, он то крутится, но как то хаотично и за секунды разогревается драйвер.
 

VICLER

★★★★★★✩
9 Дек 2019
801
656
Hamburg
время задержки брал с таблицы
там время в микросекундах, у вас в милли, то есть в 1000 раз больше, чем нужно. Используйте тогда delayMicroseconds(2).
вообще странно у Вас как-то всё работает. Получается просто все чётные строки из первой таблицы переписали и получился полушаг, а все нечётные полный шаг? Что-то тут не так.. Вы уверенны в том, что это именно полный и 1/2 шаг, а не что-то другое?

А enable1, 2 подключены? Они оба должны быть LOW.
 
Изменено:
  • Лойс +1
Реакции: Sascha.

Sascha.

✩✩✩✩✩✩✩
15 Авг 2020
39
2
Доброго дня. Еnable1, 2 LOW так и есть , по поводу миллисекунд и микросекунд не знаю почему ,но на микросекундах не работает. Сколько шагов затрудняюсь сказать, с данным драйвером не так все просто. Все ,что до этого писал ошибка, потому как спутал шаги с током. Но как бы и понять сложно ( для меня ) , ведь название таблицы говорит 1/2 фазного возбуждения 1/2 шага.
 

VICLER

★★★★★★✩
9 Дек 2019
801
656
Hamburg
не работает скорее всего из-за слишком высокой скорости.

Это последовательность для полного шага. х - задержка после каждого шага, задающая скорость вращения. Работает?
C++:
// 0011
digitalWrite(phase1, LOW);
delay(x);
digitalWrite(phase2, LOW );
delay(x);    
// 1001
digitalWrite(phase1, HIGH );
delay(x);
digitalWrite(phase2, LOW );
delay(x);
// 1100
digitalWrite(phase1, HIGH );
delay(x);
digitalWrite(phase2, HIGH );
delay(x);
// 0110
digitalWrite(phase1, LOW);
delay(x);
digitalWrite(phase2, HIGH);
delay(x);
 
  • Лойс +1
Реакции: Sascha.

Sascha.

✩✩✩✩✩✩✩
15 Авг 2020
39
2
Да работает, но не хорошо. Сейчас попытался вмешаться в стандартную библиотеку Stepper, драйвер перевёл на двух проводную схему, по примеру oneStepAtA , что то стало похоже на истину. Подставляю 200 шагов на оборот для двигателя и 200 шагов в step получаю оборот. В библиотеку прописал последовательность с даташит на 2/3 выходного тока и перемкнул I11,I12 на GND, а I01, I02 на +5, фаза 1,2 на управление с ардуино. Теперь можно пользоваться стандартной библиотекой.

Подскажите как прописать стоп двигателю, после вращения вперед, назад. Именно сам стоп.Спасибо.
 

Эдуард Анисимов

★★★★★★✩
23 Сен 2019
2,265
944
58
Марий-Эл
@Sascha., Мда. Перестарался. Код действительно некрасивый. Скорее всего работать не будет.:(
Многие драйверы при прекращении подачи управляющих импульсов останавливают двигатель. Не снимая напряжения с обмоток, тем самым фиксируя его в одном положении.
При снятии сигнала Enable разблокируют его. Может здесь так же? Нужно попробовать прекратить подачу фазных импульсов. Не снимая сигнал Enable.
 

Sascha.

✩✩✩✩✩✩✩
15 Авг 2020
39
2
Когда в функции step указано 200, получаем красивый оборот, когда 0 стоит как укопаный, через оператор if и - 200 получил реверс, думал как-то так же, через if прописать 0, но не хватает '' клепки'' в мозгах.
 

Sascha.

✩✩✩✩✩✩✩
15 Авг 2020
39
2
Доброго всем дня. Вот ещё на этом дтайвере можно регулировать обороты.
C++:
void setup() {
  //  контакты к которым подключается шаговый двигатель
  pinMode(13, OUTPUT); pinMode(12, OUTPUT);
  Serial.begin(9600);
}
void loop() {
  int sensorReading = analogRead(A3);//pin 3
  int t1 = map(sensorReading, 0, 810, 300, 3240);
  if (sensorReading > 810)
  {
    digitalWrite(13, LOW);
    digitalWrite(12, LOW);
  }
  if (sensorReading < 809)
  {
    digitalWrite(13, LOW); digitalWrite(12, LOW); delayMicroseconds(t1);
    digitalWrite(13, HIGH); digitalWrite(12, LOW); delayMicroseconds(t1);
    digitalWrite(13, HIGH); digitalWrite(12, HIGH); delayMicroseconds(t1);
    digitalWrite(13, LOW); digitalWrite(12, HIGH); delayMicroseconds(t1);
  }
}
 

Sascha.

✩✩✩✩✩✩✩
15 Авг 2020
39
2
Кто подскажет , как работать с функцией map. То что она преобразует верхний и нижний предел переменной входной в верхний и нижний выходной описано, но как это рассчитывается. Честно говоря данные цифры прописал методом подбора.