14
• ••
Известия ДГПУ, №2, 2015
УДК 621
КОНТРОЛЛЕР ДЛЯ ДВУХФАЗНОГО УНИПОЛЯРНОГО
ШАГОВОГО ДВИГАТЕЛЯ НА МИКРОКОНТРОЛЛЕРЕ ATTINY2313
THE CONTROLLER FOR THE TWO-PHASE UNIPOLAR
STEPPER MOTOR WITH THE ATTINY2313 MICROCONTROLLER
© 2015 Расулов М. М., Магомедов Г. М., Нажмудинов А. М.
Дагестанский государственный педагогический университет
© 2015 Rasulov M. M., Magomedov G. M., Nazhmudinov A. M.
Dagestan State Pedagogical University
Резюме. В статье дается описание контроллера для двухфазного униполярного шагового двигателя на микроконтроллере ATtiny2313 с управляющими сигналами по протоколу STEP/DIR/ENABLE, который может быть использован для шаговых двигателей станков с ЧПУ.
Abstarct. The authors of the article give a description of the controller for the two-phase unipolar stepper motor with the ATtiny2313microcontroller with the control signals according to the STEP/DIR/ENABLE protocol, which can be used for stepper motors of CNC machines.
Rezjume.V stat'e daetsya opisanie controllera dlja dvyhfaznogo unipolyarnogo shagovogo dvigatelya na microcontrollere ATtiny2313s upravlyaushimi signalami po protocolu STEP/DIR/ENABLE, kotorui mojet but ispolzovan dlya shagovuh dvigateley stankov s CHPY.
Ключевые слова: контроллер шагового двигателя, микроконтроллер ATtiny2313, протокол STEP/DIR/ENABLE.
Keywords: stepper motor controller, ATtiny2313microcontroller, STEP/DIR/ENABLE protocol.
Kljuchevye slova: controller shagovogo dvigatelya, mikrokontroller ATtiny2313, protocol
STEP/DIR/ENABLE.
Работ по использованию микроконтроллеров разных типов в качестве драйверов шагового двигателя (ШД) достаточно много, но подробного описания простого для повторения контроллера ШД с открытым исходным кодом по протоколу STEP/DIR/ ENABLE с применением прерывания по сигналу STEP на базе ATtiny2313 найти не удалось [1].
Целью данной работы является разработка простого в изготовлении, относительно недорогого контроллера шагового двигателя на микроконтроллере ATtiny2313.
За основу программного управления ШД микроконтроллера был взят алгоритм стандартного протокола STEP/DIR/ENABLE с уровнем сигналов TTL (STEP-шаг, DIR-направление, ENABLE-включение). По сигналу STEP (по нарастающему фронту от лог.
0 до лог. 1) шаговым двигателем делается один шаг вперед или назад, в зависимости от состояния входа DIR. Если состояние на выводе DIR лог. 1, то ШД делает шаг по часовой стрелке, если на выводе DIR лог. 0 -против. Сигнал ENABLE подключает ШД к питанию, если на этом выводе лог. 0, и отключает, если на этом выводе лог. 1. При получении сигнала ENABLE на отключение ШД может свободно вращаться, так как питание на ШД не поступает для удержания полученной позиции. Статические сигналы на выводах DIR и ENABLE должны быть выставлены до появления динамического сигнала STEP программно или аппаратно. Назначение и состояние сигналов по этому протоколу приведены в таблице 1.
Естественные и точные науки
• ••
15
Таблица 1
Сигналы по протоколу
Наименование СТОП Почасовое Против ОТКЛЮЧЕНИЕ
STEP (ШАГ) Любое значение j i I j гп Любое значение
DIR (НАПРАВЛЕНИЕ) Любое значение L Любое значение
ENABLE (ВКЛЮЧЕНИЕ) 0 0 0 1
За основу контролера ШД была взята достаточно распространенная микросхема ATtiny2313 из семейства микроконтроллеров AVR.
Схема контроллера, показанная на рисунке 1, разрабатывалась и настраивалась в среде симулятора программы Proteus 7. Схема состоит из трех идентичных блоков A(X) на базе микроконтроллеров ATtiny2313 и одно-
го блока концевых выключателей и общей схемы сопряжения порта компьютера LPT c контроллером. На схеме не показаны фильтрующие конденсаторы по цепям питания схемы: они обычно расположены на платах блоков питания, но можно для надежности установить электролитические конденсаторы емкостью 100-1000 mkF на 50 V непосредственно на каждой плате.
Соединение к шаговым двигателям осуществляют от фазных выводов платы контроллера D0, D1, D2, D3 и вывода питания +U. Напряжение питания шаговых двигателей +U рассчитывают с учетом их технических характеристик. В качестве управляющих транзисторов можно применить любые транзисторы соответствующей мощности, в данном случае использованы транзисторы
КТ829 отечественного производства.
Для управления униполярными шаговыми двигателями нами применен полушаговый режим, но можно программно изменить на любой другой, в зависимости от используемых ШД и поставленных задач. Последовательность фаз включения обмоток в полушаговом режиме показана в таблице 2.
16
• ••
Известия ДГПУ, №2, 2015
Таблица 2
Последовательность фаз включения обмоток в полушаговом режиме
БТЕР(шаг) 1 2 3 4 5 6 7 8
D0 1 1 0 0 0 0 0 1
D1 0 1 1 1 0 0 0 0
D2 0 0 0 1 1 1 0 0
D3 0 0 0 0 0 1 1 1
Как видно из таблицы 1, количество шагов, необходимых для одного оборота ШД в этом режиме, равно восьми и они перекрываются в четных шагах, обеспечивая достаточную фиксацию положения оси ШД в полушаге и плавность его перемещения. Если при испытаниях обнаружится неточность позиционирования, то лучше использовать полношаговый режим, но при этом ухуд-
шится разрешающая способность по перемещению. Последовательность фаз включения обмоток в полношаговом режиме показана в таблице 3.
Для перехода из полушагового режима в полношаговый режим достаточно поменять блок кодов программы прошивки ATtiny2313 в двух местах.
Таблица 3
Последовательность фаз включения обмоток в полношаговом режиме
БТЕР(шаг) 1 2 3 4 5 6 7 8
D0 1 0 0 0 1 0 0 0
D1 0 1 0 0 0 1 0 0
D2 0 0 1 0 0 0 1 0
D3 0 0 0 1 0 0 0 1
со значений:
case 1: PORTB = 0b00000001; break; case 2: PORTB = 0b00000011; break; case 3: PORTB = 0B00000010; break; case 4: PORTB = 0B00000110; break; case 5: PORTB = 0B00000100; break; case 6: PORTB = 0B00001100; break; case 7: PORTB = 0B00001000; break; case 8: PORTB = 0B00001001; break; на значения:
case 1: PORTB = 0b00000001; break; case 2: PORTB = 0b00000010; break; case 3: PORTB = 0B00000100; break; case 4: PORTB = 0B00001000; break; case 5: PORTB = 0B00000001; break; case 6: PORTB = 0B00000010; break; case 7: PORTB = 0B00000100; break; case 8: PORTB = 0B00001000; break; Разработка программного кода драйвера ШД для микроконтроллера проводилась в интегрированной среде Code VisionAVR [1] с Proteus 7 на языке Си. Исходный код программы с пояснениями приведен в листинге 1.
Листинг 1. Программный код драйвера ШД для микроконтроллера на языке Си.
Chip type: ATtiny2313 AVR Core Clock frequency: 4,000000 MHz // Внутренняя частота тактового генератора 4 мГц.
Memory model: Tiny External RAM size: 0 Data Stack size: 32
******************************************
***********/
#include <tiny2313.h>
#include <delay.h>
unsigned char S=1; // объявляем символьную переменную без знака (8-бит) S и присваиваем
1.
unsigned char x=0; // объявляем символьную переменную без знака (8-бит) х.
unsigned char x1=0; // объявляем символьную переменную без знака (8-бит)х1.
// External Interrupt 0 service routine interrupt [EXT_INT0] void ext_int0_isr (void)
{
// Обработка прерывания по входу INTO. При появлении сигнала STEP - всегда попадаем в этот блок.
// Уточнение. Порт D ножка PD2 (6-я ножка - на прерывании даем имя в тексте STEP)
x1=!PIND.3; // чтение состояния PD3, 7-Я НОЖКА - ОБОЗНАЧАЕМ в тексте ВКЛЮЧЕНИЕ ДВИГАТЕЛЯ ENABLE.
// Было по схеме 0В - ВКЛЮЧИТЬ и +5В - ВЫКЛЮЧИТЬ.
// ПОСЛЕ ЛОГИЧЕСКОГО ОТРИЦАНИЯ ПОЛУЧИМ +5В - ВКЛЮЧИТЬ; 0 -
ВЫКЛЮЧИТЬ.
// чтение PD4, 8-Я НОЖКА - ОБОЗНАЧАЕМ НАПРАВЛЕНИЕ DIR. 0В - ПРОТИВ ЧАСОВОЙ; +5 - ПО ЧАСОВОЙ.
Естественные и точные науки
• ••
17
if (x1) {
if (PIND.4) {
// сюда попадаем при +5В на 8 ножке (DIR-направление) по часовому движению
+—+S;
// увеличить значение Sна единицу
if (S==9) {
S=1;
//Если S равно 9, то присвоить S единицу и продолжить вниз, если нет, то оставить S.
// как есть
и продолжим программу дальше вниз
// Здесь продолжаем работать с полученным значением S switch (S) { // По теку-
щему значению S делаем выбор одного шага
//и выходим из цикла вниз.
case 1: PORTB =
0b00000001; break;
case 2: PORTB = 0b00000011; break; case 3: PORTB = 0B00000010; break; case 4: PORTB = 0B00000110; break; case 5: PORTB = 0B00000100; break; case 6: PORTB = 0B00001100; break; case 7: PORTB = 0B00001000; break; case 8: PORTB = 0B00001001; break;
else { // Сюда попадаем при +0В на 8 ножке (DIR-направление) против часового направления.
--S; // В
этом случае, наоборот, уменьшаем S.
if (S==0) {// Если S равно 0, то присвоим ему новое значение 8 и продолжаем,
S=8;
};//если нет, то оставляем значение S, как есть.
switch (S) { //
По значению S делаем выбор одного шага и выходим из цикла.
case 1: PORTB = 0b00000001; break; case 2: PORTB = 0b00000011; break; case 3: PORTB = 0B00000010; break; case 4: PORTB = 0B00000110; break; case 5: PORTB = 0B00000100; break; case 6: PORTB = 0B00001100; break; case 7: PORTB = 0B00001000; break; case 8: PORTB = 0B00001001; break;
};
};
delay_ms(100); } // Ставим
задержку 100 мс. Задержку нужно подобрать экспериментально.
else
// Сюда попадет, когда придет сигнал ВЫКЛЮЧИТЬ ДВИГАТЕЛЬ ENABLE.
PORTB = 0b00000000; //Выставляем все нули на порт В,
//при этом S сохраняет свое значение, и ждем опять прерывание.
// Declare your global variables here void main(void)
{ _
// Declare your local variables here
// Crystal Oscillator division factor: 1
#pragma optsize-
CLKPR=0x80;
CLKPR=0x00;
#ifdef _OPTIMIZE_SIZE_
#pragma optsize+
#endif
// Input/Output Ports initialization // Port A initialization // Func2=In Func1=In Func0=In // State2=T State1=T State0=T PORTA=0x00;
DDRA=0x00;
PORTB=0x00;
DDRB=0b11111111; // Настраиваем PB0, PB1, PB2, PB3 на ВЫХОД управления ШД,
// а выводы pb4, pb5, pb6, pb7 тоже на ВЫХОД для семисегментного индикатора.
PORTD=0b00011100; // Подтягиваем
ножки pd2, pd3, pd4, т. е. 6, 7, 8 ножки к +5В.
DDRD=0b00000000; // Настраиваем все выводы порта D на чтение.
TCCR0A=0x00;
TCCR0B=0x00;
TCNT0=0x00;
OCR0A=0x00;
OCR0B=0x00;
TCCR1A=0x00;
TCCR1B=0x00;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;
//External Interrupt(s) initialization //INT0: On
//INT0 Mode: Rising Edge // INT1: Off
18
• ••
Известия ДГПУ, №2, 2015
// Interrupt on any change on pins PCINT0-7: Off
GIMSK=0b01000000; //В регистре GIMSK разрешаем (вывод 6 pd2 INTO) прерывание
MCUCR=0b00000011; //MCUCR настраиваем (вывод 6 pd2 INT0) прерывание по нарастающему фронту step. //Имеем в виду (вывод 6 pd2 INT0) подтянут на +5 В.
EIFR=0b01000000; //EIFR разрешаем прерывание int0. Это 6-й бит этого регистра.
// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x00;
USICR=0x00;
UCSRB=0x00;
ACSR=0x80;
DIDR=0x00;
// Global enable interrupts
#asm("sei")
while (1) //Эта часть программы работает всегда, когда нет прерывания. Используем для контроля шага
{ // семисегментным индикатором,
но можно обойтись и без этой части.
x=S; // Присваиваем x текущее значение S.
x&=0b00000001; // По маске 0b00000001 выделяем первый бит
PORTB.4=x; // Выводим этот бит в порт В.4 и повторяем то же самое с битами В.5, В.6, В.7 x=S;
x&=0b00000010;
PORTB.5=x;
x=S;
x&=0b00000100;
PORTB.6=x;
x=S;
x&=0b00001000;
PORTB.7=x;
}
}
// Конец программы
Установка FUSE-битов: lfuse:0x64, hfuse:0xdf
Таблица 4
Установка FUSE-битов
+CKD1V0 DWEN CKOUT EESAVE SUT1
+ SPIEN + SUTO WDTON + CKSEL3 BODLEVEL2
CKSEL2 BODLEVEL1 + CKSEL1 BODLEVEL0 + CKSEL0
SELFPRGEN
Результаты работы послужат созданию микроконтроллеров и шаговых двигате-и внедрению в современную технику лей.
Литература
1. Лебедев М. Б. CodeVision AVR. Пособие для начинающих. М. : Додэка-XXI, 2008. 594 с.
References
1. Lebedev M. B. CodeVision AVR. Handbook for beginners. M. : Dodeka-XXI, 2008. 594 p.
Literatura
1. Lebedev M. B. CodeVision AVR. Posobie dlja nachinajushhih. M. : Dodjeka-XXI, 2008. 594 s.
Статья поступила в редакцию 07.04.2015г.