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, это не имеет значения. Разве рабочий цикл не должен изменять скорость шагового двигателя?
Что я здесь упускаю и как это можно сделать?
@some rand, 👍1
Обсуждение1 ответ
Лучший ответ:
Изменение рабочего цикла не меняет частоту ШИМ-сигнала.
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 );
}
- Шаговый двигатель не работает с платой A4988
- Справка по библиотеке AccelStepper - Одновременное управление двигателем
- Как позволить шаговому двигателю вращаться постоянно?
- Как правильно использовать микрошаговый драйвер с шаговым двигателем более низкого напряжения
- arduino 28BYJ-48 stepper только жужжит, не вращается
- Драйвер шагового двигателя не работает должным образом
- Шаговый двигатель TMC2208 не меняет скорость вращения линейно
- Как изменить направление шагового двигателя с помощью библиотеки AccelStepper?
Нет, PWM не изменит скорость - вы пульсируете на входе STEP ваших шаговых драйверов, где каждый фронт сигнала будет создавать движение. PWM изменяет только продолжительность ВЫСОКОГО и НИЗКОГО участков этого движения, а не частоту (которая *изменяет* скорость). Вы, вероятно, захотите использовать библиотеку, предназначенную для работы с шаговыми двигателями/драйверами., @towe