УПРАВЛЕНИЕ ШАГОВЫМ ДВИГАТЕЛЕМ НА 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