В чем отличие одного кода от другого?

Тема в разделе "Arduino & Shields", создана пользователем enclouder, 1 фев 2016.

  1. enclouder

    enclouder Нерд

    Подскажите пожалуйста, как быть.
    Есть 2 кода, оба на обработку движения ШД 28byj-48.
    Не могу найти разницу почему в одном коде крутящий момент высокий, в другом низкий, хотя принцип работы одинаковый.
    1ый код, который с высоким крутящим моментом:
    Код (C++):
    #include <Stepper.h>
    #define STEPS 2048

      Stepper motor1(STEPS, 2, 3, 4, 5);
      Stepper motor2(STEPS, 14, 15, 16, 17);
     
    void stop_motor1()
    {
      digitalWrite(2, LOW);
      digitalWrite(3, LOW);
      digitalWrite(4, LOW);
      digitalWrite(5, LOW);
    }

    void stop_motor2()
    {
      digitalWrite(14, LOW);
      digitalWrite(15, LOW);
      digitalWrite(16, LOW);
      digitalWrite(17, LOW);
    }

    void setup()
    {
      motor1.setSpeed(10);
      motor2.setSpeed(10);
    }

    void loop()
    {
      int i = 0;
      while (i != 500)
      {
        motor1.step(10);
        motor2.step(10);
        delay(40);
        i+=10;
      }
      stop_motor1();
      stop_motor2();
     
      while (i != 0)
      {
        motor1.step(-10);
        motor2.step(-10);
        delay(40);
        i-=10;
      }
      stop_motor1();
      stop_motor2();
    }
    второй код, у которого вал двигателя проскакивает при небольшом усилии:
    Код (C++):
    #include <Stepper.h>
    #include <VirtualWire.h>

    #define STEPS 2048

      Stepper motor1(STEPS, 2, 3, 4, 5);
      Stepper motor2(STEPS, 14, 15, 16, 17);
     
      int step1=0,step2=0;
      int open1=0, open2=0, close1=0, close2=0;

    void stop_m1()
    {
      digitalWrite(2, LOW);
      digitalWrite(3, LOW);
      digitalWrite(4, LOW);
      digitalWrite(5, LOW);
    }

    void stop_m2()
    {
      digitalWrite(14, LOW);
      digitalWrite(15, LOW);
      digitalWrite(16, LOW);
      digitalWrite(17, LOW);
    }

    void setup()
    {
      motor1.setSpeed(10);
      motor2.setSpeed(10);
      Serial.begin(9600);
      vw_set_ptt_inverted(true); // Required for DR3100
      vw_set_rx_pin(19);
      vw_setup(4000);  // Bits per sec
      vw_rx_start();
    }

    void loop()
    {
      uint8_t buf[VW_MAX_MESSAGE_LEN];
      uint8_t buflen = VW_MAX_MESSAGE_LEN;
     
      vw_get_message(buf, &buflen);
     
      if(buf[0] == 49)
      {
        if(step1 < 500)
        {
          while(buf[0] == 49)
          {
            step1+=10;
            motor1.step(10);
            buf[0] = 0;
            vw_get_message(buf, &buflen);
          }
        }
      }
     
      if(buf[0] == 55)
      {
        if(step2 < 500)
        {
          while(buf[0] == 55)
          {
            step2+=10;
            motor2.step(10);
            buf[0] = 0;
            vw_get_message(buf, &buflen);
          }
        }
      }

      stop_m1();
      stop_m2();
     
      //если сработала на закрытие
      if(buf[0] == 51)
      {
        if(step1 > 0)
        {
          while(buf[0] == 51)
          {
            step1-=10;
            motor1.step(-10);      
            buf[0] = 0;
            vw_get_message(buf, &buflen);
          }
        }
      }
     
      if(buf[0] == 57)
      {
        if(step2 > 0)
        {
          while(buf[0] == 57)
          {
            step2-=10;
            motor2.step(-10);
            buf[0] = 0;
            vw_get_message(buf, &buflen);
          }
        }
      }
      buf[0] = 0;
      stop_m1();
      stop_m2();
    }
    По сути, разница только что в том, что сигнал ШД дается от радиоприемника. Все остальное так же - количество шагов, размер шага, скорость.
    Но вот только при работе с радиоприемником вал проворачивается при упоре, а вот если без радиоприемника - то работает прекрасно.

    Однако, если убрать функцию stop_m1 и stop_m2 то двигатели в состоянии покоя будут нереально сильно греться. Но, если оставить эту функцию, то именно с радиоприемник пропадает крутящий момент, но зато двигатели не греются) В чем различие в коде? Почему в первом примере у двигателей и момент крутящий высокий и не греются, а во втором примере крутящий момент слабый при работе той же функции.
     
  2. НКВД

    НКВД Нерд

    Возможно с приемником питания не хватает ! они питаются от 3 до 12 вольт причем чем больше даешь - тем дальше бьет - мультиметр в руки и померить сколько приходит к шаговаму в первом и втором случае - в любом случае - если все ок , тогда копайте программно ! отпишитесь , если попал!) интересно , программно судя по тому что без функции stop_m у вас хватает более того еще и греется- просто убавить время stop_m при условии что , когда вы пробовали радио не отключали !)
     
    Последнее редактирование: 1 фев 2016
  3. AlexU

    AlexU Гуру

    В первом коде:
    обеспечивает высокий крутящий момент.
     
  4. enclouder

    enclouder Нерд

    с питанием все в порядке - 5В
    копать программно куда?) я и спросил с этой целью, чтоб узнать что да как))
    для функции stop_m не установлено время, она просто отключает питание в обмотках, чтоб не перегревался ШД.
     
  5. enclouder

    enclouder Нерд

    нет, неверно) убрал задержку - все равно то же самое.
     
  6. Максим B

    Максим B Гуру

    Я бы еще во 2-м коде убрал вывод в serial Serial.begin(9600);
     
  7. lerik2703

    lerik2703 Гик

    вы не поняли ответа,вам правильно подсказал AlexU , delay(); обеспечивает задержку в программе дав тем самым повернуться ШД, все же контроллер работает немного быстрей чем делает шаг двигатель :)
     
  8. AlexU

    AlexU Гуру

    Да, ошибся.
    Это так, если задержка обеспечивается при каждом шаге. А в данном случае после нескольких шагов -- поэтому задержка не при чём.

    Второе предположение:
    библиотека VirtualWire, что-то шаманит с таймерами (что именно -- смотрите сами). Это шаманство может привести к тому, что на некоторых выводах, к которым подключен двигатель, будет формироваться сигнал ШИМ (на тех выводах, что ШИМ поддерживают). Что может стать причиной уменьшения крутящего момента при использовании этой библиотеки (второй вариант программы).
    Второй двигатель подключен к выводам 14, 15, 16, 17 -- у него так же крутящий момент снижается?
     
  9. lerik2703

    lerik2703 Гик

    с первым таймером а это шим 9-10 ( если это ATMega328)
    не может быть причиной?
     
  10. enclouder

    enclouder Нерд

    да, крутящий момент так же снижается
     
  11. enclouder

    enclouder Нерд

    у меня 9-10 выходы не используются.
    и да, время не причем. все напрямую зависит от функции stop_m
     
  12. enclouder

    enclouder Нерд

    Господа, проблема в том, что во время вращения двигателя
    Код (C++):
    vw_get_message(buf, &buflen);
      if(buf[0] == 49)
      {
        if(step1 < 500)
        {
          while(buf[0] == 49)
          {
            step1+=10;
            motor1.step(10);
            buf[0] = 0;
            vw_get_message(buf, &buflen);
          }
        }
      }
    код выходит за пределы блока и сразу же нарывается на функцию stop_m. Таким образом, он делает пару оборотов, отключает питание на катушках (stop_m) и затем пытается заново провернуться. На повернуться ему хватает, а вот крутящего момента уже недостаточно.
    Для правильной работы необходимо сделать так, чтоб он обращался к функции stop_m Только во время простоя. Тоесть не получает сигнал на вращение 1-2сек. - выполнение функции stop_m. Такие дела. Напишу код, отпишусь после тестов.