Биполярный шаговый двигатель отличается от униполярного шагового двигателя тем, что полярность обмоток изменяется во время коммутации. Разом активируется половина обмоток, что обеспечивает в сравнении с униполярными шаговыми двигателями большую эффективность. У биполярных шаговых двигателей четыре провода, которые все соединяются отдельно полумостом. При коммутации полумосты прикладывают к концам обмоток положительное или отрицательное напряжение.

Подключение биполярного шагового двигателя к микроконтроллерам AVR

Схема управления для биполярного шагового двигателя требует наличия мостовой схемы для каждой обмотки. Эта схема позволит независимо менять полярность напряжения на каждой обмотке. Основа схемы — микроконтроллер ATMega8, обеспечивающий логику работы и двойной H-мост L293, который обеспечивает коммутацию обмоток двигателя. Согласно документации L293 в схему включены 8 диодов 1N4001, чтобы защитить микросхему от выбросов обратного напряжения. Если драйвер L293 с индексом D, то диоды можно не ставить так как они уже есть внутри микросхемы.

Подключение биполярного шагового двигателя к микроконтроллерам AVR

Логика работы микроконтроллера для управления униполярным и биполярным двигателями одинакова, различаются только типы силовых драйверов, поэтому исходный код управляющей программы для того и другого типа будет одинаков.

// Подключение биполярного шагового двигателя к AVR
#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>  

// Полношаговый режим 2 фазы
// Направление вращения по часовой стрелке
unsigned char cw_dir[4]= 
{
0b00000001,
0b00000010,
0b00000100,
0b00001000
};

// Направление вращения против часовой стрелки
unsigned char ccw_dir[4]= 
{
0b00001000,
0b00000100,
0b00000010,
0b00000001
};

volatile unsigned char step_index;
volatile unsigned int ovftimes;
volatile unsigned char status;

// Прерывание по переполнению Т0
ISR(TIMER0_OVF_vect)
{
static unsigned int count = 1;
count++;
if(count >= ovftimes) // Применяем задержку
{
cli(); // Запрещаем прерывания

if(status) // если status == 1 крутим против часовой
PORTB = ccw_dir[step_index++];
else       // иначе крутим по часовой
PORTB = cw_dir[step_index++];

if (step_index >= 4)
step_index=0;

count = 0; // Сброс счетчика
TCNT0 = 0; // Старт счетчика с нуля
sei(); // Глобально разрешаем прерывания
}
}

// прерывание по вектору INT0
ISR(INT0_vect)
{
status = 0; // по часовой
}

// прерывание по вектору INT1
ISR(INT1_vect)
{
status = 1; // против часовой
}

int main(void)
{
DDRB = 0b00001111; // PB0, PB1, PB2, PB3 - выходы
PORTB = 0x00; // Лог. нули на выходе

ADCSRA = (1 << ADEN) // разрешение АЦП
      | (1 << ADPS2) // предделитель на 64 (частота АЦП 125kHz)
	  | (1 << ADPS1);
ADMUX = 0x00; // ADC0 - вход, внешний ИОН 5 Вольт

GICR |= (1 << INT1)|(1 << INT0); // Разрешаем внешние прерывания
MCUCR |= (1 << ISC11) // Прерывание по заднему фронту INT1
        |(1 << ISC01); // Прерывание по заднему фронту INT0

TCCR0 |= (1 << CS01); // Предделитель на 8
TCNT0 = 0; // Старт счетчика с нуля
TIMSK |= (1 << TOIE0); // Разрешаем прерывания по переполнению Т0

step_index = 0;
ovftimes = 10; // первоначальная задержка
status = 0; // при включении вращение по часовой

sei(); // Глобально разрешаем прерывания

while(1) 
{
ADCSRA |= (1 << ADSC); // Начинаем преобразование
while (ADCSRA & (1 << ADSC)); // Ждем пока завершится преобразование
ovftimes = ADCW; // Значение временной задержки
}
}


Архив для статьи "Подключение биполярного шагового двигателя к микроконтроллерам AVR"
Описание: Проект AVRStudio4
Размер файла: 13.16 KB Количество загрузок: 4 227 Скачать

Комментарии  

0 #21 wd75 23.06.2014 21:12
Вроде так и делаю....
Код:
DDRD |= 0; PORTD |= 1;

while(1)
{
if (PD0) status = 0; else status = 1;
}

в студии вроде работает, а на макетке вообще никак на кнопку не реагирует. С электрикой вроде нормально все.
Сообщить модератору
0 #22 wd75 30.06.2014 18:08
Мде... дело было не в бобине... С этим вроде разобрался, но теперь другое вылезло - при переключении скоростей происходит пропуск скоростей (иногда сразу всех). Хотя в протеусе все четко работает.
Я извиняюсь, но не могли бы вы взглянуть на мои художества?
Сообщить модератору
0 #23 AntonChip 30.06.2014 18:38
Цитирую wd75:
Мде... дело было не в бобине... С этим вроде разобрался, но теперь другое вылезло - при переключении скоростей происходит пропуск скоростей (иногда сразу всех). Хотя в протеусе все четко работает.
Я извиняюсь, но не могли бы вы взглянуть на мои художества?

Присылай на почту, что в контактах, посмотрю
Сообщить модератору
+1 #24 Станислав 10.07.2014 14:33
Подскажите, пожалуйста, какой аналогичный H-мост можно применить на ток в 2А?
Сообщить модератору
0 #25 Sirop4ik89 05.01.2015 08:01
Ребят а фьюзы какие выставлять?
Сообщить модератору
0 #26 sel75 14.03.2015 11:09
Здравтсвуйте! Скажите, эта программа крутит двиг как - скорость изменяет в зависимости от уровня на входе АЦП или угол меняет пропорционально ?
Сообщить модератору
0 #27 AntonChip 14.03.2015 11:46
Цитирую sel75:
Здравтсвуйте! Скажите, эта программа крутит двиг как - скорость изменяет в зависимости от уровня на входе АЦП или угол меняет пропорционально?

С помощью ацп меняется скорость следования импульсов на двигатель, в зависимости от того какая кнопка нажималась движок крутится в ту или иную сторону постоянно
Сообщить модератору
0 #28 Const 17.08.2015 10:07
Скажите пожалуйста, а возможно ли подключить 4 цифровых индикатор скорости и вместо R8 использовать кнопки регулировки. Например, нажимаю кнопку "больше" скорость увеличивается и на индикаторе высвечивается "1,2,3..." , а при нажатии кнопки "меньше" наоборот. Думал насчет галетного переключателя, но нужно что то компактнее. Заранее благодарен за помощь!
Сообщить модератору
0 #29 Александр_65 11.10.2018 20:34
Здравствуйте.У меня беда.Не работат контроллер.Пере ключение фаз происходит раз в 2 секунды,накнопк и не реагирует.Шъю PonyProgom. Фъюзы не трогаю.На плате программатора стоит кварц 8 М.Файл прошивки bipolar_step_mo tor.hex? Буду благодарен за ответ.
Сообщить модератору
0 #30 Wictor 05.11.2018 00:38
Увімкніть внутрішній тактовий генератор на 8мгц.
Сообщить модератору
0 #31 jest 23.11.2019 20:45
Не подскажете, как сделать так, чтобы после отпускания любой из кнопок - на тактовых выходах Атмеги - были нули. А то после отпускания кнопок - одна из обмоток шагового движка остается под напряжением, идет бесполезный нагрев и расход энергии.
Сообщить модератору
0 #32 AntonChip 24.11.2019 16:09
Цитирую jest:
Не подскажете, как сделать так, чтобы после отпускания любой из кнопок - на тактовых выходах Атмеги - были нули. А то после отпускания кнопок - одна из обмоток шагового движка остается под напряжением, идет бесполезный нагрев и расход энергии.

radioparty.ru/forum/avr/776
Сообщить модератору