Смекни!
smekni.com

Проектирование программно-управляемого генератора пачек прямоугольных импульсов на микроконтроллере (стр. 4 из 4)

Алгоритм подпрограммы приведен в приложении 4.

Текст программы приведён в приложении 1.

5. Анализ временных соотношений и оценка погрешностей

Согласно техническому заданию, длительность импульса tи=10 мкс, частота следования импульсов f=5 кГц. Изменяется длительность пачки: tп=0,2c; 0,4 c; 0,6 c. Период повторения пачек – 9 с.

Период повторения импульсов равен:

Т=1/f=200 мкс.

t0=T-tи=190 мкс – длительность паузы.

Расчитаем число импульсов в пачке:

Первый режим: N=tп/T=0,2c/200мкс=1000 импульсов (250+250).

Второй режим: N=tп/T=0,4c/200мкс=2000 импульсов (500+500).

Третий режим: N=tп/T=0,3c/200мкс=3000 импульсов (750+750).

Так как мы используем 8-битный ЦАП, то им можно сформировать лишь 255 уровней выходного напряжения, что не всегда позволяет сформировать пачку заданной длительности. Поэтому можно формировать по несколько импульсов одинаковой амплитуды для увеличения длительности пачки.

Рассчитаем коэффициенты, вносимые в таймер-счётчик Т1 для формирования временных интервалов. Коэффициент деления частоты = 1

Тактовая частота 8 МГц, период такта – 0,125 мкс. Количество тактов 0,10мкс/0,125мкс = 80. Число вносимое в таймер-счётчик – 65535-80 = 65455 -> $FFAF.

Количество тактов для интервалов между импульсами t0 = 190 мкс/0,125 мкс = 1600. Число вносимое в таймер-счётчик: 65535-1600 = 63935 -> $F9BF.

Рассчитаем длительности интервалов между пачками.

Первый режим.

Длительность паузы: Т-tп = 9-0,2 = 8,8 с. Зададим коэффициент деления частоты равный 1024. f = 8 МГц/1024 = 7812,5 Гц. Отсюда Т = 1/f = 128 мкс.

Для формирования паузы: 8,8 с/128 мкс = 68750.

В таймер-счётчик сначала запишем $0, так как 68750>65535, а затем внесём в него: 65535-(68750-65535)=62320 => $F370.

Рассчитаем второй режим:

Длительность паузы: Т-tп = 9-0,4 = 8,6 с. Зададим коэффициент деления частоты равный 1024. Для формирования паузы: 8,6 с/128 мкс = 67186. В таймер-счётчик сначала запишем $0, так как 67186>65535, а затем внесём в него: 65535-(67186-65535)=63882 => $F98А.

Рассчитаем третий режим:

Длительность паузы: Т-tп = 9-0,6 = 8,4 с. Зададим коэффициент деления частоты равный 1024. Для формирования паузы: 8,4 с/128 мкс = 65625. В таймер-счётчик сначала запишем $0, так как 65625>65535, а затем внесём в него: 65535-(65625-65535)=65445 => $FFA5.

Эти коэффициенты рассчитаны без учёта времени выполнения программы. После моделирования величину вводимых чисел в таймер-счётчик необходимо подкорректировать.

Проведем моделирование и отладку программы c помощью VMLab. Причем при моделировании используем макромодель 8 битного ЦАП, что позволяет наблюдать требуемые импульсы, измерять их длительность и амплитуду.

После моделирования получаем такие параметры импульса:

По программе Требуемая Ошибка
Длительность единицы 13мкс 10 мкс 3 мкс
Длительность нуля 193 мкс 190 мкс 3 мкс

Проведем коррекцию временных интервалов:

Количество тактов для τи=(10-3) мкс/0,125мкс=56; Число вносимое в таймер счетчик 65535-56=65479 => $FFC7

Количество тактов для τ0=(190-3) мкс/0,125мкс=1496; Число вносимое в таймер счетчик 65535-1456 = 64039 => $FA27

Результаты моделирования после коррекции.

Рисунок 5.1 – Длительность импульса


Рисунок 5.3 – Пачка импульсов длительностью 0,2с с линейным законом нарастания и спада уровня сигнала


Рисунок 5.4 – Пачка импульсов длительностью 0,4с с линейным законом нарастания и спада уровня сигнала.


Рисунок 5.5 – Пачка импульсов длительностью 0,6с с линейным законом нарастания и спада уровня сигнала.

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

генератор импульс алгоритм

Заключение

В данной курсовой работе был спроектирован программно-управляемый генератор пачек прямоугольных импульсов с треугольной огибающей. Он собран на микроконтроллере АТ90S2313 фирмы Atmel, который прошит специальной программой. Генератор управляется посредством нажатия одной из трёх кнопок, которая переводит его в заданный режим работы. Работа генератора была промоделирована средствами ЭВМ. Получены пачки импульсов заданной формы и длительности 0,2с; 0,4 с; 0,6 с.

Перечень ссылок

1. Голубцов М.С. Микроконтроллеры AVR: от простого к сложному. Мос-ква, Солон-Пресс, 2003г.

2. Волков С. Генераторы прямоугольных импульсов на МОП-элементах. Москва , Энергоиздат, 1981г.

3. Баранов В.Н. Применение микроконтроллеров AVR: схеммы, алгорит-мы, программы. Москва, Издательский дом «Додэка-ХХI», 2004г.

4. Журнал Радио № 3, 1994 г.

5. http://radiokot.ru

6. http://forum.cxem.net

7. http://RLBN.ru

8. http://avr123.nm.ru

9. http://costya-radio.narod.ru

10. http://radioradar.net


Приложение 1

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

.include "C:\PROGRA~1\VMLAB\include\2313def.inc"

; Тактовая частота 4 МГц

; Делитель таймера0 = 8, для длительности 10 мкс - 5 значений до переполнения

.EQUTCCR0_INIT = 0b10; делитель таймера CK/8

.EQUTCNT0_WAIT10 = 0xFB; 10 мкс до прерывания с учетом накладных расходов

.EQUTCNT0_WAIT190 = 0xA2; 190 мкс до прерывания с учетом накладных расходов

; Делитель таймера1 = 1024

.EQUTCCR1B_INIT = 0b0101; CK/1024 без сброса после уд.сравнения

.EQUTCNT1_INIT = 0xFFF0; задержка начала пачки после старта > 0

.EQUTCNT1_START = 0x76AB; задание начального смещения для 9 сек. до переполнения

.EQUN1CMP = TCNT1_START + 781; 0,2 с

.EQUN2CMP = TCNT1_START + 1563; 0,4 с

.EQUN3CMP = TCNT1_START + 2344; 0,6 с

; Настройка портов ввода выврда

.EQUDDRB_INIT = 0xFF; 8 разрядов для вывода на ЦАП

.EQUDDRD_INIT = 0b0111000; 4 входа + 3 выхода

.EQUPORTD_INIT = 0b0111111; подтягивающие резисторы для входов и нач. уровни для выходов

; Определение клавиш

.EQUKEY_MODE1 = 0; кнопка перехода в режим 1

.EQUKEY_MODE2 = 1; кнопка перехода в режим 2

.EQUKEY_MODE3= 2; кнопка перехода в режим 3

; Регистры с константами

.DEFrc0 = r1; регистр для константы 0

.DEFrc255 = r2; регистр для константы 255

.DEFrcTCNT0_WAIT10 = r3; регистр с константой для задержки на 10 мкс

.DEFrcTCNT0_WAIT190 = r4; регистр с константой для задержки на 190 мкс

.DEFrcPORTD_INIT = r5; регистр с константой для задержки на 190 мкс

; Временные переменные

.DEFrt = r16; временный регистр для основной программы

.DEFrti = r17; временный регистр для прерываний

; Тукущие значения

.DEFCURKEYS = r22; тек. сост. клавиш

.DEFPREVKEYS = r23; пред. сост. клавиш

.CSEG

.ORG 0

rjmp start

.ORG OVF0addr

rjmp FIntTimer0

.ORG OC1addr

rjmp FIntTimer1OC

.ORG OVF1addr

rjmp FIntTimer1OVF

; ++++++++++++++++++++ start +++++++++++++++++++ ;

.ORG 0x0B

start:

; настройкастека

ldirt, LOW(RAMEND)

outspl, rt

; инициализация константных регистров

ldirt, 0

movrc0, rt; rconst0 = 0

ldirt, 255

movrc255, rt; rc255 = "1"

ldirt, TCNT0_WAIT10

movrcTCNT0_WAIT10, rt; TCNT0_WAIT10

ldirt, TCNT0_WAIT190

movrcTCNT0_WAIT190, rt; TCNT0_WAIT190

ldirt, PORTD_INIT

movrcPORTD_INIT, rt; PORTD_INIT

; настройка портов ввода-вывода

ldirt, DDRB_INIT

outDDRB, rt

ldirt, DDRD_INIT

outDDRD, rt

outPORTD, rcPORTD_INIT

; настройкатаймера1

ldirt, TCCR1B_INIT

outTCCR1B, rt

; разрешение прерываний для таймеров

inrt, TIMSK

sbrrt, (1<<TOIE0)+(1<<OCIE1A)+(1<<TOIE1)

outTIMSK, rt

; задание начального режима работы

ldirti, HIGH(TCNT1_INIT)

outTCNT1H, rti

ldirti, LOW(TCNT1_INIT)

outTCNT1L, rti

ldirt, HIGH(N1CMP)

outOCR1AH, rt

ldirt, LOW(N1CMP)

outOCR1AL, rt

; подсветкарежимаработы

outPORTD, rcPORTD_INIT

cbiPORTD, 3

; разрешение общих прерываний

sei

Loop:

rcall keys; опрашиваем клавиатуру в цикле

rjmpLoop

; ---------------------------------------------- ;

; +++++++++++++++++++++ keys +++++++++++++++++++ ;

keys:

inCURKEYS, PIND; состояниеклавиш

keys_10:

; проверканажатия - клавиша 1

sbrcCURKEYS, KEY_MODE1; клавишанажата - пропустить

rjmpkeys_19

sbrsPREVKEYS, KEY_MODE1; клавишабыласброшена - пропустить

rjmpkeys_19

; занесение констант для сравнения

ldirt, HIGH(N1CMP)

outOCR1AH, rt

ldirt, LOW(N1CMP)

outOCR1AL, rt

; подсветкарежимаработы

outPORTD, rcPORTD_INIT

cbiPORTD, 3

keys_19:

keys_20:

; проверка нажатия - клавиша 2

sbrcCURKEYS, KEY_MODE2; клавиша нажата - пропустить

rjmpkeys_29

sbrsPREVKEYS, KEY_MODE2; клавиша была сброшена - пропустить

rjmpkeys_29

; занесение констант для сравнения

ldirt, HIGH(N2CMP)

outOCR1AH, rt

ldirt, LOW(N2CMP)

outOCR1AL, rt

; подсветкарежимаработы

outPORTD, rcPORTD_INIT

cbiPORTD, 4

keys_29:

keys_30:

; проверка нажатия - клавиша 3

sbrcCURKEYS, KEY_MODE3; клавиша нажата - пропустить

rjmpkeys_39

sbrsPREVKEYS, KEY_MODE3; клавиша была сброшена - пропустить

rjmpkeys_39

; занесение констант для сравнения

ldirt, HIGH(N3CMP)

outOCR1AH, rt

ldirt, LOW(N3CMP)

outOCR1AL, rt

; подсветкарежимаработы

outPORTD, rcPORTD_INIT

cbiPORTD, 5

keys_39:

keys_9:

; сохранение пред. сост. клавиш

movPREVKEYS, CURKEYS

ret

; ---------------------------------------------- ;

; ++++++++++++++++ FIntTimer0 ++++++++++++++++++ ;

FIntTimer0:

brtcFIntTimer0_5

; была "1", формируем "0"

outTCNT0, rcTCNT0_WAIT190

outPORTB, rc0

clt

rjmpFIntTimer0_9

FIntTimer0_5:

; был "0", формируем "1"

outTCNT0, rcTCNT0_WAIT10

outPORTB, rc255

set

FIntTimer0_9:

reti

; ---------------------------------------------- ;

; +++++++++++++++ FIntTimer1OC +++++++++++++++++ ;

FIntTimer1OC:

; выключаемсчетчик0

ldirti, 0

outTCCR0, rti

reti

; ---------------------------------------------- ;

; +++++++++++++++ FIntTimer1OVF ++++++++++++++++ ;

FIntTimer1OVF:

; заносим в таймер начальные константы для 9 сек. до переполнения

ldirti, HIGH(TCNT1_START)

outTCNT1H, rti

ldirti, LOW(TCNT1_START)

outTCNT1L, rti

; включаемсчетчик0

ldirti, TCCR0_INIT

outTCCR0, rti

outTCNT0, rcTCNT0_WAIT10

clt

reti

; ---------------------------------------------- ;