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; // Зациклим } }