
Представляю вашему вниманию доработанную программу управления униполярным шаговым двигателем к контроллеру описанному в прошлой статье.
Теперь контроллер способен принимать команды по 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
Последние статьи
- Лучшая практика проектирования при размещении компонентов печатной платы
- Android 6.0 на lancer X
- Простой усилитель мощности класса АВ своими руками.
- Двухтактный ультралинейный ламповый УНЧ на EL84 (6П14П).
- Люксметр на ATmega8 и цифровом датчике BH1750
- Контроллер для светодиодной ленты с ИК управлением
- Самодельный LED светильник на основе ИК датчика HC-SR501
- Простой усилитель низкой частоты на TDA7377 и NE5532
- Простейший звонок с двумя мелодиями
- LED Cube 8x8x8 на Arduino с RTC