Контроллер шагового двигателя

Схема


ПБМГ-200-265
Тип двигателя: Шаговый, униполярный.
Угол поворота за один шаг: 1.8 градуса.
Количество шагов на полный оборот вала: 200.
Количество выводов: 6.
Количество обмоток: 2 со средней точкой.
Напряжение питания: 12В.
Сопротивление обмоток: 70Ом.
Потребляемый ток: 0,17А.

Обозначение выводов шагового двигателя
Черный: Общий
Белый: Общий
Красный: 1
Желтый: 2
Зеленый: 3
Синий: 4

Программа управляет выводами порта и формирует на них сдвиговую последовательность импульсов.

Эта последовательность приведена в табл.1 и табл.2. Более мощный режим табл.3 и табл.4 
Таблица 1
№ шага DO D1 D2 D3
1 1 0 0 0
2 0 1 0 0
3 0 0 1 0
4 0 0 0 1
Таблица 3
№ шага DO D1 D2 D3
1 1 1 0 0
2 0 1 1 0
3 0 0 1 1
4 1 0 0 1
Таблица 2
№ шага DO D1 D2 D3
1 0 0 0 1
2 0 0 1 0
3 0 1 0 0
4 1 0 0 0
Таблица 4
№ шага DO D1 D2 D3
1 0 0 1 1
2 0 1 1 0
3 1 1 0 0
4 1 0 0 1
В табл.1 показана последовательность импульсов необходимая для вращения двигателя влево, а в табл.2 для вращения вправо.
Изменение скорости осуществляется путем уменьшения и увеличения паузы между импульсами.
Задержка (x) между импульсами изменяется следующим образом:
8 скорость = x
7 скорость = x*2
6 скорость = x*3
5 скорость = x*4
4 скорость = x*5
2 скорость = x*6
1 скорость = x*7
Разбиение на 1-8 скорости условно. Можно менять направление вращения и скорость вращения, не останавливая двигатель.

Внешний вид устройства


Печатная плата


 
 Текст программы микроконтроллера

.include "c:\Program Files\Atmel\AVR Tools\AvrAssembler2\Appnotes\m8535def.inc"
.cseg
.org 0
 
.def tmp = r16                        ;временная
.def tmp2 = r18                       ;сдвиговая последовательность
.def t200 = r17                       ;временная   
.def t1 = r19                         ;текущая скорость
.def t2  = r20                       ;временная
 
         rjmp RESET
RESET:   ldi tmp,HIGH(RAMEND)         ;определение начала стека
         out SPH,tmp                 ;в ОЗУ
         ldi tmp,LOW(RAMEND)        
         out SPL,tmp
         ser tmp
         out PORTD,tmp
         out DDRA,tmp                 ;порт A - Выходы на индикатор
         out DDRC,tmp                 ;порт C - Выходы на двигатель
         out PIND,tmp
         ldi tmp,15
         out WDTCR,tmp
         clr tmp                     ;очистить регистр tmp
         out DDRD,tmp                 ;порт D - кнопки
         out PORTA,tmp
         out PORTC,tmp
         clr tmp2
         ldi t1,1                     ;установка 8 скорости
 
          ldi XL,low(900)
        ldi XH,high(900)
 
main:
     rcall key
rjmp main
;=====================================================
;опрос клавиатуры
;=====================================================
key: wdr                         ;cброс сторожевого таймера
         rcall ind               ;вывод скорости на идикатор
         sbis PIND,PD6           ;если кнопка нажата
    rjmp Left                    ;перейти на метку Left
         sbis PIND,PD5           ;если кнопка нажата
    rjmp Right                  ;перейти на метку Right
         sbis PIND,PD4           ;если кнопка нажата
    rjmp Stop                    ;перейти на метку Stop
         sbis PIND,PD3              
         rcall Minus             ;скорость (-)
         sbis PIND,PD2              
         rcall Plus              ;скорость (+)
ret
 
;=====================================================
;уменьшение скорости
;=====================================================
Minus:
s1:      cpi XL,0
         brne next1              ;если XL<>0 на метку next1
         ldi XL,low(900)
        ldi XH,high(900)
         inc t1
next1:
         sbiw XL,1
         breq s1                 ;если XL=0 на метку s1
         rcall Prov
ret
 
;=====================================================
;увеличение скорости
;=====================================================
Plus:
s2:      cpi XL,0
         brne next2              ;если XL<>0 на метку next2
         ldi XL,low(900)
        ldi XH,high(900)
         dec t1
next2:
         sbiw XL,1
         breq s2                 ;если XL=0 на метку s2
         rcall Prov
ret
 
;=====================================================
;вращение двигетеля влево
;=====================================================
Left:
     ldi tmp2,0b00000001
nl:  wdr                         ;cброс сторожевого таймера
     ;rcall d250ms               ;задержка
     out PORTC,tmp2              ;вывод в порт tmp2
     lsl tmp2                    ;сдвиг tmp2 влево
     sbrc tmp2,4                 ;пророверка достижения 4 бита
     ldi tmp2,0b00000001
    
     mov t2,t1                   ;сохранить t1 в t2
     md2:wdr
         rcall d250ms            ;задержка
         dec t1                  ;уменьшить количество задержек
         brne md2                ;если t<>0 переход на md1
     mov t1,t2
 
     sbis PIND,PD6               ;если кнопка Left еще нажата
    rjmp nl                      ;перейти на метку nl
     rcall key                   ;опрос клавиатуры
rjmp nl
 
;=====================================================
;проверка достижения max и min скорости
;=====================================================
Prov:
     cpi t1,0                    ;если t1<>0
     brne w1                     ;то перейти на w1
     ldi t1,1               
w1:
     cpi t1,9                    ;если t1<>9
     brne w2                     ;то перейти на w2
     ldi t1,8               
w2:
ret
;=====================================================
;вращение двигетеля вправо
;=====================================================
Right:
     ldi tmp2,0b00010000
nr:  wdr
     ;rcall d250ms
     lsr tmp2                    ;сдвиг tmp2 вправо
     out PORTC,tmp2              ;вывод tmp2 в порт     
     sbrc tmp2,0                 ;пророверка достижения 1 бита
     ldi tmp2,0b00010000
    
     mov t2,t1                   ;сохранить t1 в t2
     md1:wdr
         rcall d250ms            ;задержка
         dec t1                  ;уменьшить количество задержек
         brne md1                ;если t<>0 переход на md1
     mov t1,t2
 
     sbis PIND,PD5               ;если кнопка Right еще нажата
    rjmp nr                      ;перейти на метку nr
     rcall key
rjmp nr
 
;=====================================================
;остановка двигетеля и задание скорости вращения
;=====================================================
Stop:
     clr tmp                     ;очистить регистр tmp
     out PORTC,tmp               ;вывод tmp в порт
 
ldi t200,200                     ;t200 = 200
n31: wdr                         ;cброс сторожевого таймера
      rcall d250ms               ;задержка
      dec t200                   ;уменьшить количество задержек
      brne n31                   ;если t200<>0 переход на n31
 
sbis PIND,PD3              
inc t1                           ;скорость (+)
 
ldi t200,200                     ;t200 = 200
n32: wdr                         ;cброс сторожевого таймера
      rcall d250ms               ;задержка
      dec t200                   ;уменьшить количество задержек
      brne n32                   ;если t200<>0 переход на n32
 
sbis PIND,PD2                    ;проверка кнопки
dec t1                           ;скорость (-)
 
     rcall Prov
     rcall key                   ;опрос клавиатуры
     rcall ind                   ;вывод скорости на идикатор
rjmp Stop
 
;=====================================================
;вывод текущей скорости на идикатор
;=====================================================
ind: wdr
     clr tmp                
     out PORTA,tmp               ;очистить индикатор
 
     cpi t1,1                   
     breq x8                    
     cpi t1,2
     breq x7
     cpi t1,3
     breq x6
     cpi t1,4
     breq x5
     cpi t1,5
     breq x4
     cpi t1,6
     breq x3
     cpi t1,7
     breq x2
     cpi t1,8
     breq x1
 
x1: ldi tmp,0b10000010      ;вывод 1
     out PORTA,tmp
     rjmp ex
x2: ldi tmp,0b00111110      ;вывод 2
     out PORTA,tmp
     rjmp ex
x3: ldi tmp,0b10101110      ;вывод 3
     out PORTA,tmp
     rjmp ex
x4: ldi tmp,0b10000111      ;вывод 4
     out PORTA,tmp
     rjmp ex
x5: ldi tmp,0b10101101      ;вывод 5
     out PORTA,tmp
     rjmp ex
x6:  ldi tmp,0b10111101      ;вывод 6
     out PORTA,tmp
     rjmp ex
x7: ldi tmp,0b10100010      ;вывод 7
     out PORTA,tmp
     rjmp ex
x8: ldi tmp,0b10111111      ;вывод 8
     out PORTA,tmp
ex:
ret
;=====================================================
;Подпрограмма задержки
;=====================================================
d250ms:   wdr                  ;cброс сторожевого таймера
          ldi YL,low(650)
          ldi YH,high(650)
d05_1:    wdr
          sbiw YL,1
          brne d05_1
ret

Скачать плату в формате LAY
Скачать файлы проекта для AVR Studio 4