Ниже приведены результаты эмуляции в пакете VMLAB, которые представляют собой полученные значения генерируемых частот, сведенные в таблицу 5.1. В качестве примера приводятся окно осциллографа программы, и отображаемая при этом на ЖКИ частота для второго и шестого режимов.
Таблица 1 – Результаты эмуляции в пакете VMLAB
№ кнопки | Задаваемая программно частота, Гц | Полученная в ходе эмуляции частота, Гц |
0 | 2.0 | 2.0 |
1 | 4.0 | 4.0 |
2 | 6.0 | 5.9 |
3 | 8.0 | 8.0 |
4 | 10.0 | 10.0 |
5 | 12.0 | 12.0 |
6 | 14.0 | 14.1 |
7 | 16.0 | 16.0 |
8 | 18.0 | 18.0 |
9 | 20.0 | 20.0 |
10 | 22.0 | 22.0 |
11 | 24.0 | 24.0 |
12 | 26.0 | 26.0 |
13 | 28.0 | 28.0 |
14 | 30.0 | 30.0 |
15 | 32.0 | 32.0 |
Отображаемое на ЖКИ значение частоты соответствует генерируемой в данный момент частоте для всех 16ти режимов. Соответствие кнопок частоте и полученная при анализе частота генерации показаны в таблице 5.1.
Анализ временных соотношений и оценка погрешностей
Расчет константы N, которая записывается в регистр сравнения первого таймер-счетчика выполняется по следующим соотношениям:
|
|
,
Где 0.25 мкс – время тактирования генератора при тактовой частоте f=4МГц;
Согласно техническому заданию расчет константы необходимо провести для шестнадцати режимов. Полученную константу N переведем в шестнадцатеричную систему. Соответственно ниже приведена таблица расчетов для 16ти частот:
Табл. 2 – Расчет коэффициента N в зависимости от частоты
F, МГц | , мкс | ||
2 | 1960 | 7800 | 1E78 |
4 | 976 | 3904 | F40 |
6 | 664 | 2656 | A60 |
8 | 488 | 1952 | 7A0 |
10 | 390 | 1500 | 618 |
12 | 324 | 1296 | 510 |
14 | 279 | 1116 | 45C |
16 | 244 | 976 | 3D0 |
18 | 214 | 906 | 358 |
20 | 195 | 780 | 30C |
22 | 175 | 700 | 2BC |
24 | 162 | 648 | 288 |
26 | 148 | 592 | 250 |
28 | 139 | 556 | 22C |
30 | 128 | 512 | 200 |
32 | 122 | 488 | 1E8 |
Тот факт, что деление приводит к наличию более чем 4х знаков за запятой, и значения необходимо округлять до целых, говорит о том, что при генерации возможно возникновение погрешностей. Однако согласно эмуляции в пакете VMLAB погрешности генерации частоты не превышают 1%.
Выводы
В ходе выполнения данного курсового проекта был разработан алгоритм, спроектирована принципиальная схема и написана программа управления генератора линейно-нарастающего напряжения с дискретно-изменяющейся частотой с помощью матрицы кнопок и плавно-изменяющейся амплитудой.
Отображение генерируемой частоты осуществлялось с помощью ЖКИ.
После выполнения поставленной задачи были сделаны такие существенные выводы:
- проектирование и техническое выполнение генераторов линейно-нарастающего напряжения на базе микроконтроллеров является более оптимальным со схемотехнической точки зрения, с точки зрения управления и компактности устройства, а также точности получаемых значений;
|
|
- погрешности получаемые при генерации весьма малы, что свидетельствует о точности расчета;
- спроектированное устройство целиком и полностью соответствует техническому заданию.
Данное устройство может получить применение в сфере телевидения для горизонтальной развёртки электронного луча в электронно-лучевой трубке, а также широко применяться в импульсной технике.
Приложение А
; ******************************************************
; BASIC.ASM template file for AVR
; ******************************************************
.include "D:\0B54~1\9E9E~1\VMLAB\include\m8515def.inc"
; Define here the variables
; программа генератор пилообразный напряжение
.def temp = r16
.def adr = r17
.def reg = r18
.def const0 = r19
.def const01 = r20
.def time = r21
.def lev =r22
.def Comand =r23
.def lcd =r24
.def x =r25
.equ E = 2
.equ RW = 1
.equ RS = 0
; Define here Reset and interrupt vectors, if any
reset:
rjmp start
reti; Addr $01
reti; Addr $02
reti; Addr $03
rjmp generation; Addr $04
reti; Addr $05
reti; Addr $06 Use 'rjmp myVector'
reti; Addr $07 to define a interrupt vector
reti; Addr $08
reti; Addr $09
reti; Addr $0A
reti; Addr $0B This is just an example
reti; Addr $0C Not all MCUs have the same
reti; Addr $0D number of interrupt vectors
reti; Addr $0E
reti; Addr $0F
reti; Addr $10
; Program starts here after Reset
start: ldi temp,$02
out SPH,temp
ldi temp,$5F
out SPL,temp
;================= настройка портов ===================
ldi temp,$F0
out DDRD,temp
ldi temp,$FF
out PORTD,temp
out DDRC,temp
out PORTC,temp
;================ настройка Т1 и прерываний ==========
ldi temp, $40
out TIMSK, temp
ldi temp, $09
out TCCR1B, temp
sei
;================ загрузка констант ===================
ldi const0,0
ldi const01,$01
ldi lev,$00
ldi x, $00
;================ режим по умолчанию ==================
ldi temp, high($1E78)
out OCR1AH, temp
ldi temp, low($1E78)
out OCR1AL, temp
;================ инициализация ЖКИ ===================
ldi Comand,$0C;1100 определение режима отображения
rcall gotov
rcall LCD_Delay
rcall zap_IR
ldi Comand,$06;110 выбор направления сдвига
rcall LCD_Delay
rcall gotov
rcall LCD_Delay
rcall zap_IR
ldi Comand,$38;развертка в одну строку
rcall LCD_Delay
rcall gotov
rcall LCD_Delay
rcall zap_IR
;================Вывод надписи============================
ldi lcd,$46;F
rcall mm3
ldi lcd,$20
rcall mm3
ldi lcd,$3D;=
rcall mm3
ldi lcd,$20
rcall mm3
ldi lcd,$20
rcall mm3
ldi lcd,$32;2
rcall mm3
ldi lcd,$20
rcall mm3
ldi lcd,$48;H
rcall mm3
ldi lcd,$7A;z
rcall mm3
;================последовательный опрос клавиатуры =============
forever:
ldi reg,$7F
out PORTD,reg
nop
nop
sbis PIND,0
rjmp r3
sbis PIND,1
rjmp r7
sbis PIND,2
rjmp r11
sbis PIND,3
rjmp r15
ldi reg,$BF
out PORTD,reg
nop
nop
sbis PIND,0
rjmp r2
sbis PIND,1
rjmp r6
sbis PIND,2
rjmp r10
sbis PIND,3
rjmp r14
ldi reg,$DF
out PORTD,reg
nop
nop
sbis PIND,0
rjmp r1
sbis PIND,1
rjmp r5
sbis PIND,2
rjmp r9
sbis PIND,3
rjmp r13
ldi reg,$EF
out PORTD,reg
nop
nop
sbis PIND,0
rjmp r0
sbis PIND,1
rjmp r4
sbis PIND,2
rjmp r8
sbis PIND,3
rjmp r12
rjmp forever
;=================== подпрограмма генерации ======================
generation:
out PORTC, lev
inc lev
reti
;================== метки перехода на кнопки =====================
r0:
ldi temp, high($1E78);2Гц
out OCR1AH, temp
ldi temp, low($1E78)
out OCR1AL, temp
ldi lcd, $32
rcall zamena1
rjmp forever
r1:
ldi temp, high($F40);4Гц
out OCR1AH, temp
ldi temp, low($F40)
out OCR1AL, temp
ldi lcd, $34
rcall zamena1
rjmp forever
r2:
ldi temp, high($A60);6 Гц
out OCR1AH, temp
ldi temp, low($A60)
out OCR1AL, temp
ldi lcd, $36
rcall zamena1
rjmp forever
r3:
ldi temp, high($7A0);8Гц
out OCR1AH, temp
ldi temp, low($7A0)
out OCR1AL, temp
ldi lcd, $38
rcall zamena1
rjmp forever
r4:
ldi temp, high($618);10Гц
out OCR1AH, temp
ldi temp, low($618)
out OCR1AL, temp
ldi lcd,$31
rcall zamena
ldi lcd,$30
rcall zamena1
rjmp forever
r5:
ldi temp, high($510);12Гц
out OCR1AH, temp
ldi temp, low($510)
out OCR1AL, temp
ldi lcd,$31
rcall zamena
ldi lcd,$32
rcall zamena1
rjmp forever
r6:
ldi temp, high($45C);14Гц
out OCR1AH, temp
ldi temp, low($45C)
out OCR1AL, temp
ldi lcd,$31
rcall zamena
ldi lcd,$34
rcall zamena1
rjmp forever
r7:
ldi temp, high($3D0);16Гц
out OCR1AH, temp
ldi temp, low($3D0)
out OCR1AL, temp
ldi lcd,$31
rcall zamena
ldi lcd,$36
rcall zamena1
rjmp forever
r8:
ldi temp, high($358);18Гц
out OCR1AH, temp
ldi temp, low($358)
out OCR1AL, temp
ldi lcd,$31
rcall zamena
ldi lcd,$38
rcall zamena1
rjmp forever
r9:
ldi temp, high($30C);20Гц
out OCR1AH, temp
ldi temp, low($30C)
out OCR1AL, temp
ldi lcd,$32
rcall zamena
ldi lcd,$30
rcall zamena1
rjmp forever
r10:
ldi temp, high($2C6);22Гц
out OCR1AH, temp
ldi temp, low($2C6)
out OCR1AL, temp
ldi lcd,$32
rcall zamena
ldi lcd,$32
rcall zamena1
rjmp forever
r11:
ldi temp, high($28B);24Гц
out OCR1AH, temp
ldi temp, low($28B)
out OCR1AL, temp
ldi lcd,$32
rcall zamena
ldi lcd,$34
rcall zamena1
rjmp forever
r12:
ldi temp, high($259);26Гц
out OCR1AH, temp
ldi temp, low($259)
out OCR1AL, temp
ldi lcd,$32
rcall zamena
ldi lcd,$36
rcall zamena1
rjmp forever
r13:
ldi temp, high($22E);28Гц
out OCR1AH, temp
ldi temp, low($22E)
out OCR1AL, temp
ldi lcd,$32
rcall zamena
ldi lcd,$38
rcall zamena1
rjmp forever
r14:
ldi temp, high($208);30Гц
out OCR1AH, temp
ldi temp, low($208)
|
|
out OCR1AL, temp
ldi lcd,$33
rcall zamena
ldi lcd,$30
rcall zamena1
rjmp forever
r15:
ldi temp, high($1E8);32Гц
out OCR1AH, temp
ldi temp, low($1E8)
out OCR1AL, temp
ldi lcd,$33
rcall zamena
ldi lcd,$32
rcall zamena1
rjmp forever
;================== работа с ЖКИ ==============
LCD_Delay: ldi x,$04
L_loop: dec x
brne L_loop
ret
gotov:
ldi temp, $00
out DDRB,temp
ldi temp, $FF
out PORTB,temp
out DDRA, temp
mm1: ldi temp,0b00000010
out PORTA, temp
rcall LCD_Delay
sbi PORTA, E
rcall LCD_Delay
in temp, PIND
rcall LCD_Delay
cbi PORTA,E
rcall LCD_Delay
cbi PORTA,RW
sbrs temp,7
ret
rjmp mm1
zap_IR:
ldi temp, $FF
out DDRD,temp
ldi temp, $00
out PORTA, temp
out PORTD, Comand
sbi PORTA,E
rcall LCD_Delay
cbi PORTA,E
rcall LCD_Delay
ret
zap_DR:
ldi temp, $FF
out DDRD, temp
ldi temp,0b00000001
out PORTA, temp
rcall LCD_Delay
out PORTD, lcd
sbi PORTA,E
rcall LCD_Delay
cbi PORTA,E
rcall LCD_Delay
ret
zamena:
ldi Comand, $84
mm2: rcall LCD_Delay
rcall gotov
rcall LCD_Delay
rcall zap_IR
rcall LCD_Delay
rcall gotov
rcall LCD_Delay
rcall zap_DR
ret
zamena1:
ldi Comand,$85
rjmp mm2
mm3:
rcall LCD_Delay
rcall gotov
rcall LCD_Delay
rcall zap_DR
ret