шаговый двигатель - сила тока при простое

Тема в разделе "Схемотехника, компоненты, модули", создана пользователем cybertesla, 3 апр 2013.

  1. cybertesla

    cybertesla Нуб

    вообщем странный эффект наблюдаю - при остановленном шаговике сила тока значительно выше раз эдак в шесть чем при вращении. и разумеется вал не двигается свободно. схема простая - 2 биполярника подключены через 293d вот код. код приложил.
    причём после сброса ардуино или загрузки нового скетча всё ок, тоесть сила тока падает и валы свободно двигаются рукой.
     

    Вложения:

    • stepper-test.txt
      Размер файла:
      413 байт
      Просмотров:
      399
  2. Unixon

    Unixon Оракул Модератор

    Это совершенно нормально, стопорный ток и должен быть больше. Хорошо еще что в 6 раз, а не на прядок.
     
  3. cybertesla

    cybertesla Нуб

    тоесть что во всех устройствах где используются шаговики, на их обмотках тоже постоянно напряжение? просто получается что устройство на шаговике в режиме ожидания потребляет в 6 раз больше чем в рабочем состоянии
     
  4. Unixon

    Unixon Оракул Модератор

    Не, не так. Это если вал силой держать или если он изначально покоился, тогда будет ток больше номинала.
     
  5. cybertesla

    cybertesla Нуб

    ну то что если вал силой держать ток будет выше это понятно. но то что в состоянии покоя на каждый двигатель сила тока составляет 0.36А против 0.08А в состоянии движения это удручает. а особенно то что он при этом греется, а драйвер 293D так вообще пальцем больше 6 секунд не подержишь, ошпаришься.
    ну раз говорите что так должно быть ладно чтож поделать.
     
  6. Unixon

    Unixon Оракул Модератор

    А что это за состояние покоя такое, если драйвер в нем пропускает ток через нагрузку?
     
  7. cybertesla

    cybertesla Нуб

    в моём понимании состояние покоя когда двигатель не вращается и ничего происходить не должно - покрайнемере согласно программе что выше выложил. там простой пример - вращать степпер при нажатии на кнопку. собственно после отпускания кнопки он останавливается и потребление тока в этом состоянини "покоя" в разы возрастает, и греется и драйвер и двигатель. а если нажать ресет на ардуино, то всё становится ок - вал двигателя свободно крутится рукой, и сила тока 0.04А .вот собственно в этом и вопрос, как добится такого эффекта после отпускании кнопки - - чтоб было как при сбросе дуни.
     
  8. Я настоятельно рекомендую вам оптемизировать код, иначе у вас все и будет висеть т.к. вы создали защелку.

    Ваше выражения дабы не создать защелку(Flip-Flop) должно иметь условия сброса, как при инициализации, так и при рабочем цикле. ЗАПОМНИТЕ !! Условие сброса должно быть ВСЕГДА, даже если оно кажется вам самым невероятным и никогда не допустимым/ не достигаемым/ не мыслимым. Именно из за этой небольшой истины ОС MainFrame стоит огромные бабки и имеет надежность работы 98% против стандартных 11% для windows.

    Хотел расписать в своем любимом стиле но понял что меня о5 закидают тухлыми помидорками пишу очень просто

    После того как вы первый раз нажали и отпустили кнопку состояние выхода у вас не меняется т.к. вы его не меняете в программе.

    1 Вариант

    void loop() {
    //.... Остальной код
    if(ValButton1) {
    stepper.step(1);
    stepper2.step(1);
    }
    else {
    stepper.step(0);
    stepper2.step(0);
    }
    //.... Остальной код
    }

    2 Вариант. Если дуня парал. ничего не делает то вообще тупо ждем нажатие

    void loop() {
    //.... Остальной код
    stepper.step(0);
    stepper2.step(0);
    while (ValButton1)
    {
    stepper.step(1);
    stepper2.step(1);
    }}

    3. Вариант( самый лучший и самый надежный) Если дуня что то еще парал. делает. Например выводит данные на экранчик и т.д. и т.п.
    то юзаем прерывание по событию .

    А так вы просто оставляете открытую цепь и гоните постоянно ток.
    Естественно он у вас будет мал во время работы . Т.к. он пропускается короткое время и большая его часть тратится на заряд индуктивности, а когда вы просто открываете на постоянку ключи, то все, индуктивность заряжена, току ничего не мешает, ловите ваши амперки. Так можно сжечь движок. Исправьте программу и все будет нормально.

    На будущее, что бы обезопасить себя во время экспериментов (при признании в себе момента невнимательности ) либо аппаратно поставьте RC цепочку которая будет иметь постоянную времени большую, чем самый большой интервал пропускания тока, и если только RC-цепь у ВАС зарядится то делайте аварийный сброс, ну или если есть место/время в памяти/программе Ардуины, то запускайте в проекте таймер, который так же будет аварийным и сбрасывается при начале каждого пропускания тока, или вызывает аварийное выключение при переполнении/совпадении с расчетным числом большим максимального интервала пропускания тока.

    Мой вам совет сначала тщательно продумайте всю физику процесса!!! А лишь потом переходите к проектированию, прототипированию, интегрированию и ... (куча других крутых непонятных слов:))
     
    cybertesla нравится это.
  9. cybertesla

    cybertesla Нуб

    спасибо за совет, но первые два варианта не годятся, т.к. выражения типо
    stepper.step(0);
    stepper2.step(0);
    ничего не дают, ничего не происходит. так что остаётся только третий вариант, пошёл курить прерывания.
     
  10. ну я честно не работал с данной библиотекой по этому не знаю точность выражений
    stepper.step(1/0);
    stepper2.step(1/0);
    этим я хотел сказать, что когда кнопка имеет состояние Low это должно инициализировать состояние противоположное
    stepper.step(1);
    stepper2.step(1);
    Удачи.
     
  11. Usper

    Usper Нерд

    Как я понял, в состоянии когда не требуется движение от ШД, вы хотите чтобы ток через ШД не тёк? Тогда прерывания тут не помогут. Библиотека stepper написана так, что после окончания вращения вала обмотки ШД остаются под напряжением (режим удержания вала в заданном положении). Снятие напряжения с обмоток в ней не предусмотрено. Более того, она написана таким образом, что используется максимально возможное количество обмоток ШД одновременно. Для униполярного двигателя включаются 2 обмотки одновременно, для биполярного все 4 (так называемая двухфазная коммутация). Это увеличивает момент, развиваемый двигателем, но и способствует более высокому потреблению тока. Полюса вала ШД в таком режиме устанавливаются между полюсами статора. Поэтому после снятия напряжения с обмоток вал, освободившись от притяжения со стороны обмоток статора, повернётся на полшага в ту или иную сторону (если только полезная нагрузка вала сама его не удержит в неустойчивом положении). Тут нужно переписывать библиотеку под себя.
    З.Ы. Выражения вроде stepper.step(0); не могут также. А уж stepper.step(1/0); тем более ;)
     
    cybertesla и Megakoteyka нравится это.
  12. cybertesla

    cybertesla Нуб

    да да именно. об том и речь, что все обмотки становятся под напряжением. и никакие там stepper.step(0) и прочее пляски с бубном никак не помогли. и никаких примеров так и не нашёл. неужели никто не сталкивался с таким. просто хочу юзать два шаговика для платформы на гусеницах. ну вот потому что они у меня есть под рукой и по характеристикам устраивают. но то что после окончания их вращения такая беда - это просто в ступор меня ввело. вообщем я так полагаю никто прямо таки не сталкивался с такой простой проблемой раньше. значит придётся перековыривать stepper.h под себя я полагаю.
     
  13. Usper

    Usper Нерд

    Почему не сталкивался? Я недавно тоже разбирался с шаговиками (правда только с целью исследования режимов работы ШД, у меня ШД просто лежал на столе без нагрузки) и писал собственный скетч. Но он настолько примитивен, что мне стыдно его показывать. Но ничего сложного в доработке библиотеки stepper я не вижу. Достаточно дописать что-нибудь вроде метода
    Код (Text):
    void Stepper::switchOff(void)
    {
      if (this->pin_count == 2)
      {
          digitalWrite(motor_pin_1, LOW);
          digitalWrite(motor_pin_2, LOW);    
      }
      if (this->pin_count == 4)
      {  
          digitalWrite(motor_pin_1, LOW);
          digitalWrite(motor_pin_2, LOW);
          digitalWrite(motor_pin_3, LOW);
          digitalWrite(motor_pin_4, LOW);        
      }
    }
     
    в класс Stepper и вызывать его после завершения вращения. Но, опять же, после обесточивания обмоток ротор ШД останется в неустойчивом положении и довернётся на полшага в ту или иную сторону до устойчивого положения. Это надо учитывать (или не надо, зависит от задачи).
    З.Ы. свой пример я не проверял, но код достаточно тривиален и, надеюсь, без ошибок.
     
  14. cybertesla

    cybertesla Нуб

    вообщем добавлял эту конструкцию и в stepper.h и в stepper.срр всё равно при вызове этой функции в теле программы например - stepper1.switchOff; пишет что не знает такую функцию.

    вообщем поступил проще может кому пригодится.
    просто в самой программе, событие при отпускании кнопки. дёргаем все пины в лоу на которых висят двигатели. в моём случае 8 пинов т.к. два движка
    int motorPins[8] = {8, 9, 10, 11, 2, 3, 5, 6};

    for ( int i=0; i<8; i++ ) {
    digitalWrite(motorPins, LOW);
    }
     
  15. Usper

    Usper Нерд

    Странно, должно работать. В stepper.срр нужно поместить тот код который я привёл выше, а stepper.h в описание класса добавить обявление этого метода.
     
  16. idtmark

    idtmark Нуб

    Кому нетрудно, помогите поправить библиотеку Stepper как описано в 13 посте?
     

    Вложения:

    • Stepper.zip
      Размер файла:
      4,4 КБ
      Просмотров:
      102