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


 Шаговые двигатели достаточны распространены в устройствах, в которых необходимо добиться точного перемещения механизмов. Существует много типов шаговых двигателей, но самыми дружелюбными в плане управления являются 2-х фазные униполярные двигатели. Этот тип двигателей имеет две независимые обмотки с выводами от середины. Их можно встретить преимущественно в старой технике: принтерах, копирах, дисководах (5-и дюймовых) и еще много где.

 В зависимости от от того как соединены средние обмотки внутри, из двигателя могут выходить 5 или 6 проводов. Разницы никакой нет, все равно средние выводы обмоток соединяются вместе. Характерной особенностью шаговых двигателей является дискретность поворота ротора, тоесть если взять и покрутить вал двигателя можно ощутить как он фиксируется в определенных моментах. Это и есть шаги двигателя. При запитывании одной из половины обмоток происходит фиксирование вала двигателя в определенном положении. Если снять напряжение с этой обмотки и запитать другую, ротор повернется и зафиксируется в другом положении. Таким образом, если запитывать обмотки в определенной последовательности можно добиться вращения вала двигателя. 
 Существует несколько алгоритмов управления питанием обмоток двигателя. Самым простым является полношаговое управление, когда в любой момент времени запитана только одна из половинок обмоток. Для наглядности накидал табличку показывающую последовательность включения обмоток:



  Ротор при таком управлении принимает естественное положение относительно статора. Есть еще способ управления шаговиком в полношаговом режиме, когда одновременно запитываются две фазы, таким образом удается увеличить момент на валу на 40%. 
 Главным недостатком полношагового управления являются аццкие вибрации двигателя и малая дискретность шага, равная паспортному значению.

 Для того чтобы уменьшить вибрации и добится более плавного и точного вращения вала существует более продвинутый способ - управление в полушаговом режиме, алгоритм включения половинок обмоток приведен ниже:




 При такой работе вал двигателя за один цикл совершает половину шага и фиксируется между двумя естественными состояниями равновесия. Таким образом дискретность поворота вала увеличивается в 2 раза. 
 Есть еще способ увеличить дробленеи шага ротора двигателя - микрошаговое управление - когда обмотка не просто запитывается, а запитывается определенным током. И от отношения тока в соседних обмотках зависит положение ротора - чем больший ток течет в обмотке по отношению к соседней, тем ближе к ней смещается ротор и наоборот. Это позволяет увеличить дробление шага в десятки и сотни (!)  раз. 

 С теорией немного разобрались, теперь нужно выбрать в каком режиме будет управляться двигатель. Полный шаг слишком убог и не эффективен, микрошаг сложен, да и нужен он в основном в управлении приводом высокоточного ЧПУ станка. Поэтому крутить будем в полушаге :)
 Схема базируется на микроконтроллере attiny2313 и имеет две кнопки. При нажатии на одну вал двигателя будет крутиться в одну сторону, при нажатии другой - в другую. В качестве ключевых транзисторов выбраны КТ829, способные протащить через себя до 8 Ампер. 

 
 К клемме Udvig подключаются выводы от середин обмоток и туда же подводится напряжение для питания обмоток. Величина напряжения зависит от самого двигателя, для моего например по документации максимальный ток в обмотках 1,5 Ампера, измерив сопротивление обмоток получил 2 Ома, отсюда вывод что напряжение питания не должно превышать 3 В ну или немного больше, учитывая что запитываться будет индуктивная нагрузка.
Кстати диоды D2-D5 стоят для того, чтобы гасить скачки обратного напряжения после закрытия транзистора. Иначе есть вероятность что ЭДС самоиндукции возникающая во время выключения питания обмотки пробъет транзистор.

 Плата управления в сборе:



 Красный светодиод загорается при нажатии одной из кнопок. Разъем подключения контроллера по UART сделал опционально, на случай если нужно будет приделать управление шаговиком с компа.


Код в Bascom-AVR:



$regfile = "2313def.dat"
$crystal = 4000000


Dim S As Byte                         'эта переменная следит за номером шага двигателя

S = 1

On Int0 Knopka1                       'даем имена обработчикам внешних прерываний
On Int1 Knopka2

Config Portb = Output                 'конфигурируем порт на выход
Config Portd.5 = Output               'конфигурируем ногу для подключения светодиода
Led Alias Portd.5                     'присваиваем имя LED выводу 5 порта D

'прерывания будут генерироваться пока на ноге низкий уровень, то есть пока кнопка будет нажата
Config Int0 = Low Level
Config Int1 = Low Level

'разрешаем прерывания
Enable Interrupts
Enable Int0
Enable Int1

'основной цикл программы, просто ждем прерывания
Do

Loop



Knopka1:                            'обработчик прерывания первой кнопки

Led = 1                             'зажигаем светодиод        

Incr S                              'увеличим номер шага

 If S = 9 Then                      'максимально возможный номер шага = 8
  S = 1
 End If

Select Case S                       'выбираем какие обмотки включать в зависимости от номера шага

Case 1 : Portb = &B00000001
Case 2 : Portb = &B00000011
Case 3 : Portb = &B00000010
Case 4 : Portb = &B00000110
Case 5 : Portb = &B00000100
Case 6 : Portb = &B00001100
Case 7 : Portb = &B00001000
Case 8 : Portb = &B00001001

End Select

Waitus 1000                                    'задержка между шагами

Led = 0                                        'гасим светодиод

Return



Knopka2:                                      'обработчик прерывания второй кнопки

Led = 1                                       'зажигаем светодиод        

Decr S                                        'тут все тоже самое, только в обратном направлении

 If S = 0 Then                                'минимально возможный номер шага = 1
  S = 8
 End If

Select Case S

Case 1 : Portb = &B00000001
Case 2 : Portb = &B00000011
Case 3 : Portb = &B00000010
Case 4 : Portb = &B00000110
Case 5 : Portb = &B00000100
Case 6 : Portb = &B00001100
Case 7 : Portb = &B00001000
Case 8 : Portb = &B00001001

End Select

Waitus 1000

Led = 0                                       'гасим светодиод

Return

End

 

 Изменяя величину задержки между шагами, можно в больших пределах регулировать скорость вращения вала. При выбранной мной задержке в 1000 мкс с шаговиком имеющем 200 шагов на оборот (400 полушагов) скорость вращения получается примерно 2,5 оборота в секунду.

Скачать файлы к проекту


UPD: Здесь допилил программу, теперь стало возможным управление шаговым двигателем с компьютера.



Прошивка занимает 30% памяти 2313, так-что для модернизации места хватит. Тут дело в другом, для обработки кнопок я использовал внешние прерывания, которых в этом микроконтроллере всего 2. Поэтому если добавлять еще кнопок, нужно переписывать всю программу, примененный алгоритм не пойдет.

Я понимаю что лучше, но хотелось компактно, но все же: нет прошивки??? или в 2313 не влезет кекс???

Лучше возьмите вторую тиньку и сделайте второй такой же контроллер на вторую ось.

Здравствуйте, у меня вопрос к автору статьи: а можете прошивку и добавить еще один шаговик к этому МК, хочу приспособить к видеокамере (улица), чтоб влево-вправо, вверх и в низ.Я так думаю к выводам 16,17,18,19, ну и 2 кнопки.


Просто нужно завести переменную которая будет следить за тем сколько шагов уже сделал вал, если кол-во достигло нужного значения останавливаем двигатель.
Вот как то так
Код
$regfile = "2313def.dat"
$crystal = 4000000

Dim P As Word
Const F = 1000                    'этой константой задаем кол-во полушагов которые сделает двигатель при нажатии на кнопку

Dim S As Byte                         'эта переменная следит за номером шага двигателя

S = 1

On Int0 Knopka1                       'даем имена обработчикам внешних прерываний
On Int1 Knopka2

Config Portb = Output                 'конфигурируем порт на выход
Config Portd.5 = Output               'конфигурируем ногу для подключения светодиода
Led Alias Portd.5                     'присваиваем имя LED выводу 5 порта D

'прерывания будут генерироваться пока на ноге низкий уровень, то есть пока кнопка будет нажата
Config Int0 = Low Level
Config Int1 = Low Level

'разрешаем прерывания
Enable Interrupts
Enable Int0
Enable Int1

'основной цикл программы, просто ждем прерывания
Do

Loop

Knopka1:                            'обработчик прерывания первой кнопки

Led = 1                             'зажигаем светодиод

Do
Incr P

Incr S                    'увеличим номер шага

  If S = 9 Then                      'максимально возможный номер шага = 8
   S = 1
  End If

Select Case S                    'выбираем какие обмотки включать в зависимости от номера шага
Case 1 : Portb = &B00000001
Case 2 : Portb = &B00000011
Case 3 : Portb = &B00000010
Case 4 : Portb = &B00000110
Case 5 : Portb = &B00000100
Case 6 : Portb = &B00001100
Case 7 : Portb = &B00001000
Case 8 : Portb = &B00001001
End Select
Waitus 1000                    'задержка между шагами

Loop Until P = F                    'когда колво шагов станет равно установленному значению двигатель остановится
P = 0
Led = 0                    'гасим светодиод
Gifr = 64
Return

Knopka2:                    'обработчик прерывания второй кнопки

Led = 1                    'зажигаем светодиод

Do
Incr P

Decr S                    'тут все тоже самое, только в обратном направлении

  If S = 0 Then                    'минимально возможный номер шага = 1
   S = 8
  End If

Select Case S

Case 1 : Portb = &B00000001
Case 2 : Portb = &B00000011
Case 3 : Portb = &B00000010
Case 4 : Portb = &B00000110
Case 5 : Portb = &B00000100
Case 6 : Portb = &B00001100
Case 7 : Portb = &B00001000
Case 8 : Portb = &B00001001

End Select

Waitus 1000
Loop Until P = F
P = 0
Led = 0                    'гасим светодиод
Gifr = 128
Return

End

Не силен в программировании, а сделать контроллер хочется :)
Подскажите плиз, как правильно изменить программу, чтоб при нажатии одной кнопки двигатель делал определенное кол-во шагов и останавливался ? А при нажатии другой кнопки, возвращался в исходную позицию ?


В управлении биполярными шаговиками важна не столько программная, сколько аппаратная часть. Там же необходимо в каждой из обмоток менять направление тока, поэтому ищите примеры мостовых схем. Или можно, а даже нужно, использовать спец микросхемы типа L298, на входе у нее такой же алгоритм управления, как в этом примере. Я собирал схему с одного известного форума на микросхеме ir2104 (схема гуглится по запросу ir2104+irfz44).

exersizze ,а у Вас нет наработок по подключению биполярных шаговиков в Bascom?

дописал в шапку
Config Pind.2 = Input
Config Pind.3 = Input
Shag1 Alias Pind.2
Shag2 Alias Pind.3

потом в тело
Do

If Shag1 = 1 And Shag2 = 1 Then
Portb = &B00000000
End If
Loop

Это если добавить отключение обмоток в главном цикле? По идее пока кнопка нажата, обнуление порта не должно происходить, там все время генерируется прерывание. Хотя могу ошибаться, надо пробовать. А чем мешает постоянное включение одной обмотки?

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

Так и было задумано, в схемах упрашления шаговыми двигателями есть такое понятие как ток удержания, тоесть на одну из обмоток постоянно идет ток, тем самым держа якорь в одном положении - от прокручивания. В правильных схемах, этот ток намного меньше рабочего, но целью было показать принцип работы а не собирать готовый контроллер ШД
Если вам это не нужно то можно в главном цикле написать
Code
Do
Portb = &B00000000
Loop

и все теперь когда кнопки не нажаты, весь порт находится в выключенном состоянии

pchela5, что конкретно дописать надо в код, можете код привести?

Навскидку - исправить можно следующим образом - в основном цикле сделать проверку - если кнопки ненажаты, то обнулять выходной порт

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

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

Можно изменить код из статьи. Нужно будет заместо обработок кнопок int0 и int1 (knopka1 и knopka2) сделать обработку rc5 команд. А в цикле Do-Loop сделать прием этих команд.

Подскажите пожалуйста чтобы крутить шаговик с пульта нужно полностью новую программу писать или эту изменить? Зарание спасибо.

Ну если пока никто не откликнулся.., мало же кому интересно заниматься решением ваших задач:) Могу только посоветовать самому разобраться, информация для этого вся имеется.

Я так понимаю никто не поможет?

Здравствуйте. Я в написании программ ДЕРЕВО. Очень надо подключить ИК к сему девайсу. Зарание благодарен.

Надо было подождать с радиоуправлением-интересный гибрид бы вышел
Вижу получил уже посылку с китая?)) как успехи?

Была у меня мысля сдружить эту плату вот с этим http://avrproject.ru/publ/protokol_rc5_bascom_avr/1-1-0-30 так пока руки не дошли, осваиваю радиоуправление на nrf24l01

Как насчет ИК управления. Кто ни будь пробовал?


Транзистор здесь подключен по ключевой схеме с общим эмиттером, тоесть к эмиттеру подключены две земли (напряжения питания логики и напряжения питания двигателей). Первоначально при отсутствии напряжения на базе транзистор закрыт, и ток через коллектор-эмиттер не идет. При подаче на базу транзистора напряжения, транзистор открывается и начинает пропускать ток. А резистор в базе служит токоограничителем, чтобы не спалить ножку МК.

Виктор, спасибо за прекрасную статью. Спаял транзисторные ключи, проверил на лампочках 12 вольтовых. Ключи работают. Напряжение питания моего двигателя 12 вольт, напряжение питания МК - 5вольт.
Не совсем понятно, каким образом пойдет сигнал от МК. Понятно, что нужно просто подключить ножку через резистор к базе. Тогда напряжение с ноги МК поступит на землю 12 вольтовой цепочки? Я правильно понял что, цепочки питания МК и двигателя должны быть изолированны друг от друга? Спасибо.

нет, не забыл, все заработало отлично! спасибо, за помощь!


а какая разница программатору какой файл зашивать в память микроконтроллера? его дело загрузить этот файл и все, если не грузит ищите проблему в проггере.
после кроны стабилизатор на 5 вольт не забыли поставить?