Главная » Статьи » Проекты

Управление шаговым двигателем по UART


  Представляю вашему вниманию доработанную программу управления униполярным шаговым двигателем к контроллеру описанному в прошлой статье.



 Теперь контроллер способен принимать команды по UART и делать необходимое количество шагов в нужном направлении. Направление вращения и необходимое количество шагов задается одной командой. Например чтобы сделать 300 шагов в одну сторону отправляем команду +300. Если требуется вращать в другую сторону, отправляем "-" и количество шагов, все просто. 
Также как и в прошлой версии программы, предусмотрено вращение двигателя кнопками.



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


'заводим переменные
Dim S As Byte                             'эта переменная следит за номером шага двигателя
Dim A As Word                             'хранит количество сделанных шагов
Dim N As Word                             'хранит количество полушагов которые необходимо сделать
Dim T As String * 6                       'хранит команду пришедшую по UART
Dim Sign As String * 1                    'хранит направление движения
Dim M As Byte                             'хранит количество знаков в команде пришедшей по UART
Dim Char As String * 5                    'хранит числовое значение необходимых шагов

S = 1                                     'нумерация шагов начинается с единицы


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


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


On Urxc Command                           'даем ссылку на обработчик прерывания по UART
On Int0 Knopka1                           'даем имена обработчикам прерываний от кнопок
On Int1 Knopka2


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


Print "Enter direction (+,-) and value step"


'****** ОСНОВНОЙ ЦИКЛ ПРОГРАММЫ ******

Do
'проверяем состояние переменной Sign
'в зависимости от ее содержимого выполняем соответствующий код

 If Sign = "+" Then                       'если в ней плюс
  Led = 1                                 'зажигаем светодиод
  Gosub Plus                              'выполняем подпрограмму с меткой plus
  Led = 0                                 'гасим светодиод

 Print "OK!"
 Print ""
 Print "Enter direction (+,-) and value step"

 End If

 If Sign = "-" Then                       'если в ней минус
  Led = 1                                 'зажигаем светодиод
  Gosub Minus                             'выполняем подпрограмму с меткой minus
  Led = 0                                 'гасим светодиод

 Print "OK!"
 Print ""
 Print "Enter direction (+,-) and value step"

 End If

Loop



'****** здесь крутим двигатель в одном направлении ******

Plus:

   Do

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                               'задержка между шагами

Incr A                                    'считаем пройденные шаги

  Loop Until A = N                        'если прошагали сколько нужно выходим из цикла

'обнуляем переменные
A = 0
N = 0
Sign = "0"


Return                                    'возвращаемся в главный цикл программы



'****** а здесь крутим двигатель в обратном направлении ******

Minus:

  Do

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

Incr A

  Loop Until A = N

'обнуляем переменные
A = 0
N = 0
Sign = "0"

Return                                    'возвращаемся в главный цикл программы



'****** обрабатываем команду пришедшую по UART ******

Command:

Input T                                   'пришедшая команда

Sign = Left(t , 1)                'вытащим первый символ, отвечающий за направление движения
M = Len(t)                        'узнаем сколько символов в пришедшей команде
M = M - 1                         'убавляем на 1, так как первый символ хранит только направление
Char = Right(t , M)               'вытаскиваем из команды все символы кроме первого символа
N = Val(char)                     'преобразуем строку в числовую переменную
N = N * 2                         'теперь мы знаем сколько нужно сделать полушагов (N)

Return


'****** обработка нажатия кнопок ******

 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


 При включении контроллер выдаст в COM-порт сообщение о вводе направления движения (+ или -) и количестве шагов. Отправляем необходимую команду и контроллер начнет вращать вал двигателя, после того как совершено необходимое количество шагов, контроллер выдаст команду "OK!" и снова выдаст комманду на ввод данных:



 
 Для связи с COM-портом компьютера использовал свою отладочную плату с мегой32, так как на ней установлен конвертер уровней max232:








Осталось накидать интерпритатор G кода и получится home-made система управления для ЧПУ станка покруче чем на ТМ7 =)

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


Категория: Проекты | Добавлено: 23.05.2011
Просмотров: 32911 | Комментарии: 42 | Теги: uart, шаговый двигатель, attiny2313 | Рейтинг: 4.8/6
Всего комментариев: 421 2 »
42 Vitek1977   (07.02.2014 17:48)
у Романа 190р. а так же можно за 400 купить готовый в россии на этой микросхеме. дороботка шла под названием ТВ6600.(себе такие приобрел, запас по току дело хорошее) и далее ТВ6064. хотя на ТВ6560 народ до 30 кило движки крутят смело. из всего скакзанного как и ниже, имею ввиду что на самодельных можно смело ставить крест, и относиться к покупным как к тому же семейству интерфейства 232. увы, я не нащел ни одного доступного самодельного контроллера, достойного повторения,(это мое мнение)создавая сам я сразу понял что далеко не все так просто, резонанс, индукция и прочая белиберда у всех двигателей разная. переключать логикой обмотки, это разве что в позновательных целях.

41 pchela5   (07.02.2014 12:28)
Ну почему же - даже на бейсике есть микрошаг, но рассыпухи много и геморроя тоже. А вот контроллер на 6560 подвергся доработке согласно даташитам и инфы с разных форумов.

40 exersizze   (06.02.2014 22:07)
Ага, микрошаг на рассыпухе не спаяешь, благо появились спецмикросхемы типа TB6560. Но у нас  отдельно эта микросхема  стоит столько же как готовый контроллер  на ebay или ali. )) впрочем как и всегда с подобными вещами...

39 pchela5   (06.02.2014 10:12)
Поддерживаю предыдущего комментатора. Тоже планировал спаять и т.п., но посчитал стоимость комплектухи, время и результат на выходе - и отказался от данной затеи. Купил контроллер на "красной" плате - кто в теме, тот поймет. Единственное, пришлось его доработать: ощущение, что его делали 2 китайца - один грамотный, другой экономный. Кому интересно - в личку.

+1   Спам
38 Vitek1977   (05.02.2014 14:02)
пробовал сам делать и повторять схемы контроллеров шаговиков, но успокоился только когда купил готовый, там и полная поддержка шим и микрошаг, и контроллеры эти разрабатывают не на "коленке" и цена очень доступная, от всех технологий новых даже движки с принтера чудеса творят. новое поколение контроллеров так вообще и определяют пропуск, с резонансом на ты. смысл сего что если нужно нормальное управление, проще купить. хотя бы даже саму микросхему, еще дещевле будет чем AVR плюс 8 полевиков.

+1   Спам
37 bec123   (04.02.2014 19:11)
valera18 спасибо за помощь и ссылочьку очень полезная информацыя . сегодня в книжном магазине нашол занемательную книжонку называется {123 эксперимента по робототехнике}автор М.Предко.
В ней тоже написано немного про шаговики и схемки подключения показаны.

36 Valera18   (04.02.2014 15:16)
Для bec123

Приводы 17HS8401 (NEMA17) - это биполярный шаговый двигатель, подключаются так:
Red: A+
Green: A-
Yellow: B+
Blue: B-
Для данной схемы не подойдёт.

В интернете можно найти описание принципа работы биполярного шагового двигателя.
Если я не ошибаюсь в Proteus модель называется Motor-bistepper, поэтому можете попробовать поработать с данным двигателем.

Транзисторы можете заменить на полевые транзисторы (мосфеты). Для одного шагового двигателя нужно 8 штук мосфетов.
Ещё нужен хороший блок питания...

Первый попавшийся сайт, тут можете почитать про двигатели:
http://www.russianelectronics.ru/leader-r/review/40498/doc/47912/

35 bec123   (02.02.2014 13:03)
добрый день у меня 4 провода на шаговике марка 17HS8401 1.8 шаг , 1.8А , пожалуйста подскажите как мне его подключить к вашей схеме и можно ли заменить транзисторы на мосфеты .

34 meo   (23.11.2012 03:05)
Чтобы подключить светодиоды для индикации работы UART, достаточно включить их через NPN транзистор (с резистором 10кОм в базе), или при таком включении светодиод будет гореть все время, а гаснуть только при передаче данных? Извиняюсь за глупый вопрос :)

33 exersizze   (20.04.2012 01:08)
Для использования понижения тока нужно управлять движком с помощью ШИМ, а вообще да, если есть серва на ней проще. Ну а программа вполне реализуема.

32 tpru   (20.04.2012 01:01)
про подключение UART = здорово!
а про угол есть мысли?
допустим, диапазон принимаемых значений может быть от 0 до 180. именно они и появляются в UART несколько раз в секунду - такое в принципе реализуется? а режим удержания как реализуется? или проще такое на серве сотворить?

31 exersizze   (19.04.2012 22:05)
Энергопотребление микроконтроллера единицы миллиампер, а мотор может и несколько ампер потреблять если не организовать режим удержания (снижение тока в обмотках во время простоя двигателя)
К юарту можно цеплять сколько угодно, главное чтобы ток был не выше допустимого, ну и естественно программа должна быть написана так, чтобы одновременное обращение к нескольким устройствам не вызвало глюков.

30 tpru   (19.04.2012 11:48)
два вопроса:
можно ли переделать прошивку так, чтобы она считывала строчки по UART со значениями через таб, брала, к примеру, данные из третьего столбика и моментально поворачивала стрелку на этот угол (по сути нужен стрелочный указатель к спидометру). какое будет ориентировочное энергопотребление устройства и мотора в таком режиме?

и второе: можно ли к одному источнику UART подключить параллельно два приемника?

29 exersizze   (13.03.2012 13:12)
Целью не было делать контроллер для станка с числовым программным управлением, поэтому эта проблема никак не решается)
Если нужен контроллер для этих целей, то можно написать интерпритатор G-кода, чтобы в контроллер можно было отправлять координаты и он бы сам управляя двигателями, плавно подводил инструмент к нужой точке. Но опять же встает вопрос о движении по сложной траектории, и тут либо включать матан, либо (что самое простое) гнать координаты каждой точки, над которой должен пройти инструмент. Тогда придется отказаться от поддержки упрощающих команд стандартного Г-кода (круговая итерполяция например). Но имхо это того не стоит.
Из известных мне подобных проектов самый продвинутый выложен здесь http://it-en.ru/cnc/

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

27 trim   (22.01.2012 15:03)
мне очень интересно связать пару контроллеров чтоб один управлял другим например один счетает растояние второй управляет шагами и направлением соответственно ,робота например вот ,

26 exersizze   (21.01.2012 21:00)
можно добавить в управляющую команду дополнительный параметр например так: +2001000
в подпрограмме дополнительно вытаскиваем 4 правые числа и присваиваем это значение переменной (например А), а в подпрограмме переключения обмоток пишем Waitms A. И таким образом имеем возможность быстро менять задержку между полушагами

25 trim   (21.01.2012 19:15)
а как программно сделать регулировку задержки шагов через кнопки или по уарт

24 trim   (10.01.2012 21:41)
буду делать отладочную плату светодиот горит прерывания есть на порту в0

23 trim   (10.01.2012 21:15)
ща попробую написать программу мигания светодиодом без кнопок

22 trim   (10.01.2012 20:46)
проверил есть низкий уровень при нажатии я ж написал что не все просто работают как надо

21 exersizze   (10.01.2012 20:17)
Если уверен что порты микроконтроллера живы, проверь кнопки. Я с таким столкнулся когда паял свои кнопки спирто-канифольным флюсом. После запайки кнопки перестали замыкать, видимо флюс попадает на мембрану и покрывает ее тонкой токонепроницаемой пленкой после высыхания. Убил на это много времени пока понял проблему. Кнопки после этого только в утиль..

20 trim   (10.01.2012 19:56)
вот залочил две тини терь знаю что незя ))))) ,не получается прошить на портах такое твориться подскажите значит на РВ0 все нормально сигнал идет все ок дальше на РВ1 сигнал проходит только с одной кнопки ,РВ2 вообще не реагирует на нажатие ,РВ3 опять реагирует только на одну кнопку что делать ума не приложу верификация кода проходит успешно значит програматор пишет нормально ,а вот почему так программа работает подскажите

19 exersizze   (09.01.2012 14:07)
частота тактирования в программе 4 мгц, а зачем в настройки баскома лезть?

18 trim   (08.01.2012 21:33)
пишет зараза чип пустой по адрессу 00000

17 trim   (08.01.2012 21:17)
чисто для этой программы
имеется ввиду

16 trim   (08.01.2012 21:16)
Привет тут такое горе помогите плиз осваиваю программирование не могу разобраться с баскомом настройки и все такое там фузы на до настраивать или нет и еще где можно прочитать чисто про настройки в баскоме

15 exersizze   (06.01.2012 16:46)
Hoksmur, с этим разобрался когда возился с дальномером HC-SR04
http://avrproject.ru/publ....-1-0-51

14 Hoksmur   (05.01.2012 16:35)
По измерению длительности импульсов - по фронту включаем таймер с подсчётом импульсов от тактового генератора, по спаду стопорим, считываем, анализируем. Я так делал. В частотомерах так длительности измеряют.

13 amv2000   (18.10.2011 22:09)
Во во поглядываю на казусе осциллограф собирают двухлучевой ... ох надо разориться biggrin

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






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

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

   Нарисуй свою схему прямо сейчас!
   Изготовление печатных плат   https://easyeda.com/order
авторизация
Логин:
Пароль:
Комментарии
Сетевой диммер 220V на микроконтроллере
09.12.2016 - vakulyuk:
Спасибо) Я принцип действия понял, а вот откуда взялась именно цифра 195 не поня...
Сетевой диммер 220V на микроконтроллере
09.12.2016 - exersizze:
pchela5, ну так это в военное, а у нас в мирное время все примерно)) Наше...
Сетевой диммер 220V на микроконтроллере
09.12.2016 - pchela5:
> Полуволна в нашей электросети по времени длится примерно 10 мс

...
Сетевой диммер 220V на микроконтроллере
09.12.2016 - exersizze:
Чтобы понять откуда взялась цифра 195 надо сначала въехать в принцип работы: ког...
Сетевой диммер 220V на микроконтроллере
09.12.2016 - vakulyuk:
А почему минимальный накал при 195? Насколько минимум можно занизить Wt?
Когда не хватает ног. Часть 2. Сдвиговый регистр 74HC595
08.12.2016 - exersizze:
yorx выдалось немного свободного времени, проверил в симуляторе. Проблема...
Логгер температуры 2.0
05.12.2016 - Evgeny6873:
Хотел повторить схему и долго ждал дисплей, два раза заказывал с Китая, пришел. ...
Когда не хватает ног. Часть 2. Сдвиговый регистр 74HC595
01.12.2016 - yorx:
Доброго времени суток, exersizze попробовал Ваш код все равно не работает как на...
Помни об усадке!
30.11.2016 - pchela5:
Автомобильные никакие не лезут?


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


Prusa i3

Prusa i3 от 12500 р.



Rostoсk

Rostock от 15000 р.