Главная » Статьи » Проекты |
Управление шаговым двигателем по 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-портом компьютера использовал свою отладочную плату с мегой32, так как на ней установлен конвертер уровней max232:
| |
Просмотров: 46798 | Комментарии: 42
| Теги: |
Всего комментариев: 42 | 1 2 » | |||||||||||||||||||||||||||
| ||||||||||||||||||||||||||||
1-30 31-42 | ||||||||||||||||||||||||||||
авторизация
рубрики
Проекты [46] |
Как подключить [32] |
Инструменты [3] |
Полезная информация [18] |
Объявления [3] |
метки