Top.Mail.Ru
Ответы
Аватар пользователя
Аватар пользователя
Аватар пользователя
Аватар пользователя
Программирование
+3

Arduino плавный старт и остановка шагового двигателя

приветствую столкнулся с проблемой плавного старта и пуска, кто может помочь?
"uint32_t f = 1000;" при старте и остановке хорошо было бы 250, а при движении 1000

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
 const uint8_t pin_ENA = 2;
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(){ 
По дате
По рейтингу
Аватар пользователя
Просветленный
1234567891011121314151617181920212223242526272829303132333435
 const uint8_t pin_ENA = 2; 
const uint8_t pin_DIR = 3; 
const uint8_t pin_PUL = 4; 
 
uint32_t f_start_stop = 250;  
uint32_t f_run = 1000;        
 
void setup() { 
  pinMode(pin_ENA, OUTPUT); 
  pinMode(pin_DIR, OUTPUT); 
  pinMode(pin_PUL, OUTPUT); 
} 
 
void loop() { 
  smoothAcceleration(f_start_stop, f_run); 
  smoothDeceleration(f_run, f_start_stop); 
} 
void smoothAcceleration(uint32_t f_start, uint32_t f_end) { 
  for (uint32_t f = f_start; f <= f_end; f += 10) { 
    uint32_t t = 1000000 / f / 2; 
    step(t); 
  } 
}  
void smoothDeceleration(uint32_t f_start, uint32_t f_end) { 
  for (uint32_t f = f_start; f >= f_end; f -= 10) { 
    uint32_t t = 1000000 / f / 2; 
    step(t); 
  } 
} 
void step(uint32_t t) { 
  digitalWrite(pin_PUL, HIGH); 
  delayMicroseconds(t); 
  digitalWrite(pin_PUL, LOW); 
  delayMicroseconds(t); 
}