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


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

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

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

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

01.// Подключение биполярного шагового двигателя к AVR
02.#include <avr/io.h>
03.#include <util/delay.h>
04.#include <avr/interrupt.h> 
05. 
06.// Полношаговый режим 2 фазы
07.// Направление вращения по часовой стрелке
08.unsigned char cw_dir[4]=
09.{
10.0b00000001,
11.0b00000010,
12.0b00000100,
13.0b00001000
14.};
15. 
16.// Направление вращения против часовой стрелки
17.unsigned char ccw_dir[4]=
18.{
19.0b00001000,
20.0b00000100,
21.0b00000010,
22.0b00000001
23.};
24. 
25.volatile unsigned char step_index;
26.volatile unsigned int ovftimes;
27.volatile unsigned char status;
28. 
29.// Прерывание по переполнению Т0
30.ISR(TIMER0_OVF_vect)
31.{
32.static unsigned int count = 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.// прерывание по вектору INT0
53.ISR(INT0_vect)
54.{
55.status = 0; // по часовой
56.}
57. 
58.// прерывание по вектору INT1
59.ISR(INT1_vect)
60.{
61.status = 1; // против часовой
62.}
63. 
64.int main(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) // Прерывание по заднему фронту INT1
76.        |(1 << ISC01); // Прерывание по заднему фронту INT0
77. 
78.TCCR0 |= (1 << CS01); // Предделитель на 8
79.TCNT0 = 0; // Старт счетчика с нуля
80.TIMSK |= (1 << TOIE0); // Разрешаем прерывания по переполнению Т0
81. 
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