Переделанный 28BYJ-48 и драйвер TB6612FNG

Barny
Offline
Зарегистрирован: 23.01.2015

Приветствую!

Фабула:

Унополярный двигатель 28BYJ-48 переделан в биполярный (перерезана дорожка к красному проводу)

http://digitrode.ru/images/2014/08/21/3.jpg

Соответственно, обмотки стали:

1я: Оранжевый, розовый.

2я: Красный, синий.

Теоретически пока все верно. Вместе с двигателями купил новомодный драйвер TB6612FNG от Toshiba, но вот беда - не могу найти библиотеку под этот драйвер для биполярного двигателя. Даже родная библиотека содержит пример только для коллекторных двигателей. Другие библиотеки не используют пины PWM, STBY и AIN1/2, соответственно, нельзя включить мотор или изменить его скорость...

Может кто встречал пример работы этого драйвера и биполярного двигателя ?

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

А в чем была изначальная задача?

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

trembo
trembo аватар
Offline
Зарегистрирован: 08.04.2011

Берите любой step-dir.
Они обычно как раз биполярниками управляют.
https://www.ebay.com/p/4pcs-A4988-StepStick-Stepper-Driver-for-Controler...

Barny
Offline
Зарегистрирован: 23.01.2015

А с каких пор TB6612 перестал быть step/dir драйвером ?

svm
Offline
Зарегистрирован: 06.11.2016

Barny пишет:

А с каких пор TB6612 перестал быть step/dir драйвером ?

Он им никогда и не был, это улучшенная L298. Если совокупить его с L297, то можно получить желаемое, но лучше не надо. Конечно если хочется, то можно все программно сделать, но смысла в этом нет, будет примерно то-же что и на ULN, только чуть помощнее и с защитами.

Barny
Offline
Зарегистрирован: 23.01.2015

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

svm
Offline
Зарегистрирован: 06.11.2016

С виду похож,  наверное автор топика поэтому и купился.

Barny
Offline
Зарегистрирован: 23.01.2015

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

ЗЫ пришел ответ от разработчика:

If you’re referring to this type of motor, the TB6612FNG can theoretically drive a stepper motor but it’s not intended for that nor do we have information on how to do that.

We do have a couple motor drivers specifically for driving a Bipolar Stepper Motor. The Easy Driver 

М-дя... Значит врукопашную присать код по любому.

svm
Offline
Зарегистрирован: 06.11.2016

Barny пишет:

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

М-дя... Значит врукопашную присать код по любому.

PWM в данном случае можно регулировать ток в обмотках ШД, а все остальное программно. Если движок один, это еще не очень страшно, он отъест всего 4 выхода ардуины (если не использовать PWM и  Enable). Ищите конструкции с ULN2003 или L298 (она ближе всего к даной МС). Можно еще добавить L297, но это усложнит конструкцию, да и навесухи много. Смотрите Что-то типа  этого: http://mypractic.ru/urok-33-bipolyarnyj-shagovyj-dvigatel-v-sisteme-arduino.html

Barny
Offline
Зарегистрирован: 23.01.2015

Вощем получился рабочий скеч, крутит в обе стороны вал двигателя с постоянной скоростью. Немного модфицировал уже существующий где-то на форуме код. Даже не знаю, есть ли смысл его выкладывать. Драйвер очень хорош для двух коллекторных двигателей, для шагового в принципе подходит, но лучше сразу брать адекватный драйвер без лишних пинов.

#define PWMA 6
#define PWMB 7
#define AIN1 8
#define AIN2 9
#define BIN1  10
#define BIN2  11
#define STBY 12

#define dstep 1150 // время между тактами

bool dir;

void ustep(uint8_t s);
void steps(uint16_t s);

void setup() {
  pinMode(AIN1, OUTPUT);
  pinMode(AIN2, OUTPUT);
  pinMode(BIN1, OUTPUT);
  pinMode(BIN2, OUTPUT);
  pinMode(PWMA, OUTPUT);
  pinMode(PWMB, OUTPUT);
  pinMode(STBY, OUTPUT);
   
 digitalWrite(PWMA, HIGH); // подать на обе катушки доступный ток
 digitalWrite(PWMB, HIGH);
   
  Serial.begin(9600);
   Serial.println("f - Направление по часовой");
  Serial.println("b - Направление против часовой");
    Serial.println("g - Один оборот вала редуктора");
  Serial.println("m - Один оборот двигателя");
}

void loop() {

  if (Serial.available() > 0) {
char    incoming_char = Serial.read();
    switch (incoming_char) {
      case 'm':
        steps(64);
        break;
      case 'g':
        steps(4076);
        break;
      case 'f':
        dir = true;
        break;
      case 'b':
        dir = false;
        break;
     
    } 
  } 
}

void ustep(uint8_t s) {
    switch (s) {
      case 0:
        digitalWrite(AIN1, HIGH);
        digitalWrite(AIN2, LOW);
        digitalWrite(BIN1, LOW);
        digitalWrite(BIN2, LOW);
        break;
      case 1:
        digitalWrite(AIN1, HIGH);
        digitalWrite(AIN2, LOW);
        digitalWrite(BIN1, HIGH);
        digitalWrite(BIN2, LOW);
        break;
      case 2:
        digitalWrite(AIN1, LOW);
        digitalWrite(AIN2, LOW);
        digitalWrite(BIN1, HIGH);
        digitalWrite(BIN2, LOW);
        break;
      case 3:
        digitalWrite(AIN1, LOW);
        digitalWrite(AIN2, HIGH);
        digitalWrite(BIN1, HIGH);
        digitalWrite(BIN2, LOW);
        break;
      case 4:
        digitalWrite(AIN1, LOW);
        digitalWrite(AIN2, HIGH);
        digitalWrite(BIN1, LOW);
        digitalWrite(BIN2, LOW);
        break;
      case 5:
        digitalWrite(AIN1, LOW);
        digitalWrite(AIN2, HIGH);
        digitalWrite(BIN1, LOW);
        digitalWrite(BIN2, HIGH);
        break;
      case 6:
        digitalWrite(AIN1, LOW);
        digitalWrite(AIN2, LOW);
        digitalWrite(BIN1, LOW);
        digitalWrite(BIN2, HIGH);
        break;
      case 7:
        digitalWrite(AIN1, HIGH);
        digitalWrite(AIN2, LOW);
        digitalWrite(BIN1, LOW);
        digitalWrite(BIN2, HIGH);
        break;
    }  
        delayMicroseconds(dstep);
        digitalWrite(AIN1, LOW);
        digitalWrite(AIN2, LOW);
        digitalWrite(BIN1, LOW);
        digitalWrite(BIN2, LOW);
} 

void steps(uint16_t s)
{
    digitalWrite(STBY, HIGH);// разрешить работу двигателя
  static uint8_t ss;
  for (uint16_t i=0; i<s;i++)
  {
    if (dir) {ss++; if(ss>7) ss=0;} else {if(ss<1) ss=8; ss--;};
    ustep(ss);
  }
  digitalWrite(STBY, LOW); // запретить работу с двигателем
}

 

 

svm
Offline
Зарегистрирован: 06.11.2016

Если остальных ног хватает для выполнения задачи, то и мудрить больше не стоит.

Barny
Offline
Зарегистрирован: 23.01.2015

Думаю, надо убрать пины скорости на плюс. Может еще есть смысл посидеть с осцилографом, глянуть, возможно стоит поиграть с длинной импульса.