Управление шаговым двигателем по 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 =)

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


Взято с: avrproject.ru


Категория: AVR
Метки:

Написать коментарий

*
= 3 + 2

Добавить изображение

Последние статьи