плавный пуск и остановка шагового двигателя arduino
приветствую столкнулся с проблемой плавного старта и пуска, кто может помочь? "uint32_t f = 1000;" при старте и остановке хорошо было бы 250, а при движении 1000
const uint8_t pin_DIR = 3;
const uint8_t pin_PUL = 4;
// Вывод GND Arduino соединён с входами драйвера ENA-, DIR-, PUL-.
uint32_t f = 1000; // Определяем частоту следования микрошагов от 1 до 200'000 Гц.
// Чем выше частота, тем выше скорость вращения вала.
void setup(){ //
pinMode( pin_ENA, OUTPUT ); // Конфигурируем вывод Arduino как выход.
pinMode( pin_DIR, OUTPUT ); // Конфигурируем вывод Arduino как выход.
pinMode( pin_PUL, OUTPUT ); // Конфигурируем вывод Arduino как выход.
} //
//
uint32_t t = 1000000/f/2; // Определяем длительность импульсов t3 и пауз t4 в мкс.
//
void loop(){ //
// Готовимся к движению вала: //
digitalWrite( pin_ENA, 0 ); // Разрешаем работу двигателя.
delayMicroseconds(5); // Выполняем задержку t1 (см. график STEP/DIR).
digitalWrite( pin_DIR, 0 ); // Выбираем направление вращения.
delayMicroseconds(5); // Выполняем задержку t2 (см. график STEP/DIR).
// Поворачиваем вал на 2 оборота: //
for(int i=0; i<1600; i++){ // Выполняем 1600 проходов цикла (1 оборот = 800 тактов, 2 оборота = 1600).
digitalWrite( pin_PUL, 1 ); // Устанавливаем на выводе PUL состояние логической «1».
delayMicroseconds(t); // Выполняем задержку t3 (см. график STEP/DIR).
digitalWrite( pin_PUL, 0 ); // Устанавливаем на выводе PUL состояние логического «0».
delayMicroseconds(t); // Выполняем задержку t4 (см. график STEP/DIR).
} //
// Останавливаем вал удерживая его: // Двигатель не вращается, если на вывод PUL не поступают импульсы.
delay(5000); // Ждём 5 секунд. В это время двигатель остановлен, его вал удерживается.
// Меняем направление движения вала: //
digitalWrite( pin_DIR, 1 ); // Меняем логический уровень вывода DIR с 0 на 1.
delayMicroseconds(5); // Выполняем задержку t2 (см. график STEP/DIR).
// Поворачиваем вал на 2 оборота: //
for(int i=0; i<1600; i++){ // Выполняем 1600 проходов цикла (1 оборот = 800 тактов, 2 оборота = 1600).
digitalWrite( pin_PUL, 1 ); // Устанавливаем на выводе PUL состояние логической «1».
delayMicroseconds(t); // Выполняем задержку t3 (см. график STEP/DIR).
digitalWrite( pin_PUL, 0 ); // Устанавливаем на выводе PUL состояние логического «0».
delayMicroseconds(t); // Выполняем задержку t4 (см. график STEP/DIR).
} //
// Останавливаем вал без удержания: //
digitalWrite( pin_ENA, 1 ); // Запрещаем работу двигателя, отключаем токи в обмотках.
delay(5000); // Ждём 5 секунд. В это время двигатель отключен, его вал свободен.
} /
const uint8_t pin_ENA = 2;
const uint8_t pin_DIR = 3;
const uint8_t pin_PUL = 4;
uint32_t f = 1000;
void setup(){
pinMode( pin_ENA, OUTPUT );
pinMode( pin_DIR, OUTPUT );
pinMode( pin_PUL, OUTPUT );
}
uint32_t t = 1000000/f/2;
void loop()
Ответы (1 шт):
Автор решения: eri
→ Ссылка
Функцию на задержку - увеличиваем время в 4 раза и плавно выходим на t (по частоте линейно, по времени гиперболой)
uint32_t get_slow_t(int i, int stop, uint32_t t, int steps) {
if (i < steps)
return t*4/(1+3*i/steps);
if ( stop - i < steps )
return t*4/(1+3*(stop-i)/steps);
return t;
}
И в цикле считаем задержку динамически, допустим разгон за 200 шагов
for(int i=0; i<1600; i++){
uint32_t st = get_slow_t(i, 1600, t, 200);
digitalWrite( pin_PUL, 1 );
delayMicroseconds(st);
digitalWrite( pin_PUL, 0 );
delayMicroseconds(st);
}