плавный пуск и остановка шагового двигателя 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);            
 }
→ Ссылка