Контроллер шагового двигателя
СхемаПБМГ-200-265
Тип двигателя: Шаговый, униполярный.
Угол поворота за один шаг: 1.8 градуса.
Количество шагов на полный оборот вала: 200.
Количество выводов: 6.
Количество обмоток: 2 со средней точкой.
Напряжение питания: 12В.
Сопротивление обмоток: 70Ом.
Потребляемый ток: 0,17А.
Обозначение выводов шагового двигателя
Черный: Общий
Белый: Общий
Красный: 1
Желтый: 2
Зеленый: 3
Синий: 4
Программа управляет выводами порта и формирует на них сдвиговую последовательность импульсов.
Эта последовательность приведена в табл.1 и табл.2. Более мощный режим табл.3 и табл.4
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
Изменение скорости осуществляется путем уменьшения и увеличения паузы между импульсами.
Задержка (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