Греются шаговые двигатели 28byj-48

Тема в разделе "Моторы, сервоприводы, робототехника", создана пользователем enclouder, 23 окт 2015.

Метки:
  1. enclouder

    enclouder Нерд

    Здравствуйте.

    Подскажите, что я делаю не так?

    Была плата Adafruit motor shield на базе l293d. Нечаяно её сломал (где то дорожки перемкнул и теперь короткое сидит на плюсе и минусе). Снял оттуда два l293d и решил подключить напрямую. Подключаю вот по такой схеме:

    [​IMG]
    (прошу прощения за безобразную схему, в будущем исправлюсь)

    Только я подключаю два двигателя.

    Оба прекрасно работают с библиотекой <Stepper.h>, но проблема в том, что как только я их хоть чуть-чуть покручу, они даже при простое начинают грется. За минут 5 нагреваются до очень горячих, но в руках терпимо держать. Однако, со временем греются все сильнее и сильнее. Но если они будут подключены и их не использовать, то они вообще и не нагреваются.

    Код (C++):
    #include <Stepper.h>
    #define STEPS 200

    Stepper motor(STEPS, 7, 8, 9, 10);
    void setup()
    {
      motor.setSpeed(80);
    }
    void loop()
    {
      motor.step(512);
      delay(1000);
    }
    К Arduino подключаю напрямую блок питания 12В 850mA.

    За питание к двигателям использую пин "Vin".

    Если подключаю блок питания 6В 2А то двигатели не греются по той же схеме подключения.

    В чем искать причину перегрева? Если до этого через плату Adafruit motor shield использовал тот же блок питания на 12В и они грелись только при длительной постоянной работе, а как только переставали работать то остывали.
     
  2. по всей видимости в том, что на 5 вольтовые двигателя подается 12 вольт.
     
  3. enclouder

    enclouder Нерд

    При работе с шилдом такой проблемы не было и все так же подавалось 12 вольт. Через тот же самый пин плата и питалась. Вероятно, пин "Vin" Отключался во время простоя двигателей, но если это и так, то как это сделать?
     
  4. AlexU

    AlexU Гуру

    Исходя из кода скетча в стартовом топике нагрев мотора происходит во время ожидания (delay(1000)), т.к. во время выполнения этой функции мотор не крутиться, а на одну из обмоток мотора подается постоянный ток, который эту обмотку и нагревает (так Stepper работает).
    Могу предложить следующие варианты:
    1. если нужно удерживать вал мотора, что бы он не поворачивался, -- во время простоя на контакты 'Enable' L293 нужно подать ШИМ сигнал, он будет ограничивать ток через обмотки мотора;
    2. если удерживать вал мотора не нужно -- во время простоя нужно подать '0' на контакты 'Enable' L293, ток не будет подаваться на обмотки.
    PS: схема у Вас не совсем корректная -- в качестве питания "логики" L293 используете 12V, а управление идет с Arduino, которое выдает 5V в качестве управляющих сигналов. В этом вопросе надо как-то определиться: либо "логику" L293 (контакт VSS) привести к 5V, либо сигналы с Arduino преобразовывать к 12V.
     
  5. enclouder

    enclouder Нерд

    подскажите, пожалуйста, а как это сделать? так?
    1) analogWrite(*пин контакта Enable*, 256) (снизить ток)
    2) analogWrite(*пин контакта Enable*, 0) (убрать ток)
     
  6. enclouder

    enclouder Нерд

    Сам решил проблему, наткнулся на коммент где то на сайте:
    Код (C++):
    #include <Stepper.h>
    #define STEPS 200
    Stepper motor(STEPS, 8, 9, 10, 11);
    void setup()
    {
      motor.setSpeed(50);
    }
    void stopen()
    {
      digitalWrite(8, LOW);
      digitalWrite(9, LOW);
      digitalWrite(10, LOW);
      digitalWrite(11, LOW);
    }
    void loop()
    {
      motor.step(512);
      stopen();
      delay(30000);
    }
    Проблема полностью решена.
     
    Последнее редактирование: 27 окт 2015
  7. AlexU

    AlexU Гуру

    Это тоже самое, что '0' подать на 'Enable'. В этом случае вал мотора будет свободно вращаться. В определенных ситуациях по инерции может прокрутиться больше, чем нужно.
     
  8. enclouder

    enclouder Нерд

    Что тогда сделать чтоб исключить момент инерции? Написать функцию постепенного перехода пинов с параметра "high" До параметра "low"?

    Код (C++):
    void stopen1()
    {
      digitalWrite(8, LOW);
      digitalWrite(9, HIGH);
      digitalWrite(10, HIGH);
      digitalWrite(11, HIGH);
    }
    void stopen2()
    {
      digitalWrite(8, LOW);
      digitalWrite(9, LOW);
      digitalWrite(10, HIGH);
      digitalWrite(11, HIGH);
    }
    void stopen3()
    {
      digitalWrite(8, LOW);
      digitalWrite(9, LOW);
      digitalWrite(10, LOW);
      digitalWrite(11, HIGH);
    }
    void stopen4()
    {
      digitalWrite(8, LOW);
      digitalWrite(9, LOW);
      digitalWrite(10, LOW);
      digitalWrite(11, LOW);
    }
    а затем использовать эти функции по очередности прохождения блока Loop?
     
  9. AlexU

    AlexU Гуру

    Предложенное решение некорректное -- моторчик будет делать микро шаги.
    У меня нет полного понимания, что Вы хотите получить на выходе. Может быть в Вашем проекте инерции и не будет (например, если передаточное число большое или из-за других конструктивных решений), тогда решение из Вашего сообщения #6 вполне годится.
    Вам придется решать -- нужно удерживать вал мотора, то применяйте ШИМ, что бы ограничить ток и не греть мотор, -- не нужно удерживать, то проблему перегрева Вы решили.