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

Генерация линейно нарастающего напряжения происходит по следующему принципу. Сначала на вход ЦАП подается значение амплитуды увеличенное на единицу, затем сравнивается с максимальным значением, если амплитуда не достигла максимального значения амплитуды, то значение опять увеличивается на единицу и подается на вход ЦАП. Если же значение достигло максимальной амплитуды, то вызывается подпрограмм

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

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

В подпрограмме формирования временной задержки выполняются следующие шаги. Сначала в регистр TCNT0 записывается значение константы freq. Рассчитывается оно по следующему алгоритму. Период импульса делим на число равное максимальному значению амплитуды, затем умножаем на тактовую частоту МК, если полученное число больше 255, то делим его на коэффициент предделения. Затем из 255 вычитаем полученное число и записываем значение в регистр TCCR1B. После чего вызывается команда sleep, переводящая МК в режим Idle Mode, в котором ядро не выполняет никаких операций. После того, как таймер отсчитывает нужное число тактов, он вызывает прерывание, выводящее МК из режима Idle Mode, и следующей командой в регистр TCCR0 записывается 0, т.е. таймер-счетчик выключается.

Подпрограмма проверки флага занятости ЖКИ нужна для того, чтобы определить момент, когда ЖКИ свободен и готов к выполнению очередной команды. Последовательность проверки флага занятости следующая. Сначала порт А МК, подключенный к шине данных ЖКИ, настраивается как вход, и к нему подключаются подтягивающие резисторы. Затем выход R/W ЖКИ устанавливается в 1, что настраивает шину данных ЖКИ на запись в порт МК. Затем, в соответствии с временной диаграммой сигналов ЖКИ, выдерживается задержка в 1 мкс, для которой требуются 4 команды nop. После них сигнал E устанавливается в 1, выдерживается задержка еще в 0.5 мкс и значение шины данных записывается во временный регистр temp МК. Затем сигнал E сбрасывается в 0 и опрашивается 7-й бит регистра temp, содержащий значение флага занятости. Если он равен 1, то идет возврат на метку команды установки R/W в 1, если нет, то идет команда выхода из подпрограммы.

Подпрограмма записи команд в ЖКИ содержит следующие шаги. Сначала порт А настраивается на вывод информации. Затем устанавливаются в 0 сигналы RS (по шине данных передаются команды) и R/W (шина данных ЖКИ настроена на прием информации из порта МК). После чего выдерживается время 0.5 мкс, и сигнал E устанавливается в 1. Затем выдерживается время 1 мкс и в шину данных через порт А записывается значение команды из константы comm. После этого сигнал E сбрасывается в 0, и идет выход из подпрограммы.

Подпрограмма записи данных в ЖКИ немногим отличается от записи команд. Различия заключаются лишь в том, что сигнал RS устанавливается в 1, что говорит о передаче данных, а на шину данных подается не код команды, а код отображаемого символа.

Коды отображаемых символов хранятся в EEPROM по следующему принципу. Поскольку изменение цифрового кода амплитуды импульса осуществляется с шагом 5 (приблизительно 0.1 В), а максимальное значение цифрового кода равно 255, то кол-во значений амплитуды равно 46 (вместе с нулевым значением). На ЖКИ отображаются целая, десятичная и сотая части значений амплитуды. Поэтому в первые 46 байта EEPROM записываются коды целой части амплитуды, во вторые 46 байта – коды десятичной части амплитуды, и в третьи 46 байта – коды сотой части. Сама же подпрограмма чтения из EEPROM содержит в себе команды записи адреса считываемого байта в регистры EEARH и EEARL, установки нулевого бита регистра EECR в 1 (разрешение чтения из EEPROM) и чтения значения кода из регистра данных EEDR в константу symbol.

Подпрограмма индикации текущей амплитуды сигнала использует подпрограммы проверки флага занятости ЖКИ, а также записи команд и данных в ЖКИ. Ее можно условно разделить на блоки очистки экрана, индикации целой части значения амплитуды, индикации десятичной точки, десятичной и сотой части значения амплитуды, а также индикации пробела и буквы V. В итоге значение амплитуды по умолчанию выводится на ЖКИ в виде «2.45 V». Каждый из блоков (кроме блоков индикации точки, пробела и буквы V) содержит вызов подпрограммы чтения флага занятости, чтения кода символа из EEPROM, индикации символа на ЖКИ. После блоков вывода целой и десятичной части значение адреса увеличивается на 46.

Подпрограммы уменьшения и увеличения амплитуды действуют по следующему принципу. Сначала текущая амплитуда сравнивается со значениями 0 (при уменьшении амплитуды) и 255 (при увеличении амплитуды). Если текущая амплитуда не равна этим значениям, то в ПП уменьшения амплитуды происходит уменьшение значения константы amplitude на 5, уменьшение константы адреса на единицу и вызов ПП индикации амплитуды, а в ПП увеличения амплитуды происходит соответственно увеличение значения amplitude на 5, увеличение константы address на единицу и вызов ПП индикации амплитуды. Блок-схема алгоритма приведена на чертеже, прилагающемся к пояснительной записке.

Исходный код программы приведен ниже.

; ******************************************************

; Генератор сигнала линейно нарастающего напряжения сверхнизкой частоты с управляемой частотой и амплитудой

; Выполнил студент

; ******************************************************

include «C:\VMLAB\include\8515def.inc»

def temp =r16

def ConstFF = r17

def Const0 = r18

def amplitude = r19

def freq = r20

def max_ampl=r21

def Const5 = r22

def address=r23

def comm=r24

def symbol=r25

reset:

rjmp start

rjmp minus

rjmp plus

reti

reti

reti

reti

reti

reti

reti

reti

reti

start:

; инициализация стека

ldi temp, high(RAMEND)

out SPH, temp

ldi temp, low(RAMEND)

out SPL, temp

; присвоение значений константам

ldi ConstFF, $FF

ldi Const0, $00

ldi Const5, 5

ldi amplitude, 0

ldi freq, 155

ldi max_ampl, 125

ldi amplitude, 0

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

out DDRC, ConstFF

out PORTD, ConstFF

out DDRB, ConstFF

sei

; инициализация таймер-счетчика T0 и режима Idle Mode

ldi temp, 2

out TIMSK, temp

ldi temp, 0b00101010

out MCUCR, temp

ldi temp, 0b11000000

out GIMSK, temp

; инициализация индикатора ЖКИ

rcall bf_check

ldi comm, 0b00001111

rcall command

ldi comm, 0b00111000

rcall bf_check

rcall command

Страница:  1  2  3  4 


Другие рефераты на тему «Коммуникации, связь и радиоэлектроника»:

Поиск рефератов

Последние рефераты раздела

Copyright © 2010-2024 - www.refsru.com - рефераты, курсовые и дипломные работы