OpenRobo
Самодельные роботы
Робот
Создать
Редакторы
Схемы и детали

Драйвер шагового двигателя своими руками

Содержание этой части обучения
Шаговый двигатель используется в машинах для точного перемещения. Наладим управление шаговым двигателем через USB с компьютера своими руками. Нам потребуется:

1) Шаговый двигатель, возьмем - Nema23 76 мм, вместо него может быть другой, управлять будем биполяным методом, любой гибридный и биполярный шаговый двигатель будет работать с таким же управлением.

2) Блок питания, возьмем - импульсный блок питания мощностью 360W с выходным напряжением 24V / 15A, может использоваться любой другой блок питания, если будет достаточно мощности и напряжения для работы двигателя. Более мощному двигателю будет нужно больше напряжения. Предел напряжения нашего драйвера ограничивается максимальным напряжением, которое выдерживают транзисторы, это 100V, у нас блок питания на 24V. В случае большего напряжения транзисторы в схеме необходимо заменить на более мощные, также при увеличении напряжения, транзисторы могут начать греться, если такое случилось, необходимо дополнительно обдувать их куллером (у меня все в порядке и куллер не требуется). Для подключения блока питания к сети 220V также нужен шнур и нужно определить где в вашей розетке ноль, а где фаза. Контакт блока N подключается к нулю, а L к фазе, также можно подключить заземление (но не обязательно). Определение возможно при помощи индикаторной отвертки, у меня определилось, что слева ноль, а справа фаза.

Nema 17 купить
800
РУБ.
ШТ.
КУПИТЬ
Момент инерции: 56 oz-in
Момент инерции: 4 кг/см
Для соединителя: 5 мм
Импульсн. блок питания купить
1300
РУБ.
НЕТ В НАЛИЧИИ
Вход: AC 220V
Выход: DC 24V
Максимальный ток: 15 A
Шнур с вилкой купить
150
РУБ.
НЕТ В НАЛИЧИИ
Напряжение: AC 220V
Контакты: 2 (N / L)
Индикаторная отвертка купить
110
РУБ.
НЕТ В НАЛИЧИИ
Макс. напряжение: 250V
Горит: Фаза (L)
Не горит: Ноль (N)
Соединитель Nema 17 купить
200
РУБ.
ШТ.
КУПИТЬ
Для двигателей: Nema 17
Диаметр 1: 5 мм
Диаметр 2: 10 мм
 

Как крутить шаговый двигатель

Шаговый двигатель работает от подачи комбинаций напряжения в разных направлениях на его обмотки, у этого шагового двигателя 2 обмотки - 4 провода, первая обмотка - черный (A) и зеленый (A*) провод, вторая обмотка - красный (B) и синий (B*). За одну смену комбинаций делается 1 шаг - 1,8 градусов. Если комбинации быстро менять, то двигатель будет быстро и точно позиционироваться - крутиться. Смена комбинаций возможна в двух направлениях, соответственно двигатель будет крутиться вперед или назад.

Чтобы крутить шаговый двигатель, надо:

1) Собрать устройство - USB контроллер шагового двигателя на микроконтроллере AVR и драйвер шагового двигателя, 2 в 1. Перед тем как собирать это сложное устройство, рекомендую сначало отдельно собрать и проверить работу только USB контроллера, его я уже собрал вот тут - контроллер USB. Если USB связь работает нормально, то можно приступать к изготовлению драйвера.

2) Написать программу для компьютера, которая будет посылать USB команды устройству.

3) Написать программу для микроконтроллера AVR, которая будет принимать USB команды и крутить двигатель.

USB контроллер шаговых двигателей и USB драйвер шагового двигателя

Взятый нами двигатель является гибридным и поддерживает несколько вариантов управления. Управлять двигателем будем биполярным методом и соответственно собираем мы драйвер биполярного шагового двигателя с USB контроллером. Сначало покажу готовый результат, а потом подробно рассмотрим его. Вот фото собранного драйвера шагового двигателя с USB управлением, который я собрал:

Драйвер шагового двигателя с USB управлением своими руками

Драйвер шагового двигателя с USB управлением своими руками

На картинке сверху - биполярный (гибридный) шаговый двигатель NEMA 23 с потреблением - 3А тока на обмотку. Под ним - импульсный блок питания 360 Вт, 24 В, 15 А. Мощности блока хватает на 15 / 3 = 5 одновременно запитанных обмоток, у одного двигателя 2 обмотки, т.е хватит на 2 одновременно работающих двигателя (4 обмотки). Я не вижу необходимости включать одновременно больше одного двигателя, в случае если необходимо двигаться по кривой траектории, то нужно чередовать короткие включения то одного, то другого двигателя. Так что имеющейся мощности с запасом хватает. Двигатель и блок питания подключены к устройству, которое также подключено через USB к компьютеру. Все соединено по схеме.

Схема драйвера биполярного шагового двигателя и USB контроллера (схема длинная и нуждается в прокрутке для просмотра):

Драйвер шагового двигателя USB на микроконтроллере AVR своими руками

Драйвер шагового двигателя USB на микроконтроллере AVR своими руками - схема своими руками

Электронные компоненты, которые надо купить для сборки устройства по схеме:

ATmega16A купить
160
РУБ.
ШТ.
КУПИТЬ
Это: Микроконтроллер
Контакты: 40
Программа: 16 Kb
Драйвер IR2101 купить
50
РУБ.
ШТ.
КУПИТЬ
Это: Драйвер ключей
Ключи: 2 транзистора
Контакты: 8
Транзистор IRF540N купить
35
РУБ.
ШТ.
КУПИТЬ
Это: Ключ
Максимальный ток: 33 A
Макс. напряжение: 100 V
Диод Зенера 3V6 купить
2
РУБ.
ШТ.
КУПИТЬ
Пропускает: 3.6 В
Тип: Понижающий
Диод 1n4148 купить
2
РУБ.
ШТ.
КУПИТЬ
Тип: Обычный
Максимальный ток: 0.15 A
Макс. напряжение: 100 V
 
Конденсатор 20 pF купить
4
РУБ.
ШТ.
КУПИТЬ
Емкость: 20 pF
Тип: Керамический
Макс. напряжение: 50 V
Конденсатор 3.3 nF купить
4
РУБ.
ШТ.
КУПИТЬ
Емкость: 3.3 nF
Тип: Керамический
Макс. напряжение: 50 V
Кварцевый генератор 12 купить
5
РУБ.
ШТ.
КУПИТЬ
Частота: 12 МГц
Тип: пассивный
Конденсатор 2A104J купить
5
РУБ.
ШТ.
КУПИТЬ
Тип: Пленочный
Емкость: 0.1 uF (мкФ)
Макс. напряжение: 100V
Клеммник купить
15
РУБ.
ШТ.
КУПИТЬ
Контактов: 2
Зажим: прикрутка
 
Резистор 68 Ом купить
1
РУБ.
ШТ.
КУПИТЬ
Сопротивление: 68 Ом
Мощность: 0.25 Вт
Резистор 1.5 кОм купить
1
РУБ.
ШТ.
КУПИТЬ
Сопротивление: 1.5 кОм
Мощность: 0.25 Вт
Резистор 100 Ом купить
1
РУБ.
ШТ.
КУПИТЬ
Сопротивление: 100 Ом
Мощность: 0.25 Вт
Резистор 10 Ом купить
1
РУБ.
ШТ.
КУПИТЬ
Сопротивление: 10 Ом
Мощность: 0.25 Вт
Резистор 0.1 Ом купить
15
РУБ.
ШТ.
КУПИТЬ
Сопротивление: 0.1 Ом
Мощность: 5 Вт
Тип: Цементный
 
Кабель USB купить
50
РУБ.
НЕТ В НАЛИЧИИ
Нужно 1 шт.
Интерфейс: USB 2.0
Длина: 100 см
Макетная плата купить
190
РУБ.
ШТ.
КУПИТЬ
Размер: 63 x 2 горизонтальных линий и 4 вертикальные линии
Проводки купить
80
РУБ.
ШТ.
КУПИТЬ
Тип: Навесные
Количество: 40
Набор проводков купить
210
РУБ.
ШТ.
КУПИТЬ
Количество: 140
 
Дополнительно нужно (нет в наличии):

1) Модуль питания DC-DC SMAU01L-12 (вместо него пойдет любой конвертер DC-DC с 5V до 10V-15V) - 1 шт., возможно можно без него, от 5V питать (не проверено)

Главным компонентом схемы является программируемый микроконтроллер AVR - ATmega16A, если вы не знаете как с ними работать (записывать программу), сначало ознакомьтесь с основами такой работы, которые подробно описаны в первой статье
управление машиной. Для устройства можно использовать и другой микроконтроллер AVR, я выбрал ATmega16A, т.к. в нем с запасом имеется много памяти и контактов для подключения нескольких двигателей и большого количества рабочих инструментов.

Слева от ATmega16A находятся компоненты для организации связи по протоколу USB - к выводам XTAL подключен внешний кварцевый резонатор с USB-совместимой частотой 12 МГц. Для сглаживания сигнала у него есть 2 конденсатора по 20 пФ, все это соединяется с минусом питания. К контактам, через которые идет обмен сообщениями с USB, подключены 2 резистора по 68 Ом, как того требует протокол USB. Резистор на 1.5 кОм, подключенный к D- линии задает низкоскоростной режим работы USB устройства. Диоды Зенера 3V6 понижают напряжение на линиях, через которые идет обмен данными USB с 5 до 3.6V.

Управление двигателем подключается к контактам PB0, PB1, PB2, PB3, на остальные свободные P-контакты можно в будующем подключить еще двигатели и рабочие инструменты, но пока они пустуют. Микроконтроллер ATmega16 отдает команды и обрабатывает USB сигналы после того как в него записана программа (ниже она будет написана). После него идет конструкция из микросхем IR2102 и транзисторов IRF540N (2 так называемых H-моста) - она приводит шаговый двигатель в движение.

Драйвер IR2101 нужен для преодаления большой емкости затвора транзистора IRF540N, что позволяет открывать и закрыть транзистор с большой скоростью (например принимать сигнал ШИМ, которым может регулироваться скорость двигателя при необходимости - об этом сигнале дальше напишу), что нам и нужно. К сожалению для питания этого драйвера необходимо 10-15V, у нас есть только 5V от USB. Поэтому пришлось поставить компонент DC-DC SMAU01L-12, который преобразует 5V в 12V, вместо него можно использовать любой другой способ получения такого напряжения, например, при помощи трансформатора или любым другим путем. К VCC подключается +12V, к COM -12V. Один драйвер работает с 2мя транзисторами - верхним (H) и нижним (L). Контакты HIN и LIN - входной сигнал с микроконтроллера для верхнего и нижнего транзистора, по этому сигналу транзисторы открываются и закрываются. HO и LO - это выходные сигналы, транзисторы подключаются гейтами (G) к этим контактам. Они подключаются не просто так - справа на линиях 2 резистора 10/100 Ом и диод, они нужны для нормальной работы транзисторов - чтобы они замедлялись при открытии и не замедлялись при закрытии, эти транзисторы слишком быстро открываются и это может вызвать проблемы. Диод и конденсаторы 3300 пФ - нужны для работы драйвера IR2101 согласно документации на эту микросхему.

Каждая обмотка (фаза) двигателя (у двигателя 2 обмотки A и B - 4 контакта) подключается к H-мосту из транзисторов IRF540N. H-мост - это специальная схема соединения транзисторов, которая позволяет подавать через них напряжение высокого уровня (24V) в разных направлениях. Один мост изготавливается из 4-х транзисторов. В итоге здесь вы видите 2 H-моста, которые позволяют гонять разнонаправленное напряжение высокого уровня по 2м обмоткам двигателя и тем самым крутить его.

Обратите внимание, что в мосту - HIN верхнего драйвера соединяется с LIN нижнего драйвера, а LIN верхнего с HIN нижнего. Это сделано для одновременной подачи сигналов. Если вы включили HIN сверху, то обязаны включить LIN с низу, иначе произойдет короткое замыкание. Такое подключение позволяет автоматом включать пару. Впрочем короткое замыкание все же возможно, если вы откроете и HIN и LIN на одном мосте, поэтому не допускайте этого. На контактах PB0 - PB3 допустимы только значения 0000, 1010, 0110, 0101, 1001. Их перебор крутит двигатель. Подача других значений скорей всего приведет к короткому замыканию моста.

Мощные резисторы с низким номиналом 0.1 Ом и высокой мощностью (3-5 Вт) нужны для защиты от высокого тока - это шунты. Если что их можно снять и заменить простым соединением с минусом питания, если например не будет хватать мощности. Для слабых резисторов мощность берется от тока USB: 0.05 А * 5 V = 0.25 Вт (ток USB задается программно, по умолчанию в нашей программе стоит 0.05). Черная полоска на диодах соответствует вертикальной линии на схеме.

Шаговый двигатель и блок питания подключаются к H-мостам, как показано на схеме. Минусы питания 24V, 12V и 5V соединяются. Между плюсом и минусом 24V линии ставится сглаживающий пленочный конденсатор.

Отдельное крупное фото драйвера шагового двигателя:

Драйвер шагового двигателя своими руками

Драйвер шагового двигателя своими руками

Сразу подключать питание высокого уровня (24V) к схеме и шаговый двигатель не рекомендую. Сначало лучше проверьте правильность работы устройства. Для этого можно использовать 5 светодиодов и отсек для батареек в качестве источника питания (3V). 1 светодиод подключается к контакту PA0 длинной стороной (+) и короткой стороной (-) к минусу питания. Этот желтый диод показан на первом фото сверху, на схеме его нет. С его помощью можно проверить работу USB контроллера, зажигать его и гасить по команде из программы. 2 других светодиода подключите на место первой обмотки шагового двигателя в разнонаправленном положении - один длинной стороной к первому контакту, другой длинной стороной ко второму контакту. Оставшиеся 2 светодиода таким же образом подключите на место второй обмотки. Вместо импульсного блока питания 24V подключите батарейный отсек и батарейки на 1.5V (2 батарейки - это 3V). Проверка устройства - при посылке команды кручения двигателя загораются различные светодиоды. Все светодиоды должны загораться в свое время при переборе комбинаций. Медленный перебор комбинаций позволяет точно убедиться в том, что все работает правильно.

 
Светодиод купить
3
РУБ.
ШТ.
КУПИТЬ
Цвет: Белый
Напряжение: 3 V
Отсек для батареек купить
35
РУБ.
ШТ.
КУПИТЬ
Места: 2 с проводками
Размер батареек: AA
Батарейки купить
10
РУБ.
НЕТ В НАЛИЧИИ
Нужно 2 шт.
Напряжение: 1.5 V
Размер: AA
 

Управление скоростью двигателя с помощью ШИМ сигнала

Управлять скоростью двигателя можно снижая подачу тока. Для этого вместо постоянного сигнала (на порты PB0, PB1, PB2, PB3) подается сигнал ШИМ. Суть ШИМ сигнала состоит в том, что это не постоянный сигнал, а быстрое включение и выключение. При этом интервал выключения можно изменять и направлять больше или меньше тока двигателю. Чем больше интервал выключения, тем медленней двигатель будет крутиться. В микроконтроллере AVR существует 2 способа получения ШИМ сигнала - программный ШИМ и аппаратный ШИМ.

Программный ШИМ делается на отдельном контроллере просто записью в него программы, этот контроллер подключается к уже имеющемуся контроллеру и сигнал идет не напрямую от ATmega16 к IR2101, а через этот ШИМ контроллер. Такое можно сделать на более мелком контроллере, например, ATtiny2313, программа для ATtiny2313, которая превращает его в программный ШИМ контроллер, вот она, эта программа на языке AVR Assembler...

Эта программа для микроконтроллера AVRПрограмма Комментарии
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
ldi r16, 0b11111111  
out DDRB, r16  
ldi r16, 0b00000000  
out DDRD, r16  
 
main:  
 
in r16, PIND  
out PORTB, r16  
rcall delay1  
 
ldi r16, 0b00000000  
out PORTB, r16  
rcall delay0  
 
rjmp main  
 
 
delay1:  
ldi r16, 200  
perehod1:  
dec r16  
brne perehod1  
ret  
 
delay0:  
ldi r16, 120  
perehod2:  
dec r16  
brne perehod2  
ret
Записываем 1-цы в регистр r16
Настроили порт B на вывод
Записываем 0-ли в регистр r16
Настроили порт D на ввод
Начало основной программы
Записываем в r16 то что на порте D (читаем)
Записываем в порт B прочтенные данные
Задерживаем (для включения ШИМ на порт D надо подать 1)
Записываем 0-ли в r16
Записываем в порт B эти 0-ли
Задерживаем данные (это всегда 0)
Переход на начало основной программы
Начало функции delay1, которая задерживает 1
Держим 1-цу 200 операций
Конец функции delay1
Начало функции delay0, которая задерживает 0
Держим 0-ль 120 операций
Конец функции delay0

Ток регулируется изменением чисел 200 и 120. 200 - время включения, 120 - время выключения. Сумма 200+120=320 дает частоту ШИМ 25 кГц (при условии, что контроллер работает на частоте 8 МГц от внутреннего генератора, такая там стоит по умолчанию, получается 8000000/320=25000). Сумма должна оставаться такой, а числа можно менять, чем больше первое число, тем ток больше.

Кроме того существует аппаратный ШИМ, который автоматически включается на линиях в микроконтроллере AVR через таймер счетчик. Однако тут есть недостаток - нужно пользоваться прерыванием для считывания сигнала таймера счетчика и передачи его на несколько портов. В виду постоянной ШИМизации и при большом количестве таких портов, возникает проблема перегруженности прерываний - если прерывание не уложится в период ШИМ, то в его конце запустится еще одно такое прерывание и контроллер зависнит, а ведь есть еще и другие прерывания, которые могут возникнуть в любое время! Аппаратный ШИМ есть в текущей версии программы для микроконтроллера.

Программа для Windows на двигатель

Уже готовую программу для Windows на USB контроллер нужно немного изменить. В итоге должны перебираться комбинации для подачи напряжения в разных направлениях, нам нужно менять значения на портах PB0, PB1, PB2, PB3, следующие комбинации нужны для запуска двигателя 1010, 0110, 0101, 1001. Перебор их в одну сторону - кручение в эту сторону, в другую - кручение обратно. 0000 - отключает питание, необходимо в конце перебора, иначе двигатель нагреется. Сейчас над этой программой ведется работа, так что возьмите её из USB контроллера, связь там работает, по аналогии можно сделать как нужно остальное у себя.



Программа для робота под Windows

Программа для робота под Windows

Программа для микроконтроллера на двигатель

Программа для микроконтроллера еще недоделана и находится в разработке, но то что было сделано вот оно, язык WinAVR C...

Это программа для микроконтроллера AVR, которая создана в программе WinAVRПрограмма Комментарии
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
volatile unsigned char posn=1;  
volatile unsigned char step=0;  
volatile unsigned char kuda=0;  
volatile unsigned char hold=8;  
volatile unsigned char holn=1;  
volatile unsigned char pwm1=0b00000000;  
volatile unsigned char pwm0=0b00000000;  
volatile unsigned char p1;  
volatile unsigned char p2;  
 
#include <avr/io.h>  
#include <avr/wdt.h>  
#include <avr/interrupt.h>  
#include <util/delay.h>  
#include <avr/pgmspace.h>  
 
#include "usbdrv/usbdrv.h"  
#include "requests.h"  
 
PROGMEM char usbHidReportDescriptor[22] = {  
0x06, 0x00, 0xff, 0x09, 0x01, 0xa1, 0x01, 0x15,  
0x00, 0x26, 0xff, 0x00, 0x75, 0x08, 0x95, 0x01,  
0x09, 0x00, 0xb2, 0x02, 0x01, 0xc0};  
 
usbMsgLen_t usbFunctionSetup(uchar data[8])  
{  
usbRequest_t *rq = (void *)data;  
if ((rq->bmRequestType & USBRQ_TYPE_MASK) == USBRQ_TYPE_VENDOR) {  
 
 
//пакет с ПК на МК  
if (rq->bRequest == CUSTOM_RQ_SET_STATUS) {  
p1 = rq->wValue.bytes[0];  
p2 = rq->wIndex.bytes[0];  
 
//========= ПРОГРАММА РЕАКЦИИ НА USB ПАКЕТ  
 
//лампочка  
if (p1==0) {  
// тушим свет лампочка гори!  
if (p2==0) PORTB&=~(1<<PB0); else if (p2==1) PORTB|=(1<<PB0);  
}  
 
//ШИМ  
if (p1==1) {  
 
 
//отключаем  
if (p2==0) {  
 
TIMSK=(0<<TOIE2)|(0<<OCIE0)|(0<<TOIE0);  
TCCR0=(0<<CS02)|(0<<CS01)|(0<<CS00);  
TCCR2=(0<<CS22)|(0<<CS21)|(0<<CS20);  
 
 
//включаем  
} else if (p2==1) {  
 
TIMSK=(1<<TOIE2)|(1<<OCIE0)|(1<<TOIE0);  
TCCR0=(1<<WGM00)|(0<<COM01)|(0<<COM00)|(1<<WGM01)|(0<<CS02)|(0<<CS01)|(1<<CS00);  
TCCR2=(1<<WGM20)|(0<<COM21)|(0<<COM20)|(1<<WGM21)|(0<<CS22)|(1<<CS21)|(0<<CS20);  
OCR2=100;  
 
 
//вернуть на 47  
} else if (p2==2) {  
TCCR0=(1<<WGM00)|(0<<COM01)|(0<<COM00)|(1<<WGM01)|(0<<CS02)|(0<<CS01)|(1<<CS00);  
 
//поставить 6  
} else if (p2==3) {  
TCCR0=(1<<WGM00)|(0<<COM01)|(0<<COM00)|(1<<WGM01)|(0<<CS02)|(1<<CS01)|(0<<CS00);  
 
//поставить /1024  
} else if (p2==4) {  
TCCR0=(1<<WGM00)|(0<<COM01)|(0<<COM00)|(1<<WGM01)|(1<<CS02)|(0<<CS01)|(1<<CS00);  
}  
}  
 
//подача энергии  
if (p1==2) {  
OCR0=p2;  
}  
 
//отключить питание  
if (p1==3) {  
PORTB&=~((1<<PB1)|(1<<PB2)|(1<<PB3)|(1<<PB4));  
}  
 
//настройки кручения - шаги  
if (p1==4) {  
step=p2;  
}  
 
//настройки задержки - сколько между шагами  
if (p1==5) {  
hold=p2;  
holn=p2;  
}  
 
//настройки направления  
if (p1==6) {  
kuda=p2;  
}  
//========== ПРОГРАММА РЕАКЦИИ КОНЕЦ  
 
//пакет с МК на ПК  
} else if (rq->bRequest == CUSTOM_RQ_GET_STATUS){  
 
static uchar dataBuffer[1];  
dataBuffer[0] = 1;  
usbMsgPtr = dataBuffer;  
return 1;  
 
}  
}  
return 0;  
}  
 
 
 
 
 
int main(void)  
{  
//включаем USB  
uchar i;  
wdt_enable(WDTO_1S);  
usbInit();  
usbDeviceDisconnect();  
i = 0;  
while(--i){  
wdt_reset();  
_delay_ms(1);  
}  
usbDeviceConnect();  
DDRB = 0b11111111;  
sei();  
 
while (1) {  
wdt_reset();  
usbPoll();  
}  
}  
 
 
 
 
 
ISR (TIMER0_OVF_vect)  
{  
PORTB=pwm1;  
}  
 
ISR (TIMER0_COMP_vect)  
{  
PORTB&=~(1<<PB1);  
PORTB&=~(1<<PB2);  
PORTB&=~(1<<PB3);  
PORTB&=~(1<<PB4);  
}  
 
ISR (TIMER2_OVF_vect)  
{  
if (step>0) {  
holn--;  
if (holn==0) {  
holn=hold;  
if (kuda==0) posn++; else posn--;  
if (posn==5) posn=1;  
if (posn==0) posn=4;  
if (posn==1) pwm1=0b01010101;  
if (posn==2) pwm1=0b01100110;  
if (posn==3) pwm1=0b10101010;  
if (posn==4) pwm1=0b10011001;  
step--;  
}  
} else {  
pwm1=0b00000000;  
}  
}
Текущая позиция ШД - 0 стоит, туда 1234, обратно 4321
Сколько еще осталось открутить шагов
Направление кручения - 0 туда, 1 обратно
Задержка между шагами в периодах таймера T2
Текущее значение счетчика задержки
Переменная показывает на каких линиях включать ШИМ
Переменная показывает на каких линиях отключать ШИМ
Первый параметр с ПК USB
Второй параметр с ПК USB
Подключаем дополнительные библиотеки WinAVR, которые необходимы
Подключаем файлы
Дескриптор USB
Функция обработки USB пакета с ПК
В USB пакете с ПК приходит 2 параметра числа - p1 и p2, в зависимости от их значений решаем что делать
Обработка пришедших номеров p1 и p2
На приход нуля в первом параметре в пакете с ПК ставим включение и выключение лампочки, которая установлена на линии PB0 микроконтроллера AVR, второй параметр определяет - включить или выключить
Единица будет настраивать параметры ШИМ
Отключение таймеров счетчиков по приходу нуля
Запрещаем прерывания от таймеров счетчиков T0 и T2
Останавливаем таймер счетчик T0
Останавливаем таймер счетчик T2
Включение таймеров счетчиков по приходу единицы
Разрешаем прерывания - по совпадению, по переполнению
Настраиваем T0 - 256 тактовый, без деления частоты
Настраиваем T2 - 256 тактовый, деление частоты на 8
Ставим на любое число совпадение T2, оно не используется
По двойке возвращаем частоту ШИМ 47 кГц
По тройке установить частоту ШИМ 6 кГц
По четверке сделать частоту несколько Гц
Задать уровень подачи энергии на двигатель, заполнение интервала ШИМ - от 0 (1%) до 256 (100% энергии)
Выключает питание, если что-то пошло не так
Устанавливает сколько еще шагов открутить надо
Устанавливает параметры задержки между шагами - сколько периодов таймера T2 держать задержку, перед тем как сделать следующий шаг
Здесь устанавливается переменная, которая определяет направление кручения
Это не используется, пока не нужно. Отправка пакета с 1 обратно от ПК от МК.
Основной цикл программы
Watchdog таймер включаем для повышения надежности
Инициализация USB
Делаем стартовый дисконект на 250 мс
Устанавливаем на вывод порт B
Разрешаем прерывания
Бесконечно опрашиваем USB порт в ожидании пакета с ПК. Также watchdog таймер сбрасываем, который перезагружает МК в случае зависания.
Прерывание по переполнению ШИМ таймера T0 - ставим высокий уровень сигнала на линиях, где это нужно, они в pwm1 и постоянно меняются
Прерывание по совпадению таймера T0 - обнуляем все экономичным для расхода тактов способом
Прерывание по переполнению шагового таймера T2. Если есть шаги для открутки и пришло время - делать их в установленном направлении или обесточить двигатель.

Биты конфигурации для ATmega16A:
CKSEL3..0=1111   SUT0..1=10   BODEN=0   BODLEVL=1   BOOTRST=1   BOOTSZ0..1=00   EESAVE=1   CKOPT=0   SPIEN=0   JTAGEN=1   OCDEN=1   LB1..2=00   BLB=0000

Тех. поддержка ответит на ваши вопросы по этой статье
phpinbox@yandex.ru
 
Регистрация
Для новых людей