Главная » Статьи » Как подключить

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

 

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

Категория: Как подключить | Добавлено: 12.05.2011
Просмотров: 93700 | Комментарии: 74 | Теги: контроллер, шаговый двигатель, attiny2313 | Рейтинг: 4.4/11
Всего комментариев: 741 2 3 »
0  
74 exersizze   (06.04.2016 21:49)
А зачем вам в протеусе мотор?

73 skydog   (06.04.2016 20:20)
Я новичек. Как правильно подсоединить в схеме с протеусом к мотору? Кто-то может скинуть рабочую схему?

0  
72 exersizze   (05.08.2015 08:56)
Stim, должно хватить, сейчас код занимает 30% памяти, с использованием дисплея (знакосинтезирующего 16х2) съедается еще процентов 20.

71 Stim   (04.08.2015 13:41)
Спасибо за советы. Нашел человека с моей работы который может помочь собрать контроллер, он оказывается тоже на этом сайте частый гость. Будем собирать с LCD дисплеем. Скажите а если добавить энкодер, не придется ли менять микроконтроллер на другой?

0  
70 exersizze   (04.08.2015 00:08)
Согласен, без дисплея будет не информативно настраивать. Регулировка или энкодером/кнопками, или переменным резистором(потребуется сменить камень, но реализация упрощается существенно)

+1   Спам
69 sany2   (03.08.2015 16:57)
Если нужно регулировать вручную,надо бы ещё дисплей приколхозить

68 Stim   (03.08.2015 12:02)
Благодарю за внимание. После двигателя еще будет стоять редуктор, но его еще предстоит найти. Скорость будет зависеть от передаточного числа, поэтому хотелось бы чтобы в контроллере имелась возможность вручную менять скорость вращения.

0  
67 exersizze   (03.08.2015 08:19)
Stim, а с какой скоростью надо чтобы вал вращался?

66 sany2   (02.08.2015 13:55)
Waitus 1000 -задержка между шагами.Изменяйте задержку.

65 Stim   (02.08.2015 13:51)
Спасибо за наглядный пример, все очень толково написано!
Я увлекаюсь астрономией, люблю наблюдать в телескоп за звездным небом и делать фотографии. Но на больших выдержках, из-за вращения земли, фотографии часто получаются смазанными. Хотелось бы решить эту проблему путем автоматического поворота телескопа вслед за звездами, для этого прикинул механику... дело остановилось за исполнительным устройством. Ваша схема как нельзя лучше подходит для этого, но нужно чтобы мотор делал один шаг (полушаг) через задаваемый промежуток времени. Сможете помочь?

64 pchela5   (20.11.2013 16:24)
to Vitek1977
Есть пару готовых и работающих решений, написанных на бейсике: первый на меге 16 на три оси - но там на мелкие моторы рассчитана схемотехника и на униполярный двигатель. Гуглить как hCNC3+. Второй - разработка на тиньке 2313 - микрошаг и т.п. - гуглить как Mardus-Kreutz - там уже серьезней все, но при цене набора на ось на тошибовской микрухе под 300 рублей проще наверное будет купить его у китайцев.
PS Микрухи ко мне с Китая не доехали, продаван возвращает деньги - может и попробую сделать данный вариант.

63 exersizze   (19.11.2013 22:35)
На второй картинке показано схематично расположение обмоток. Остается только прозвонить свой двигатель и найти средние и крайние выводы (между любым крайним и средним выводами сопротивление будет в два раза меньше, чем между двумя крайними). Если с первого раза не удалось правильно подключить (вал двигателя крутится туда-сюда) - меняем местами крайние выводы на одной из обмоток.

62 Vitek1977   (09.11.2013 21:09)
спасибо за совет, мало мальски посчитал, для надежной работы не хватит 16 мГц на одном камне если делать.

61 exersizze   (09.11.2013 19:21)
Ну я бы взял на каждый канал по отдельной микрухе, так хотябы сигналы могут идти параллельно, а не по очереди для каждой из осей. Ну и только с использованием прерывания.
А по скорости думаю 12кГц осилит, когда тестировали частотомер на меге то 20 кГц брало в легкую http://avrproject.ru/publ/capture_timer1_avr/1-1-0-24

60 Vitek1977   (09.11.2013 16:37)
входной сигнал планируется до 12 кГц на каждую ось

59 Vitek1977   (09.11.2013 14:27)
хочется давненько собрать станочек чпу, но все как то не добирался. работал на таких станках 13 лет. было и издевательство над оборудованием. когда фрезерный высотой метра в 4 рисовал и сверлил мне платку 100*100.:))) но производство похерили. а платки делать охота да и че нить пообрабатывать. пока все только в разработке, зима длинная, хочу заняться. и вот суть вопроса... ваше мнение уважаемые. собрать степ-дир контроллер трех осевой на одном кристалле. 8я или 16 мега. из-за наличия необходимых пинов, с тактовой частотой 16мгц. использовать без прерывания, на сколько хватит скорости камня, или лучше на каждый канал отдельную микруху?

58 pchela5   (28.10.2013 11:02)
Ну хвастать пока рано, да и особого результата я не ожидаю - собираю из "говна и палок" © пробный вариант - руку надо набить без особого ущерба для бюджета. Механика в принципе готова, посылка с микрухами из Китая идет. Весь бюджет, не считая нескольких инструментов: держателя для дрели, струбцин, регулируемой развертки, сверел и пилок, составил, наверное, не более 3000 в итоге (потому что все остальное - дрель, болгарка, лобзик и т.д. и т.п. было в наличии). Шаговики подарили советские с консервации, часть направляющих Y, Z - из принтеров, по оси Х - с копиров линейные, втулки и ходовые гайки из капролона + держатели осей - выточили/отфрезеровали на заводе. В качестве материала - оргстекло 8 мм с 17 дюймовых мониторов - 5 штук. В остальном - пообщаемся через аську.

57 exersizze   (27.10.2013 21:38)
pchela5, похвастаешь тем что получилось в итоге? Давнишняя страсть к чпу-строительству не дает покоя  biggrin лет так 5 назад собирал фрезер из дсп на принтерных валах и мебельных направляющих. Получилось конечно в итоге так себе, поэтому до сих пор взращиваю идею на более серьезный проект, с нормальными направляйками и швп.

56 pchela5   (25.10.2013 14:30)
>> Как реализовать в программе зацикленный поворот, например, от 0 до 120 градусов и обратно , так сказать включение и отключение цикла по кнопке?

Надо знать параметры шаговика. ДШИ, например, имеет 200 шагов на полный оборот - 1,8 градуса. На 120 градусов, соответственно, надо 67 оборотов - организовываем цикл - выставлем ногу DIR в 1, на каждом шаге дергаем ногу STEP. Потом выставляем DIR в 0 и снова шагаем.

Как то так:

DO

Toggle DIR

For i=0 to 66

set STEP

waitms 100

reset STEP

waitms 100

next i

loop

PS Прочитал что написал и понял, что данная схема работает не так. Т.к. я счас пытаюсь сделать ЧПУ, то писал я для готовой схемы с управлением STEP/DIR - например связка L297 + L298

Тут тоже самое, только в основном цикле надо прогонять еще один цикл для кручения вала ну а потом крутить в другую сторону.

55 belcof   (22.10.2013 18:40)
Спасибо за статью! Помогите с вопросом. Как реализовать в программе зацикленный поворот, например, от 0 до 120 градусов и обратно , так сказать включение и отключение цикла по кнопке?

54 Oleg-galaxy   (07.10.2013 19:00)
Собрал в железе, работает без нареканий. Можно ли перекомпилировать проект под мегу8 или 48?

53 exersizze   (07.10.2013 09:07)
Нормально, у меня в протеусе тоже делает только один шаг. В железе будет крутиться постоянно. 
Фьюзы на частоту 4 МГц от внутреннего RC. Waitus может меняться в диапазоне от 1 до 65535

52 Oleg-galaxy   (06.10.2013 21:31)
В протеусе что-то не работает, при нажатии кнопки делает только один шаг, а должно как я понимаю крутиться постоянно, или так и должно быть. В каких пределах можно регулировать Waitus? Как выставить правильно фьюзы?

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

50 vpashko   (18.08.2013 14:22)
Я понимаю что лучше, но хотелось компактно, но все же: нет прошивки??? или в 2313 не влезет кекс???

49 exersizze   (18.08.2013 12:47)
Лучше возьмите вторую тиньку и сделайте второй такой же контроллер на вторую ось.

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

47 terfree   (23.05.2013 17:30)
Спасибо огромное !

46 exersizze   (22.05.2013 22:20)
Просто нужно завести переменную которая будет следить за тем сколько шагов уже сделал вал, если кол-во достигло нужного значения останавливаем двигатель.
Вот как то так
Код
$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

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

1-30 31-60 61-74
Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]






   EasyEDA:  бесплатный редактор схем

   ✓ Создание схем
   ✓ Возможность симуляции
   ✓ Быстрое создание печатных плат
   ✓ Интуитивно понятный интерфейс

   Нарисуй свою схему прямо сейчас!
   Изготовление печатных плат   https://easyeda.com/order
авторизация
Логин:
Пароль:
Комментарии
Когда не хватает ног. Часть 2. Сдвиговый регистр 74HC595
08.12.2016 - exersizze:
yorx выдалось немного свободного времени, проверил в симуляторе. Проблема...
Логгер температуры 2.0
05.12.2016 - Evgeny6873:
Хотел повторить схему и долго ждал дисплей, два раза заказывал с Китая, пришел. ...
Когда не хватает ног. Часть 2. Сдвиговый регистр 74HC595
01.12.2016 - yorx:
Доброго времени суток, exersizze попробовал Ваш код все равно не работает как на...
Помни об усадке!
30.11.2016 - pchela5:
Автомобильные никакие не лезут?
Помни об усадке!
29.11.2016 - AlekS:
Виктор, спасибо.
С заменой транса в зиму, перестройка не комельфо) Валяет...
Управляем микроконтроллером с ПК по UART
29.11.2016 - exersizze:
Михаил, для работы с инфракрасными датчиками и диодами есть команды RC5SE...
Управляем микроконтроллером с ПК по UART
29.11.2016 - Михаил:
Всем привет.
Подскажите как переменную S передать по инфракрасному каналу...
Помни об усадке!
29.11.2016 - pchela5:
> Если ленту светодиодную порезать и соединить последовательно
Только ...
Когда не хватает ног. Часть 2. Сдвиговый регистр 74HC595
29.11.2016 - exersizze:
yorx, вывод Q7 ' первой микросхемы соединен с DS второй микросхемы? С...


Лучшие цены на 3D принтеры
успей сделать себе подарок к Новому Году! ;)


Prusa i3

Prusa i3 от 12500 р.



Rostoсk

Rostock от 15000 р.