


Программирование
+3Arduino плавный старт и остановка шагового двигателя
приветствую столкнулся с проблемой плавного старта и пуска, кто может помочь?
"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);
}