2 шаговых драйвера с регулировкой скорости

Я использую два tb6600 для управления двумя шаговыми двигателями. Это для написания писем с ЧПУ. Перемещение одной оси работает нормально.

Я хочу толкнуть 2 степпера одновременно по диагонали.

Я попытался рассчитать соотношение x:y, поэтому, если x делает больше шагов, чем y, за 1 y, сделайте nx шагов. Это сработало, но машина тряслась, как бы я ни регулировал задержки между высоким и низким шагом. Когда я использую ШИМ, тряски нет, но я не могу понять, как заставить ее следовать по диагонали.

Вторая попытка заключалась в использовании ШИМ с аналоговой записью.

if(delayX > delayY){
      analogWrite(stepPinX, 128);
      analogWrite(stepPinY, 128);

      delay(delayY);
      analogWrite(stepPinY, 0);
      delay(delayX - delayY);
      analogWrite(stepPinX, 0);
      
    }else if(delayX <= delayY){
      analogWrite(stepPinX, 128);
      analogWrite(stepPinY, 128);

      delay(delayX);
      analogWrite(stepPinX, 0);
      delay(delayY - delayX);
      analogWrite(stepPinY, 0);
    }

Очевидно, что это не работаетбудет синим. Он достигает конечной точки, но не следует по диагонали. Если я установлю рабочий цикл на 2 или 128, это не имеет значения. Разве рабочий цикл не должен изменять скорость шагового двигателя?

Что я здесь упускаю и как это можно сделать?

, 👍1

Обсуждение

Нет, PWM не изменит скорость - вы пульсируете на входе STEP ваших шаговых драйверов, где каждый фронт сигнала будет создавать движение. PWM изменяет только продолжительность ВЫСОКОГО и НИЗКОГО участков этого движения, а не частоту (которая *изменяет* скорость). Вы, вероятно, захотите использовать библиотеку, предназначенную для работы с шаговыми двигателями/драйверами., @towe


1 ответ


Лучший ответ:

3

Изменение рабочего цикла не меняет частоту ШИМ-сигнала.

Tb6000 нужен импульс, чтобы запустить двигатель. Если частота не меняется, количество импульсов в секунду тоже не меняется, и поэтому скорость постоянна.

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

Но в случае двух двигателей с разной скоростью вам нужны переменные-счетчики для имметации двух частот (скоростей), которые вам нужно контролировать для каждой скорости двигателей.

Сначала вы вычисляете отношение скоростей (вы сказали, что y=1 и x=n шагов. Затем соотношение равно n:1, т.е. двигатель X быстрее, чем двигатель Y, с коэффициентом n).

Ниже приведен неполный пример, объясняющий мою идею.

int cntX = 0;
int cntY = 0;

// я не знаю, что вы оцениваете n
// Допустим, n=5
int ratioX = 5;
int ratioY = 1;

// Один шаг в секунду на максимальной скорости
// выберите то, что соответствует вашим потребностям
int delayForMaxSpeed = 1000;

const int stepPinX = 5; 
const int dirPinX = 2; 
const int stepPinY = 6; 
const int dirPinY = 3; 
const int enPin = 8;

void setup() 
{
  
  pinMode(stepPinX,OUTPUT); 
  pinMode(dirPinX,OUTPUT);
  pinMode( stepPinY, OUTPUT ); 
  pinMode( dirPinY, OUTPUT );

  pinMode( enPin, OUTPUT );
  digitalWrite( enPin, LOW );
  
}

void loop() 
{
  // Позволяет двигателю двигаться в определенном направлении
  digitalWrite( dirPin, HIGH ); 

  countx++; 
  county++;

  if ( countX >= ratioX )
  {
     countX = 0;
     digitalWrite( stepPinX, HIGH ); 
  }

  if ( countY >= ratioY )
  {
    countY = 0;
    digitalWrite( stepPinY, HIGH ); 
  }

  delayMicroseconds( 500 ); 

  digitalWrite( stepPinX, LOW ); 
  digitalWrite( stepPinY, LOW ); 

  delay( delayForMaxSpeed );
}
,