ATMEGA / ШАГОВЫЙ ДВИГАТЕЛЬ 28BYJ-48 ЧЕРЕЗ ДРАЙВЕР НА ОСНОВЕ ULN2003.

 

#define F_CPU 16000000UL
#include <avr/io.h>
#include <util/delay.h>
 
#define MIN_DELAY 1     // Максимальная скорость
#define MAX_DELAY 50    // Минимальная скорость
 
uint8_t speed_delay_ms = 10; // Начальная задержка между шагами
 
void step_motor(int step) {
    // Сначала сбрасываем фазы
    PORTB &= ~((1 << PB0) | (1 << PB1) | (1 << PB2) | (1 << PB3));
 
    // Включаем нужную фазу
    switch (step % 4) {
        case 0: PORTB |= (1 << PB0); break;
        case 1: PORTB |= (1 << PB1); break;
        case 2: PORTB |= (1 << PB2); break;
        case 3: PORTB |= (1 << PB3); break;
    }
}
 
int main(void) {
    DDRB |= (1 << PB0) | (1 << PB1) | (1 << PB2) | (1 << PB3);
    int step = 0;
 
    while (1) {
        step_motor(step++);
        _delay_ms(speed_delay_ms);
        if (step >= 4) step = 0;
 
        // Для примера: уменьшаем задержку каждую итерацию (ускорение)
        if (speed_delay_ms > MIN_DELAY) speed_delay_ms--;
        else speed_delay_ms = MAX_DELAY; // Зациклим
    }
}