Печать

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

Автор: AntonChip Опубликовано . Опубликовано в Программирование на Си

Рейтинг:   / 29
ПлохоОтлично 

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

Схема управления для биполярного шагового двигателя требует наличия мостовой схемы для каждой обмотки. Эта схема позволит независимо менять полярность напряжения на каждой обмотке. Основа схемы — микроконтроллер 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; // Значение временной задержки
}
}

Файлы:
Проект AVRStudio4
Дата 26.11.2013 Размер файла 13.16 KB Закачек 2369

Обсуждение статьи на форуме

Комментарии  

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..." , а при нажатии кнопки "меньше" наоборот. Думал насчет галетного переключателя, но нужно что то компактнее. Заранее благодарен за помощь!
Сообщить модератору

Рекомендуем посмотреть