Смекни!
smekni.com

Управление шаговым двигателем микропроцессорной системой (стр. 2 из 3)

Учитывая очень низкий ток потребления индикатора можно обойтись и простым резисторным делителем, если входное напряжение питания постоянно. Описанные схемы питания не являются экономичными и подходят, например, для устройств с сетевым питанием. Система питания автономного устройства может быть очень сложной, и конкретные решения зависят от специфики задачи. Одним из вариантов может быть питание устройства от элемента напряжением 1.5 В, от которого индикатор питается непосредственно. Микроконтроллерная часть устройства питается от того же элемента через повышающий DC-DC преобразователь.

Для согласования логических уровней можно применить разные схемы. Учитывая тот факт, что входы DI и SK имеют внутренние подтягивающие резисторы, можно обойтись просто диодами (рисунок a). Преимущество такого способа заключается в том, что согласование не будет зависеть от напряжения питания микроконтроллера. Однако такой способ имеет и недостаток. Ввиду больших номиналов подтягивающих резисторов уровни на входах будут довольно медленно достигать состояния логической единицы, что потребует значительного снижения скорости обмена. Поэтому предпочтительнее для согласования использовать резисторные делители (рисунок b).

Необходимо отметить, что в течение примерно 2 сек после включения питания модуль не воспринимает данные, передаваемые ему по последовательной шине. Поэтому всегда должна быть задержка между включением питания и началом обмена.

Выбор драйвера ЩД:

Довольно популярной микросхемой, реализующей ШИМ-стабилизацию тока, является L297 фирмы SGS-Thomson. Совместно с микросхемой мостового драйвера L293 или L298 они образуют законченную систему управления для шагового двигателя.

Микросхема L297 сильно разгружает управляющий микроконтроллер, так как от него требуется только тактовая частота CLOCK (частота повторения шагов) и несколько статических сигналов: DIRECTION – направление (сигнал внутренне синхронизирован, переключать можно в любой момент), HALF/FULL – полушаговый/полношаговый режим, RESET – устанавливает фазы в исходное состояние (ABCD = 0101), ENABLE – разрешение работы микросхемы, V ref – опорное напряжение, которое задает пиковую величину тока при ШИМ-регулировании. Кроме того, имеется несколько дополнительных сигналов. Сигнал CONTROL задает режим работы ШИМ-регулятора. При его низком уровне ШИМ-регулирование происходит по выходам INH1, INH2, а при высоком – по выходам ABCD. SYNC – выход внутреннего тактового генератора ШИМ. Он служит для синхронизации работы нескольких микросхем. Также может быть использован как вход при тактировании от внешнего генератора. HOME – сигнал начального положения (ABCD = 0101). Он используется для синхронизации переключения режимов HALF/FULL. В зависимости от момента перехода в полношаговый режим микросхема может работать в режиме с одной включенной фазой или с двумя включенными фазами.


3. Алгоритм


4. Описание программы

Данная программа состоит из основной программы 6 подпрограмм:

1. В основной программе мы производим опрос клавиатуры, путем загрузки в порт маски опроса по столбцам и проверяем появление логического нуля на выходах соответствующих строк.

keyboard1:

mov p1,#11101111b

jnb p1.3,n1

jnb p1.2,n4

jnb p1.1,n7

jnb p1.0,enter

mov p1,#11011111b

jnb p1.3,n2

jnb p1.2,n5

jnb p1.1,n8

jnb p1.0,n0

mov p1,#10111111b

jnb p1.3,n3

jnb p1.2,n6

jnb p1.1,n9

jnbp1.0,step

jmpkeyboard

2. В процедурах обработки нажатия кнопок мы записываем в буфер набранные числа и выводим их на индикатор. Так же мы оперируем счетчиком нажатий, ограничивая количество набранных цифр до 5.

n1: cjne r4,#4,incr

xch A,r4

jz keyboard

dec A

xch A,r4

mov r2,#1

call LCD

mov r1,#indikator

mov @r1,#1

jmp keyboard

3. Процедура формирования задания на двигатель производится в обработчике кнопки enter. В начале массив из цифр в буфере преобразуется в число хранящееся в паре регистров, путем последовательного умножения в циклах введенной цифры на 10 столько раз, сколько разрядов имеет эта цифра. И последовательное сложение полученных результатов. Далее получены результат делится на 2 чтобы получить треугольную форму задания. Далее вызываются подпрограммы управления частотой.

enter1: push 0h

push 2h

push 6h

push 7h

mov r0,#indikator

mov A,@r0

n10000: mov r2,4

mov B,#10

mul AB

djnz r2,n10000

mov r6,A

mov r7,B

n1000: mov r2,3

mov B,#10

inc r0

mov A,@r0

mul AB

djnz r2,n1000

add A,r6

mov r6,A

mov A,B

add A,r7

mov r7,A

n100: mov r2,2

mov B,#10

inc r0

mov A,@r0

mul AB

djnz r2,n100

add A,r6

mov r6,A

mov A,B

add A,r7

mov r7,A

n10: mov r2,1

mov B,#10

inc r0

mov A,@r0

mul AB

djnz r2,n10

add A,r6

mov r6,A

mov A,B

add A,r7

mov r7,A

inc r0

mov A,@r0

add A,r6

mov r6,A

mov A,r7

mov B,2

div AB

mov r7,B

mov A,r6

mov B,2

div AB

mov r6,B

call freq_plus

call freq_minus

pop 0h

pop 2h

pop 6h

pop 7h

ret

4. Процедура вывода на экран.

LCD: push 0h

push 1h

push 2h

mov r1,#4

mov A,r0

swap A

mov r0,A

LDL: mov A,r0

rlc A

jc LD1

LD0: clr p2.0

jmp STR

LD1: setb p2.0

STR: setb p2.1

mov r2,#5

HNG1: djnz r2,HNG1

clr p2.1

mov r2,#10

HNG2: djnz r2,HNG2

djnz r1,LDL

mov r2,#25

HNG3: djnz r2,HNG3

pop 0h

pop 1h

pop 2h

ret

5. Процедура нарастания частоты. Суть данной процедуры состоит в том чтобы установить на ножке порта Р0.0 логическую единицу и держать ее весь промежуток работы таймера. Эта операция выполняется с последующим инкрементированием таймера, что позволяет получить нам нарастающую частоту изменения состояния ножки порта. Так же в подпрограмму встроен счетчик импульсов чтобы отрабатывать задание, получаемое при нажатии кнопки enter. Так же имеется ограничитель максимальной частоты.

freq_plus: push 0h

push 1h

push 6h

push 7h

mov r0,#0h

mov r1,#0ffh

inc r7

main: call pulse

djnz r6,main

djnz r7,main

jmp en

pulse: setb P0.0

call timer

clr P0.0

call test

ret

timer: mov tmod,#1

mov th0,r0

mov tl0,r1

setb tr0

wait: jbc tf0,ok

sjmp wait

ok: clr tr0

ret

test: cjne r0,#0ffh,dal

ret

dal: inc r0

ret

en: mov A,r0

mov r5,A

pop 0h

pop 1h

pop 6h

pop 7h

ret

6. Процедура уменьшения частоты. Работает аналогично процедуре увеличения частоты с тем лишь отличием, что в данной процедуре значение таймера декрементируется. Так же эта подпрограмма начинает работу именно с той частоты, на которой закончила работу подпрограмма увеличения.

freq_minus: push 0h

push 1h

push 6h

push 7h

mov A,r5

mov r0,A

mov r1,#0ffh

inc r7

mainm: call pulse

djnz r6,mainm

djnz r7,mainm

jmp en

pulsem: setb P0.0

call timerm

clr P0.0

call testm

ret

timerm: mov tmod,#1

mov th0,r0

mov tl0,r1

setb tr0

waitm: jbc tf0,okm

sjmp waitm

okm: clr tr0

ret

testm: cjne r0,#0h,dalm

ret

dalm: dec r0

ret

enm: pop 0h

pop 1h

pop 6h

pop 7h

ret

5. Листинг

A51 MACRO ASSEMBLER KURS 06/05/2008 09:31:04 PAGE 1

MACRO ASSEMBLER A51 V8.00b

OBJECT MODULE PLACED IN kurs.OBJ

ASSEMBLER INVOKED BY: F:\Keil\C51\BIN\A51.EXE kurs.a51 SET(SMALL) DEBUG EP

LOC OBJ LINE SOURCE

0000 1 org 0

0000 8000 2 jmp init

3

0050 4 temp EQU 50H

0051 5 Cnt EQU 51H

0052 6 Del EQU 52H

0002 7 indikator: db

8

0002 D281 9 init: setb p0.1

0004 D282 10 setb p0.2

0006 C283 11 clr p0.3

0008 7C05 12 mov r4,#5

13

000A 14 keyboard1:

000A 7590EF 15 mov p1,#11101111b

000D 309329 16 jnb p1.3,n1

0010 30925C 17 jnb p1.2,n4

0013 30917F 18 jnb p1.1,n7

0016 30907A 19 jnb p1.0,enter

20

0019 7590DF 21 mov p1,#11011111b

001C 30932C 22 jnb p1.3,n2

001F 30925F 23 jnb p1.2,n5

0022 309172 24 jnb p1.1,n8

0025 309075 25 jnb p1.0,n0

26

0028 7590BF 27 mov p1,#10111111b

002B 30932F 28 jnb p1.3,n3

002E 309272 29 jnb p1.2,n6

0031 30916B 30 jnb p1.1,n9

0034 30906A 31 jnb p1.0,step

32

0037 8060 33 jmp keyboard

34

0039 BC045F 35 n1: cjne r4,#4,incr

003C CC 36 xch A,r4

003D 605A 37 jz keyboard

003F 14 38 dec A

0040 CC 39 xch A,r4

0041 7A01 40 mov r2,#1

0043 31AB 41 call LCD

0045 7902 42 mov r1,#indikator

0047 7701 43 mov @r1,#1

0049 804E 44 jmp keyboard

004B BC044D 45 n2: cjne r4,#4,incr

004E CC 46 xch A,r4

004F 6048 47 jz keyboard

0051 14 48 dec A

0052 CC 49 xch A,r4

0053 7A02 50 mov r2,#2

0055 31AB 51 call LCD

0057 7902 52 mov r1,#indikator

0059 7702 53 mov @r1,#2

005B 803C 54 jmp keyboard

005D BC043B 55 n3: cjne r4,#4,incr

0060 CC 56 xch A,r4

0061 6036 57 jz keyboard

0063 14 58 dec A

A51 MACRO ASSEMBLER KURS 06/05/2008 09:31:04 PAGE 2

0064 CC 59 xch A,r4

0065 7A03 60 mov r2,#3

0067 31AB 61 call LCD

0069 7902 62 mov r1,#indikator

006B 7703 63 mov @r1,#3

006D 802A 64 jmp keyboard

006F BC0429 65 n4: cjne r4,#4,incr

0072 CC 66 xch A,r4

0073 6024 67 jz keyboard

0075 14 68 dec A

0076 CC 69 xch A,r4

0077 7A04 70 mov r2,#4

0079 31AB 71 call LCD

007B 7902 72 mov r1,#indikator

007D 7704 73 mov @r1,#4

007F 8018 74 jmp keyboard

0081 BC0417 75 n5: cjne r4,#4,incr

0084 CC 76 xch A,r4

0085 6012 77 jz keyboard

0087 14 78 dec A

0088 CC 79 xch A,r4

0089 7A05 80 mov r2,#5

008B 31AB 81 call LCD

008D 7902 82 mov r1,#indikator

008F 7705 83 mov @r1,#5

0091 8006 84 jmp keyboard

85

0093 8073 86 enter: jmp enter1

0095 801E 87 n7: jmp n71

0097 802E 88 n8: jmp n81

0099 010A 89 keyboard: jmp keyboard1

009B 8060 90 incr: jmp incr1

009D 804C 91 n0: jmp n01

009F 8038 92 n9: jmp n91

00A1 805D 93 step: jmp step1

94

00A3 BC04F5 95 n6: cjne r4,#4,incr

00A6 CC 96 xch A,r4

00A7 60F0 97 jz keyboard

00A9 14 98 dec A

00AA CC 99 xch A,r4

00AB 7A06 100 mov r2,#6

00AD 31AB 101 call LCD

00AF 7902 102 mov r1,#indikator

00B1 7706 103 mov @r1,#6

00B3 80E4 104 jmp keyboard

00B5 BC04E3 105 n71: cjne r4,#4,incr

00B8 CC 106 xch A,r4

00B9 60DE 107 jz keyboard

00BB 14 108 dec A

00BC CC 109 xch A,r4

00BD 7A07 110 mov r2,#7

00BF 31AB 111 call LCD

00C1 7902 112 mov r1,#indikator

00C3 7707 113 mov @r1,#7

00C5 80D2 114 jmp keyboard

00C7 BC04D1 115 n81: cjne r4,#4,incr

00CA CC 116 xch A,r4

00CB 60CC 117 jz keyboard

00CD 14 118 dec A

00CE CC 119 xch A,r4

00CF 7A08 120 mov r2,#8

00D1 31AB 121 call LCD

00D3 7902 122 mov r1,#indikator

00D5 7708 123 mov @r1,#8

00D7 80C0 124 jmp keyboard

A51 MACRO ASSEMBLER KURS 06/05/2008 09:31:04 PAGE 3

00D9 BC04BF 125 n91: cjne r4,#4,incr

00DC CC 126 xch A,r4

00DD 60BA 127 jz keyboard

00DF 14 128 dec A

00E0 CC 129 xch A,r4

00E1 7A09 130 mov r2,#9

00E3 31AB 131 call LCD

00E5 7902 132 mov r1,#indikator

00E7 7709 133 mov @r1,#9

00E9 80AE 134 jmp keyboard

00EB BC04AD 135 n01: cjne r4,#4,incr

00EE CC 136 xch A,r4

00EF 60A8 137 jz keyboard

00F1 14 138 dec A

00F2 CC 139 xch A,r4

00F3 7A00 140 mov r2,#0

00F5 31AB 141 call LCD

00F7 7902 142 mov r1,#indikator

00F9 7700 143 mov @r1,#0

00FB 809C 144 jmp keyboard

00FD 08 145 incr1: inc r0

00FE 8099 146 jmp keyboard

0100 7E01 147 step1: mov r6,#1

0102 7F00 148 mov r7,#0

0104 31D9 149 call freq_plus

0106 8091 150 jmp keyboard

151

0108 C000 152 enter1: push 0h

010A C002 153 push 2h

010C C006 154 push 6h

010E C007 155 push 7h

0110 7802 156 mov r0,#indikator

0112 E6 157 mov A,@r0

0113 AA04 158 n10000: mov r2,4

0115 75F00A 159 mov B,#10

0118 A4 160 mul AB

0119 DAF8 161 djnz r2,n10000

011B FE 162 mov r6,A

011C AFF0 163 mov r7,B

011E AA03 164 n1000: mov r2,3

0120 75F00A 165 mov B,#10