Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Учебное_пособие.doc
Скачиваний:
70
Добавлен:
10.11.2019
Размер:
8.13 Mб
Скачать

5.2.3 Генератор заданного числа пакетов импульсов

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

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

Последовательность двух серий представлена на рис.56.

Рисунок 56

Примерный текст программы генератора повторяющихся пакетов импульсов

.INCLUDE "M16DEF.INC"

.ORG 0

LDI R16, 4 ;Организация стека в верхней ячейке ОЗУ

OUT SPH, R16 ;ее адрес для Mega16 - 45F. По сбросу

LDI R16, $5F ; МК устанавливается SP=0

OUT SPL, R16

SBI DDRD, 5 ;Настройка разряда порта, в котором

;будут формироваться импульсы, на выход

LDI R17, N ;N – число серий импульсов, регистр R17- счетчик

;серий

NEXT_PACKET: LDI R18 ,М ;М - число импульсов в пакете, R18- счетчик

;импульсов в серии

NXT_PERIOD: CBI PORTD, 5 ;Начало паузы

RCALL T_PAUSE ;Вызов п.п. длительности паузы

SBI PORTD, 5 ;Фронт импульса

RCALL T_PULSE ; Вызов п.п. длительности паузы

DEC R18 ;Отсчет импульса в обратную сторону

BRNE NЕXT_PERIOD ;Если импульс не последний в серии, то повторять

;(если в регистре не 0, то переход по метке)

CBI PORTD,5 ;Начало паузы между сериями

RCALL T_M ;Длительность межсерийного интервала

DEC R17 ;Отсчет счетчиком одной серии

BRNE NXT_PACKET; Если серия не последняя, то повторять

CBI PORTD,5 ;Нулевой уровень после последней серии

LOOP_I: RJMP LOOP_I ;Бесконечный цикл. Функция программы выполнена.

T_PAUSE: . ;Выбранный вид процедуры

. ;с расcчитанными значениями

.

RET

T_PULSE:

. ;Выбранный вид процедуры

. ;с расcчитанными значениями

.

.

RET

T_М : . ;Выбранный вид процедуры

. ;с расcчитанными значениями

.

RET

    1. Формирование импульсных сигналов управления с использованием таймеров микроконтроллера

Одной из основных функций таймеров является формирование импульсных сигналов управления внешними устройствами управляющей системы. Генерация импульсов с использованием таймеров, выполняется, в основном, аппаратно. Некоторые режимы таймеров для генерации некоторых типов импульсных сигналов требуют определенной программной поддержки.

Для генерации меандра (скважность импульсов равна 2) можно использовать режим сброса по совпадению. Режим выхода по совпадению установить в опцию “переключение при совпадении”. В регистр совпадения загрузить значение, соответствующее длительности импульса (паузы). Напомним, что в режиме сброса по совпадению при равенстве значений в таймере и регистре совпадения таймер сбрасывается и продолжает счет входных импульсов с нулевого значения. Тогда, каждый раз при равенстве значений таймера и регистра совпадения будет переключаться разряд выхода совпадения, т.е. на этом выходе будет формироваться меандр.

На рис.57 приведены диаграммы формирования меандра с использованием таймера Т0.

Рисунок 57

Значение, которое необходимо поместить в регистр совпадения OCR0, для получения заданного временного интервала:

OCR0 = tитакт * К - 1

При использовании этого режима для генерации импульсов необходимо предварительно.

  • в регистр сравнения OCR0 загрузить значение равное длительности паузы;

  • установить режим “Сброс по совпадению”;

  • установить режим выхода совпадения ОС0 на переключение при совпадении;

  • установить режим таймера;

  • включить таймер Т0.

Ниже приведен текст программы настройки таймера Т0 для генерации меандра.

.Include "m16def.inc"

.Org 0

LDI R16,...........

OUT OCR0,R16

;В регистр сравнения загружается байт для

;длительности паузы (импульса)

SBI DDRB,3

;Настройка разряда выхода совпад. на вывод

LDI R16,0B………

OUT TCCR0,R16

;Переключение выхода при совпадении, режим

;сброса по совпадению, коэфф. деления.

LOOP_I:

Rjmp LOOP_I

;Работает Т0

Для генерации импульсов со скважностью не равной 2, режим сброса по совпадению применять нецелесообразно, так в подпрограмме прерываний по совпадению необходимо перезагружать регистр совпадения, то есть, требуется программная поддержка. Функция генерации импульсов с произвольной скважностью может быть реализована с использованием какого-либо из режимов генератора сигнала ШИМ.

На рис.58 приведены временные диаграммы сигналов работы таймера Т1 в режиме генератора сигналов ШИМ (режим 14) и текст программы настройки Т1.

Как следует из графиков длительности импульса и паузы в тактах импульсов на входе Т1 составляет:

Nи = ICR1- OCR1A и Nп = OCR1A.

Из этих соотношений можно определить значения в регистрах ICR1 и OCR1A по заданным значениям длительности импульса и паузы.

OCR1A = Nп; ICR1 = Nи +N п. (9)

Рисунок 58

При использовании делителя частоты импульсов на входе таймера Т1, следует учесть коэффициент деления делителя К. С учетом этого расчет значений в регистрах выполнять по формулам:

OCR1A = tп / (T такт *К) - 1; ICR1 = (tи +t п)/( T такт *К) - 1, (10) где:

T такт - период тактовой частоты микроконтроллера.

Понятно, что для неинвертируемой ШИМ в формулах tи и t п нужно поменять местами.

Пример 8 Рассчитать значения, которые необходимо поместить в регистры ICR1 и OCR1A для получения сигнала инвертированного сигнала ШИМ со значениями Т=320мкс и tи = 80мкс. Значение коэффициента деления делителя К=8. Значение тактовой частоты F = 16мГц.

OCR1A = t п / (T такт *К)=240*10-6/(2-4*10-6*23) - 1= 479.

ICR1 = (tи +t п) / ( T такт *К) =320*10-6/(2-4*10-6*23) -1=639.

Перевод значений в шестнадцатиричную систему:

479 = 0х1DF; 639 = 0х27F.

Регистры сравнения как и таймер Т1 являются 16-разрядными регистрами, т.е. состоят из старшей и младшей частей: OCR1AH, OCR1AL, ICR1H, ICR1L. Для нашего примера необходимо:

в OCR1AH поместить 1,

в OCR1A поместить 0хDF,

в ICR1H поместить 2,

в ICR1H поместить 0х7F.

Так как в системе команд микроконтроллера отсутствуют команды загрузки регистров ввода-вывода значением (операндом), то для выполнения этой процедуры необходимо операнд сначала поместить в регистр общего назначения с помощью команды LDI, а затем командой OUT переместить значение из регистра общего назначения в соответствующий регистр ввода-вывода.

Составляем содержимое регистра управления TCCR1A.

В разряды СОМ1А1 и СОМ1А0 необходимо установить значения 11 для настройки заданного вида сигнала: инвертированный ШИМ-сигнал.

В разряды WGM11 и WGM10 необходимо установить значение 10 – два младших разрядов режима 14 (в двоичной системе 1110). Остальные разряды этого регистра не используются, поэтому в них поместим нули.

TCCR1A = 11000010.

Составляем содержимое регистра управления TCCR1В.

В разряды WGM31 и WGM20 устанавливаем два старших разряда режима 14,т.е.11.

В разряды CS12,CS11,СS10 необходимо установить 010. Это значение определяет заданный коэффициент деления делителя К = 8. Остальные разряды этого регистра не используются, поэтому в них поместим нули.

TCCR1В – 00011010.

Программа настройки таймера Т1 для генерации импульсов ШИМ в режиме 14.

.Include "m16def.inc"

.Org 0

SBI DDRD,5

;Настройка разряда PIND.5 (ОС1А) на вывод

LDI R16,1

;В регистр R16 помещается старший байт

;(нет команд загрузки регистра ВВ операндом)

OUT OCR1AH,R16

;из R16 старший байт копируется в OCR1AH.

LDI R16,0хDF

;В регистр R16 помещается младший байт

OUT OCR1AL,R16

;из R16 младший байт копируется вOCR1AL.

LDI R16,2

;В регистр ICR1H загружается старший байт ;значения, при достижении которого Т1

OUT ICR1H,R16

; переключается в вычитающий режим

LDI R16,0x7F

;В регистр ICR1L загружается младший

;байт

OUT ICR1L,R16

LDI R16,0B11000010

;Вид ШИМ: инверт. или неинверт. и два ;младших разряда номера режима

OUT TCCR1A,R16

LDI R16,0B00011010

;Два старших разряда номера режима, ;коэффициента деления делителя и включение

OUT TCCR1B,R16

;таймера Т1

;Работает Т1 и формируется сигнал ШИМ