Разгон шагового двигателя

Я в данный момент пытаюсь плавно передвигать шаговый двигатель. Проблема с шаговым двигателем заключается в том, что он издает высокий шум во время движения или иногда потрескивает от двигателя.

Поэтому я попробовал увеличить частоту шагового сигнала, что, похоже, немного помогло, но не идеально. Затем я попробовал микрошаг вместо полного шага, что тоже немного помогло, но шум все равно очень отчетливый.

Я использую двигатель PK244-01A И драйвер, к которому он подключен, — этот

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

void stepper_motor::step_pwm()
{

    digitalWrite(en_pin,HIGH);

    delay(0.005);

    digitalWrite(dir_pin,HIGH);
    //LOW - Двигаемся к датчику
    //ВЫСОКИЙ — отойти от датчика

    delay(0.005);
    int increment = 0;
    int step_count = 0;
    while(step_count <= max_step)
    {
      digitalWrite(step_pin,LOW);
      delayMicroseconds(2000);
      digitalWrite(step_pin,HIGH);
      delayMicroseconds(2000-increment);
      step_count++;

      if(step_count >= 1)
      {
        increment++;
        step_count = 0;
      }
    }

}

Что можно сделать, чтобы уменьшить шум двигателя?

, 👍0

Обсуждение

Если вы хотите выяснить, связана ли проблема с вашим изменением скорости или вашей работой, решите, проявляются ли проблемы только во время ускорения или замедления, или они также очевидны, когда двигатель работает на целевой скорости., @Chris Stratton

Ну... Проблема возникает во время нарастания, от начала и выше... как вы можете видеть в моем коде, я не заканчиваю в определенной точке, я просто начинаю с частоты и увеличиваю ее с каждым шагом. оно движется. Постоянно издает звук.. Я не уверен, что мне следует изменить? Оценка? стартовая частота? или что-то совершенно другое?, @Carlton Banks

Ваша рампа не линейна. Период вашего шага определяется переменной increment, однако частота увеличения переменной increment зависит от периода шага. Более короткие шаги приводят к более частым приращениям. Я бы использовал аппаратный таймер ATmega для генерации шагового сигнала, прерывание указанного таймера для увеличения количества шагов на каждом шаге и чтобы логика управления скоростью работала параллельно в качестве основной задачи с фиксированной частотой. Более простым вариантом было бы воспользоваться библиотекой, которая сделает все это за вас, например, AccelStepper., @jms

Когда дело доходит до шума, именно с этим превосходно справляются степперы. Вы не сможете *устранить* его, но можете принять меры по его уменьшению: управлять катушками с синусоидальной формой тока (именно это и делает микрошаг), уменьшать ток двигателя, уменьшать ускорение двигателей и закрепите двигатели вибропоглощающим материалом. «Потрескивание» — это то, что происходит из-за неравномерности времени из-за ошибок в вашем коде., @jms


2 ответа


2

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

Поскольку вы уже используете среду Arduino, я предлагаю вам использовать библиотеку AccelStepper.

Я позволяю вам точно устанавливать параметры ускорения и максимальной скорости и использую правильно рассчитанный рампу.

,

Как узнать правильное ускорение? Указано ли это в техническом описании? Есть ли общее правило или что-то в этом роде?, @Carlton Banks


1

Вам нужно использовать скорректированную задержку как для высокой, так и для низкой части сигнала. Кроме того, что произойдет, если переменная "increment" больше 2000? Ничего хорошего, определенно. Лично я хотел бы иметь возможность задерживать на отрицательное число и отменять некоторые уже сделанные вещи, но я не думаю, что yoz может повернуть время вспять с помощью Arduino.

,

Вы правы насчет 2000 выше. Я не запускаю код так долго, обычно просто проверяю его в течение 3 секунд и выключаю. так что я предполагаю, что я бы достиг отрицательной задержки. Как мне вычислить эти скорректированные задержки?, @Carlton Banks

«Скорректированная задержка» — это как раз то значение, которое вы уже рассчитали: 2000-приращение, @JRE