Программно управляемый генератор линейно нарастающего напряжения сверхнизкой частоты на микроконтроллере
Генерация линейно нарастающего напряжения происходит по следующему принципу. Сначала на вход ЦАП подается значение амплитуды увеличенное на единицу, затем сравнивается с максимальным значением, если амплитуда не достигла максимального значения амплитуды, то значение опять увеличивается на единицу и подается на вход ЦАП. Если же значение достигло максимальной амплитуды, то вызывается подпрограмм
а формирования временной задержки. После этого на вход ЦАП подается цифровой код, равный нулю, затем опять вызывается подпрограмма временной задержки и происходит переход на метку блока опроса кнопок. Перед блоком генерирования сигнала 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
Другие рефераты на тему «Коммуникации, связь и радиоэлектроника»:
Поиск рефератов
Последние рефераты раздела
- Микроконтроллер системы управления
- Разработка алгоритмического и программного обеспечения стандарта IEEE 1500 для тестирования гибкой автоматизированной системы в пакете кристаллов
- Разработка базы данных для информатизации деятельности предприятия малого бизнеса Delphi 7.0
- Разработка детектора высокочастотного излучения
- Разработка микропроцессорного устройства для проверки и диагностики двигателя внутреннего сгорания автомобиля
- Разработка микшерного пульта
- Математические основы теории систем