УПРАВЛЕНИЕ ШАГОВЫМ ДВИГАТЕЛЕМ НА PIC16F84
Следующая программа предназначена для управления шаговым двигателем. За основу взята свободно распространяемая программа для PIC12C509, которую написал Слав Славов (Slav Slavov) из Болгарии. Программа переписана для микроконтроллера PIC16F84, добавлен фрагмент кода, фиксирующий ротор двигателя после включения питания. Шаговые двигатели имеют различные параметры, и характеризуются количеством шагов на 360°, количеством фаз (2 или 4) и т.д. Существуют двигатели с точностью 100 шагов/рад, 200 шагов/рад и другим количеством шагов на один радиан, но принцип работы у всех одинаков.
Наша программа предназначена для управления 4-фазцым двигателем, для подключения двигателя понадобится пять проводов. Двигатель может иметь либо пять выводов, если общие выводы каждой пары обмоток соединены вместе, либо шесть, если общие выводы пар выведены раздельно. Для экспериментов можно разобрать старый дисковод 5,25" и взять моторчик, перемещающий головку. При помощи тестера, или разобрав мотор, определите разводку выводов. На рисунке 3-7 показана схема включения мотора. LI, L2 и L3, L4 представляют собой пары рабочих обмоток, имеющих по одному общему выводу. Эти пары абсолютно равнозначны и, если поменять их местами, изменится только направление вращения. Направление вращения также изменится, если поменять местами выводы у одной пары.
Чтобы мотор начал вращаться (циклически перемещаться по шагам) надо организовать на его выводах определенную последовательность изменения напряжения:
Шаг
_А1_
_А2_
_В1_
_В2_
1
0
1
0
1
2
0
1
1
0
3
1
0
1
0
4
1
0
0
1
1
0
1
0
1
Таким образом, чтобы мотор начал вращаться по часовой стрелке, надо, чтобы уровни на соответствующих выводах микроконтроллера изменялись в соответствии с порядком шагов 1, 2, 3, 4, 1,.... Для обратного вращения порядок следования шагов должен быть обратным : 4, 3, 2,1,4,....
Отличительной особенностью шагового двигателя является то, что в промежутке между шагами его ротор неподвижен и зафиксирован магнитным полем катушек. Ротор может сколь угодно долго находитсья в неподвижном состоянии. Потребляемый ток почти не зависит от того, вращается ротор, или нет.
Схема включения микроконтроллера показана на рис. 1, а транзисторные ключи, управляющие током в обмотках, на рис. 2.
Рис. 1. Схема для управления шаговым двигателем
Рис. 2. Схема включения шагового двигателя
При нажатии кнопок L и R мотор вращается соответственно либо против часовой стрелки, либо по часовой стрелке. Транзисторы работают в режиме насыщения и практически не нагреваются, поэтому им не нужны радиаторы. Защитные диоды предохраняют транзисторы от пробоя выбросами обратного напряжения на обмотках, которые возникают в момент отключения тока в обмотке. Вместо транзисторов можно использовать очень распространенную микросхему, набор
ключей ULN2003A. Она может оказаться в том же дисководе, из которого вы вынули двигатель. Микросхема имеет встроенные защитные диоды.
Программа циклически опрашивает состояние кнопок и, если одна из кнопок нажата, выполняет процедуру перемещения ротора на один шаг. Если нажаты две кнопки одновременно, то кнопка вращения вправо имеет приоритет. Поскольку опрос кнопок происходит быстро, то при нажатии кнопки двигатель будет вращаться, пока вы не отпустите кнопку.
Имейте в виду, что обычные шаговые двигатели имеют относительно небольшую скорость вращения. Если менять состояние обмоток слишком часто, то двигатель может не вращаться. Поэтому в программе дважды вызывается подпрограмма задержки между обращениями к кнопкам.
Поэкспериментируйте с имеющимся у вас двигателем, изменяя величину задержки в базовом значении del программы. Программа, текст которой приведен в листинге 6, очень проста и ее работа вполне понятна из комментариев. Если будете изменять схему и подключите кнопки к порту А, не забудьте про внешние подтягивающие резисторы. Можете использовать программу обработки сенсоров из предыдущего примера.
ЛИСТИНГ 6 ; ************************************************************************* ; * программа управления шаговым двигателем * ; ************************************************************************* ; назначение выводов в схеме ; RB1(7) - кнопка вращения вправо ; RB2(8) - кнопка вращения влево ; RB4(10) - выход В2 ; RB5(ll) - выход В1 ; RB6(12) - выход А2 ; RB7(13) - выход A1 list p=16F84 #include_CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC ;*** базовые значения Left EQU 1 ; номер вывода кнопки "влево" Right EQU 2 ; номер вывода кнопки "вправо" del EQU 0xFF ; константа длительности задержки INIT_A EQU b'11111111' ; настройка порта А: все каналы на ввод INIT_B EQU b'00001111' ; настройка порта В: RB0-RB3 ввод, ; RB4-RB7 вывод count EQU 0x0C ; переменная подпрограммы задержки step EQU 0x0D ; счетчик номера текущего шага ORG 0x00 ;*** начальная инициализация clrf PORTA ; очистили выходные защелки порта А clrf PORTB ; и порта В bsf STATUS, RP0 ; включили банк 1 movlw INIT_A ; movwf PORTA ; настроили PORT A movlw INIT_B ; movwf PORTB ; настроили порт В bcf OPTION_REG,7 ; включили встроенную нагрузку bcf STATUS, RP0 ; включили банк 0 clrf step ; обнуляем переменную step clrw ; при включении фиксируем call Table ; ротор двигателя movwf PORTB ; в положении нулевого шага main call delay ; формирование задержки call delay ; (временного интервала между шагами) ;*** опрос кнопки "Вправо" и обработка нажатия Rights btfsc PORTB, Right ; если Right=0, выполнить шаг вправо goto LeftS ; иначе перейти на LeftS incf step,f ; step=step+l movlw .4 subwf step,w btfsc STATUS,C ; если step>3, clrf step ; установить step=0 movf step,w ; иначе call Table ; перекодировать номер шага в выходной ; код movwf PORTB ; выставить новые значения на выводах goto main ;*** опрос кнопки "Влево" и обработка нажатия LeftS btfsc PORTB,Left ; если Left=0, выполнить шаг влево goto main ; иначе перейти на метку main decf step,f ; step=step-1 movlw .3 btfsc step,7 ; если step<0, movwf step ; установить step=3 movf step,w ; иначе call Table ; перекодировать номер шага в выходной ; код movwf PORTB ; выставить новые значения на выводах goto main ;*** таблица перекодировки номера шага в уровни на выводах порта Table addwf PCL,f retlw b'01010000' retlw b'01100000' retlw b'10100000' retlw b'10010000' . ;*** подпрограмма формирования задержки между шагами delay movlw del movwf count loop decfsz count,f goto loop return END ; ************************************************************************* Исходник kontr_pic16f84.asm
Источник: В.С.Яценко. Микроконтроллеры MicroCHIP. Практическое руководство. Стр.249-253