Ячейки внешней памяти адресуются через регистры R0, R1 или через регистр-указатель DPTR. В первом случае содержимое регистра R0 или R1

определяет младший байт адреса ячейки внешней памяти данных. При этом старший байт адреса может задаваться с помощью порта 2. Примером команды с косвенно-регистровой адресацией к внешней памяти является MOVX A, @R0.

Во втором случае для адресации внешней памяти используется 16-и разрядный регистр-указатель данных DPTR. Например, команда MOVX @DPTR, A пересылает содержимое аккумулятора в ячейку внешней памяти данных, адрес которой записан в регистре DPTR.

Непосредственная адресация. Одним из операндов является константа, заданная как часть машинного кода команды. Непосредственным операндам должен предшествовать префикс «#». Например, команда MOV A, #03h загружает в аккумулятор шестнадцатеричную константу 03h.

Базово-индексная адресация. Используется для доступа к константам и таблицам, располагающимся в памяти программ. Адрес ячейки памяти программ, к которой выполняется обращение, определяется как сумма содержимого аккумулятора и содержимого либо регистра-указателя DPTR, либо программного счетчика РС. Например, команда MOVC A, @A+DPTR загружает аккумулятор содержимым ячейки памяти программ, адрес которой является суммой содержимого аккумулятора (до выполнения команды) и содержимого регистра-указателя DPTR.

8. Применение МК для управления шаговым двигателем

Одним из широко распространенных применений МК является управление приводами на базе шаговых двигателей (ШД). Вращение двигателя обеспечивается подачей на две его обмотки импульсных последовательностей, сдвинутых по фазе на p/2 (см. рис. 4.2).

НЕ нашли? Не то? Что вы ищете?

По каждому фронту импульса на одной из обмоток, т. е. с интервалом tш, ШД отрабатывает один элементарный шаг, поэтому скорость вращения определяется частотой импульсных последовательностей. Направление вращения определяется опережением или отставанием импульсов на второй обмотке относительно первой. При постоянной частоте импульсных последовательностей в обмотках скорость вращения w ШД определяется формулой:

w = a/(360*tш ) [об/с],

где a - величина элементарного шага (в град.) Отсюда величина tш для заданной скорости вращения w вычисляется следующим образом: tш = a/(360*w) [с].

Рассмотрим пример управления двигателем для случая, когда он должен циклически отрабатывать следующую последовательность действий:

поворот по часовой стрелке на 180° со скоростью 2 об/с (фаза «Вращение_1»);

отсутствие вращения в течение 1 с. (фаза «Пауза_1»);

поворот против часовой стрелки на 90° со скоростью 0,5 об/с (фаза «Вращение_2»);

отсутствие вращения в течение 2 с. (фаза «Пауза_2»).

Основу алгоритма управления во всех четырех фазах составляет формирование временных интервалов различной длительности. В фазах «Вращение» необходимо формировать интервалы tш отработки элементарных шагов, обеспечивающие требуемую скорость вращения. В фазах «Пауза» также необходимо формировать задержки заданной длительности. Рассчитаем величины необходимых временных интервалов и соответствующих констант для загрузки в таймер.

Пусть элементарный шаг a = 1,8°, тогда для скорости вращения w = 2 об/с получим tш1 = 1,8/(360*2) = 0,0025 с = 2,5 мс. Для скорости вращения w = 0,5 об/с получим tш2 = 1,8/(360*0,5) = 0,0025 с = 10 мс.

Определим значения констант k1 и k2, которые необходимо загружать в таймер для реализации задержек tш1 и tш2. Требуемое число n отсчетов таймера равно tш/tц, где tц - время одного отсчета, равное длительности машинного цикла. Например, при тактовой частоте МК 6 МГц tц = 2 мкс. Тогда для двух фаз «Вращение» получим:

n1 = tш1/tц = 2500/2 =1250; n2 = tш2/tц, = 10000/2 = 5000.

Поскольку таймер считает на увеличение, загружаемые константы k1 и k2, должны представлять собой дополнительный код величин n1 и n2. Для указанных выше значений получим: k1 = B, k2 = B.

Число S элементарных шагов, которые необходимо выполнить для поворота на заданный угол b, равно [b/1,8], где [...] - означает округление до ближайшего целого значения (при этом погрешность угла поворота не будет превышать 0,9°). Для фаз «Вращение_1» и «Вращение_2» соответственно имеем S1 = 180/1,8 = 100, S2 = 90/1,8 = 50. Константы S1 и S2 должны загружаться в счетчик элементарных шагов (СчЭШ) всякий раз перед началом соответствующей фазы «Вращение». В качестве СчЭШ будем использовать регистр R2 нулевого банка РОН.

Большие задержки в фазах «Пауза» (1с. и 2 с.) должны реализовываться аппаратно-программным способом, т. к. максимальная величина задержки, обеспечиваемая таймером, при тактовой частоте 6 МГц равна 216*2 мкс = 131072 мкс = 0,с. При этом необходимо дополнительно использовать программный счетчик интервалов задержки (СчИЗ), подсчитывающий число M переполнений аппаратного таймера. Пусть в обеих фазах «Пауза» аппаратно формируемая задержка будет равна 0,1 с. (для этого в таймер необходимо загружать константу k3 = B), тогда в СчИЗ должны загружаться константы M1 = 10 (при переходе в фазу «Пауза_1») и M2 = 20 (при переходе в фазу «Пауза_2»). В качестве СчИЗ будем использовать регистр R3 нулевого банка РОН.

Будем считать, что управление обмотками двигателя осуществляется через четыре младших разряда порта P1, причем каждой обмоткой двигателя управляют два бита, которые в каждый момент времени должны иметь взаимно инверсные значения. Пусть первой обмоткой управляют разряды P1.0 и P1.1, а второй - P1.2 и P1.3. Тогда для вращения двигателя необходимо обеспечить попеременное инвертирование старшей и младшей пары разрядов, при этом в порту P1 должна формироваться следующая последовательность кодов: xxxx0101B, xxxx1001B, xxxx1010B, xxxx0110B, xxxx0101B и т. д. Селективную инверсию пары разрядов в младшей тетраде можно реализовать, используя операцию «Исключающее ИЛИ» с константами B и B. Так как в этих байтах существенна только младшая тетрада, то можно хранить только одну маску B и, после инверсии очередной пары бит, менять местами тетрады с помощью команды SWAP. Пусть для хранения маски используется регистр общего назначения R4, тогда отработка очередного элементарного шага может быть эффективно реализована следующим фрагментом программы:

MOV A, R4; загрузка маски в аккумулятор

XRL P1, A ; инверсия одной пары разрядов (переключение в одной обмотке)

SWAP A ; перестановка тетрад в маске

MOV R4, A; сохранение скорректированной маски.

Для реализации всех временных задержек в рассматриваемом примере будем использовать таймер/счетчик T/C0. При этом программа обработки прерывания от T/C0 для выполнения соответствующих действий должна распознавать текущую фазу цикла управления ШД. Для кодирования текущей фазы необходимо иметь два программных флага, в качестве которых будем использовать прямо адресуемые биты с адресами 20h (флаг FL_1) и 21h (флаг FL_2). Примем следующее кодирование фаз:

FL_1 FL_2 Фаза управления ШД

0 0 «Вращение_1»

0 1 «Вращение_2»

1 0 «Пауза_1»

1 1 «Пауза_2»

Алгоритм процедуры обработки прерывания от T/C0 представлен на рис. 4.3. Основная программа выполняет все необходимые предварительные установки (выбор регистрового банка, настройку T/C0 в нужный режим, подготовку к фазе «Вращение_1»), после чего переходит к выполнению бесконечного пустого цикла. Все действия по управлению ШД выполняются программой обработки прерывания от T/C0. Начальная подготовка к фазе «Вращение_1» включает: сброс флагов FL_1 и FL_2, загрузку в СчЭШ константы S1, а в T/C0 - константы k1.

Текст программы приведен ниже. Предполагается, что основная программа размещена по адресу 1000h, а программа обработки прерывания - начиная с адреса 1100h. В программе использованы следующие символические

имена констант: K1_L, K2_L, K3_L - младшие байты соответственно констант k1, k2 и k3; K1_H, K1_H, K1_H - старшие байты соответственно констант k1, k2 и k3; S1, S2 - константы S1 и S2; M1, M2 - константы M1 и M2.

; Программа управления ШД, основной цикл

.ORG 1000h ;

Овал: B

Нет

 

Нет

 

Нет

 

Да

 

Да

 

Да

 
Блок-схема: знак завершения: RETIОвал: A

Запустить T/C0;

Разрешить прерывания

 

СчЭШ:=S1;

T/C0 := k1

 

СчЭШ:=S2;

T/C0 := k2

 
22Блок-схема: решение: FL_2 = 0

Изменить направ-ление вращения

 

Сменить фазу:

FL_1 := 0;

FL_2 := Ø FL_2

 

T/C0 := k3

 
Блок-схема: решение: СчИЗ = 0

СчИЗ := (СчИЗ)-1

 
Блок-схема: решение: Фаза «Вра-щение»

Запретить прерывания.

Остановить T/C0

 
Блок-схема: знак завершения: TF0

Рис. 3. Алгоритм управления шаговым двигателем

 

Да

 

Да

 

Да

 

Нет

 

Нет

 

Нет

 

Рис. 4. Алгоритм управления шаговым двигателем (продолжение)

 

CLR PSW.3 ; установка регистрового банка 0

CLR PSW.4 ;

MOV TMOD,#01h ; настройка T/C0 в режим таймера 1

CLR FL_1 ; установка фазы «Вращение_1»

CLR FL_2 ;

MOV R2,#S1 ; загрузка в СчЭШ константы S1

MOV TL0,#K1_L ; загрузка в младший и

MOV TH0,#K1_H ; старший байты T/C0 константы k1

SETB TCON.4 ; запуск T/C0

SETB IE.3 ; разрешение прерывания от T/C0

CYC: SJMP CYC ; пустой цикл

.END

; Программа обработки прерывания

.ORG 1100h ;

CLR IE.7 ; запрет всех прерываний

CLR TCON.4 ; останов T/C0

JNB FL_1,M1; определение типа фазы, переход к M1, если «Вращение»

; фаза «Пауза»

DJNZ R3,M2 ; декремент и проверка на нуль СчИЗ, переход на

; метку M2, если фаза «Пауза» не завершена

CLR FL_1 ; переход к очередной фазе «Вращение»

CPL FL_2

MOV A, R4 ; смена направления вращения - изменение маски

SWAP A ;

MOV R4,A ;

JNB FL_2,M3 ; ветвление по номеру фазы «Вращение»

; инициализация фазы «Вращение_2 »

MOV R2, #S2 ; загрузка в СчЭШ константы S2

M8: MOV TL0,#K2_L ; загрузка в T/C0 константы k2

MOV TH0,#K2_H

AJMP M5 ; переход на запуск T/C0

; инициализация фазы «Вращение_1 »

M3: MOV R2,#S1 ; загрузка в СчЭШ константы S1

M7: MOV TL0,#K1_L ; загрузка в T/C0 константы k1

MOV TH0, #K1_H

M5: SETB TCON.4 ; запуск T/C0

RETI ; возврат из прерывания

; продолжение текущей фазы «Пауза»

M2: MOV TL0,#K3_L ; загрузка в T/C0 константы k3

MOV TH0,#K3_H ;

AJMP M5 ; переход на запуск T/C0

M1: MOV A, R4 ; отработка элементарного шага - переключение

XRL P1,A ; в одной из обмоток ШД

SWAP A ; изменение и сохранение маски

MOV R4, A

DJNZ R2, M4 ; декремент и проверка на нуль СчЭШ, переход на

; метку M4, если фаза «Вращение» не завершена

CPL FL_1 ; переход в фазу «Пауза»

JNB FL_2,M6 ; определение номера фазы «Пауза»,

; инициализация фазы «Пауза_2 »

MOV R3, #M2 ; загрузка в СчИЗ константы M2

AJMP M2 ; переход на загрузку в T/C0 константы k3

; инициализация фазы «Пауза_1 »

M6: MOV R3, #M1 ; загрузка в СчИЗ константы M1

AJMP M2 ; переход на загрузку в T/C0 константы k3

M4: JNB FL_2,M7 ; определение номера фазы «Вращение»

AJMP M8 ; переход на загрузку в T/C0 константы k2

Из за большого объема этот материал размещен на нескольких страницах:
1 2 3