Прямое управление драйвером ШД (без stepper)

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

  1. Glitch

    Glitch Нуб

    Двигатель: m49sp-2k
    Драйвер: pld545-g3
    Контроллер: Uno

    Добрый день!
    Написал код, но в чём ошибка понять не могу.
    Что получается:
    Двигатель бесконечно выполняет только первую часть кода (до else).

    Код (C++):

    int dirpin = 11;
    int steppin = 9;
    int enbl = 10;

    void setup()
    {
      pinMode(dirpin, OUTPUT);
      pinMode(steppin, OUTPUT);
      pinMode(enbl, OUTPUT);
    }
    void loop()
        {
         int d = 0; // количество шагов
         int i; // переменная вращения в 1 сторону
         int t; // переменная вращения во вторую сторону
         if(d < 5)
          {
            digitalWrite(dirpin, HIGH); // указываем 1 направление
            for (i = 0; i<150; i++) // функция полного шага
            {
              digitalWrite(steppin, LOW); // микрошаги
              digitalWrite(steppin, HIGH); //
              delay(3); //
            }
              delay(2000); // задержка между шагами
              d++; // приращение к d
          }
         else // когда d = 5 выполняется эта функция
          {
            digitalWrite(dirpin, LOW); // обратное направление вращения
            for (t = 0; t<750; t++) // длительность полного шага
            {
             digitalWrite(steppin, LOW); // микрошаги
             digitalWrite(steppin, HIGH);
             delay(3);
            }
             delay(10000); // задержкапосле которой код начнётся сначала
          }
     
     
  2. AlexU

    AlexU Гуру

    Не видно активации через вход ENABLE:
    Код (C++):
    digitalWrite(enbl, HIGH);
    Переключение между уровнями на входе STEP желательно сделать с задержками (какими -- читайте документацию):
    Код (C++):
    digitalWrite(steppin, LOW); // микрошаги
    delay(3); //
    digitalWrite(steppin, HIGH); //
    delay(3); //
     
    Glitch нравится это.
  3. Glitch

    Glitch Нуб

    Когда enbl на HIGH, то драйвер питание на двигатель не подаёт. Поэтому я на него и не подаю ничего вообще.
     
  4. AlexU

    AlexU Гуру

    Это может быть причиной того, что двигатель не работает. Попробуйте подключить к "земле" -- подать 'LOW' на 'enbl'.
     
    Glitch нравится это.
  5. Glitch

    Glitch Нуб

    хорошо, попробую
     
  6. Glitch

    Glitch Нуб

    Подключил. Никакого эффекта это не дало - что в программе прописывал LOW, что к земле подключал - один результат.
    Думаю, что проблема в другом. Переменная "d" не изменяется, хотя в программе это указано.
    Подскажите, пожалуйста что я делаю не так?


    Код (C++):
    void loop()
       {
         int t;
         int d = 0;
         int i;
         digitalWrite(enbl, LOW);
         digitalWrite(unlock, HIGH);
        if(d<5)
          {
            digitalWrite(dirpin, HIGH);
            {
            for (i = 0; i<150; i++)
            {
              digitalWrite(steppin, LOW);
              digitalWrite(steppin, HIGH);
              delay(2);
            }
          d = d + 1;
            }
          delay(2000);
          }
        else
          {
          digitalWrite(dirpin, LOW);
          digitalWrite(enbl, LOW);
          for (t = 0; t<750; t++)
            {
           digitalWrite(steppin, LOW);
           digitalWrite(steppin, HIGH);
           delay(2);
            }
             delay(1000);
          }
      }
     
  7. Mestniy

    Mestniy Гуру

    А можно вашу схему подключения?
     
  8. Glitch

    Glitch Нуб

    Прошу простить за небрежность, надеюсь, понятно будет всё.
     

    Вложения:

    • Bezymyanny.png
      Bezymyanny.png
      Размер файла:
      29,8 КБ
      Просмотров:
      571
  9. Mestniy

    Mestniy Гуру

    А поровнее никак? Мозг отказывается это обрабатывать!
    Вы лучше скачайте Fritzing и зарисуйте нормально!
     
    Glitch нравится это.
  10. AlexU

    AlexU Гуру

    Переменная 'd' каждый раз обнуляется:
    Код (C++):
    int d = 0;
    поэтому всегда срабатывает условие:
    Код (C++):
    if(d<5)
    Инициализацию переменной 'd' надо вынести за пределы функции 'loop()'.
     
    Glitch нравится это.
  11. Glitch

    Glitch Нуб

    Если объявляю её в Setup, то выходит ошибка "not declared"
     
  12. AlexU

    AlexU Гуру

    Правильно, в этом случае область видимости ограничивается функцией 'setup()'. Объявите эту переменную вне функций.
     
    Glitch нравится это.
  13. Glitch

    Glitch Нуб

    Огромное спасибо!
    Что бы он возвращал переменной 0, написал последней строкой "d = 0".