Подключение биполярного шагового двигателя к микроконтроллерам AVR
Биполярный шаговый двигатель отличается от униполярного шагового двигателя тем, что полярность обмоток изменяется во время коммутации. Разом активируется половина обмоток, что обеспечивает в сравнении с униполярными шаговыми двигателями большую эффективность. У биполярных шаговых двигателей четыре провода, которые все соединяются отдельно полумостом. При коммутации полумосты прикладывают к концам обмоток положительное или отрицательное напряжение.
Схема управления для биполярного шагового двигателя требует наличия мостовой схемы для каждой обмотки. Эта схема позволит независимо менять полярность напряжения на каждой обмотке. Основа схемы — микроконтроллер ATMega8, обеспечивающий логику работы и двойной H-мост L293, который обеспечивает коммутацию обмоток двигателя. Согласно документации L293 в схему включены 8 диодов 1N4001, чтобы защитить микросхему от выбросов обратного напряжения. Если драйвер L293 с индексом D, то диоды можно не ставить так как они уже есть внутри микросхемы.
![]()
Логика работы микроконтроллера для управления униполярным и биполярным двигателями одинакова, различаются только типы силовых драйверов, поэтому исходный код управляющей программы для того и другого типа будет одинаков.
01.// Подключение биполярного шагового двигателя к AVR02.#include <avr/io.h>03.#include <util/delay.h>04.#include <avr/interrupt.h>05.06.// Полношаговый режим 2 фазы07.// Направление вращения по часовой стрелке08.unsignedcharcw_dir[4]=09.{10.0b00000001,11.0b00000010,12.0b00000100,13.0b0000100014.};15.16.// Направление вращения против часовой стрелки17.unsignedcharccw_dir[4]=18.{19.0b00001000,20.0b00000100,21.0b00000010,22.0b0000000123.};24.25.volatileunsignedcharstep_index;26.volatileunsignedintovftimes;27.volatileunsignedcharstatus;28.29.// Прерывание по переполнению Т030.ISR(TIMER0_OVF_vect)31.{32.staticunsignedintcount = 1;33.count++;34.if(count >= ovftimes)// Применяем задержку35.{36.cli();// Запрещаем прерывания37.38.if(status)// если status == 1 крутим против часовой39.PORTB = ccw_dir[step_index++];40.else// иначе крутим по часовой41.PORTB = cw_dir[step_index++];42.43.if(step_index >= 4)44.step_index=0;45.46.count = 0;// Сброс счетчика47.TCNT0 = 0;// Старт счетчика с нуля48.sei();// Глобально разрешаем прерывания49.}50.}51.52.// прерывание по вектору INT053.ISR(INT0_vect)54.{55.status = 0;// по часовой56.}57.58.// прерывание по вектору INT159.ISR(INT1_vect)60.{61.status = 1;// против часовой62.}63.64.intmain(void)65.{66.DDRB = 0b00001111;// PB0, PB1, PB2, PB3 - выходы67.PORTB = 0x00;// Лог. нули на выходе68.69.ADCSRA = (1 << ADEN)// разрешение АЦП70.| (1 << ADPS2)// предделитель на 64 (частота АЦП 125kHz)71.| (1 << ADPS1);72.ADMUX = 0x00;// ADC0 - вход, внешний ИОН 5 Вольт73.74.GICR |= (1 << INT1)|(1 << INT0);// Разрешаем внешние прерывания75.MCUCR |= (1 << ISC11)// Прерывание по заднему фронту INT176.|(1 << ISC01);// Прерывание по заднему фронту INT077.78.TCCR0 |= (1 << CS01);// Предделитель на 879.TCNT0 = 0;// Старт счетчика с нуля80.TIMSK |= (1 << TOIE0);// Разрешаем прерывания по переполнению Т081.82.step_index = 0;83.ovftimes = 10;// первоначальная задержка84.status = 0;// при включении вращение по часовой85.86.sei();// Глобально разрешаем прерывания87.88.while(1)89.{90.ADCSRA |= (1 << ADSC);// Начинаем преобразование91.while(ADCSRA & (1 << ADSC));// Ждем пока завершится преобразование92.ovftimes = ADCW;// Значение временной задержки93.}94.}Архив для статьи "Подключение биполярного шагового двигателя к микроконтроллерам AVR"
По просьбе читателей выкладываю исходник программы управления биполярным шаговым двигателем, исходник переделанный, двигатель работает только тогда когда нажата кнопка "вперед" или "назад", когда кнопка отпускается двигатель останавливается.
http://radioparty.ru/index.php/prog-avr/program-c/485-lesson-bipolar-step-motor