Смекни!
smekni.com

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

Изменение частоты сигнала осуществляется матрицей кнопок 4х4.

Индикация частоты осуществляется алфавитно-цифровым ЖКИ с контроллером HD44780. Так как необходимо выводить не более 16ти символов, занимающих одну строку, был выбран символьный ЖКИ формата 16х1 WH1601B фирмы Winstar.


3. Разработка принципиальной схемы устройства

Разрабатываемое устройство должно генерировать линейно-нарастающее напряжение с дискретно-изменяющейся частотой и плавно-изменяющейся амплитудой. Принципиальная схема устройства приведена на чертеже РТ 468.524.008 ЭЗ.

Для дискретного изменения частоты будет использована матричная клавиатура 4х4, подключенная к порту D микроконтроллера. К кнопкам клавиатуры програмно подключены подтягивающие резисторы во избежание «обрыва» на входе. Подтяжка работает следующим образом: в ненажатом состоянии сопротивление между нулём и входом очень велико, и через резистор на входе создаётся потенциал, воспринимаемый МК как логическая единица. При нажатии картина меняется: теперь резистор - относительно бесконечное сопротивление, а на пине - потенциал нуля. Клавиатура будет обеспечивать изменение частоты от 2 Гц до 32 Гц с шагом 2 Гц. По умолчанию будет установлен режим генерации частоты 2Гц.

Цифровое значение амплитуды необходимо подавать на ЦАП, подключенный к порту С микроконтроллера.

Регулирование амплитуды производится переменным резистором R1, подключенным ко входу управления ЦАП.

Отображение генерируемой частоты в данном режиме будет осуществляться ЖКИ. Шина передачи данных на ЖКИ подключена к порту А микроконтроллера. Управляющие сигналы подключены к ножкам РВ0, РВ1, РВ2.

Питание генератора осуществляется с помощью трансформатора, выпрямительного мостика и интегрального стабилизатора 78LR05.


4. Разработка алгоритма и программы функционирования устройства

Алгоритм главной программы включает в себя следующие блоки:

-инициализация МК. В данном блоке осуществляется инициализация стека, настройка портов(на ввод/вывод данных), конфигурирование первого таймер-счетчика, настройка/разрешение прерываний, загрузка констант. Ниже приведен листинг инициализации МК:

.include "D:\0B54~1\9E9E~1\VMLAB\include\m8515def.inc".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 = 0reset:rjmp startreti ; Addr $01reti ; Addr $02reti ; Addr $03rjmp generation reti ; Addr $05reti ; Addr $06 reti ; Addr $07 reti ; Addr $08reti ; Addr $09reti ; Addr $0Areti ; Addr $0B reti ; Addr $0C reti ; Addr $0D reti ; Addr $0Ereti ; Addr $0Freti ; Addr $10 ; Program starts here after Resetstart: ldi temp,$02out SPH,templdi temp,$5Fout SPL,temp;====== настройка портов ===========ldi temp,$F0out DDRD,templdi temp,$FFout PORTD,tempout DDRC,tempout PORTC,temp;===== настройка Т1 и прерываний ====ldi temp, $40out TIMSK, templdi temp, $09out TCCR1B, tempsei;======== загрузкаконстант ========ldi const0,0ldi const01,$01ldi lev,$00ldix, $00;===== режим по умолчанию ========ldi temp, high($1E78)out OCR1AH, templdi temp, low($1E78)out OCR1AL, templdi adr,0

-инициализация ЖКИ. В данном блоке реализуется инициализацию ЖКИ: определение направления отображения, выбор направления сдвига и настройка развертки в одну строку. Настройка каждого из параметров происходит по следующему алгоритму:

Рис. 4.1 — Алгоритм последовательности конфигурации ЖКИ

Листинг инициализации ЖКИ

ldi Comand,$0C ;определение режима отображенияrcall gotovrcall LCD_Delayrcall zap_IRldi Comand,$06 ; выбор направления сдвигаrcall LCD_Delayrcall gotov rcall LCD_Delayrcall zap_IRldi Comand,$38 ;развертка в одну строкуrcall LCD_Delayrcall gotovrcall LCD_Delayrcall zap_IR

-установка режима по умолчанию. Данный блок алгоритма включает в себя установку частоты по умолчанию, а также установку индикации по умолчанию. Листинг установки режима и индикации по умолчанию:

ldi temp, high($1E78)out OCR1AH, templdi temp, low($1E78)out OCR1AL, temp;=====Выводнадписи==============ldi lcd,$46 ;Frcall mm3ldi lcd,$20rcall mm3ldi lcd,$3D ;=rcall mm3 ldi lcd,$20rcall mm3ldi lcd,$20rcall mm3ldi lcd,$32 ;2rcall mm3ldi lcd,$20rcall mm3ldi lcd,$48 ;Hrcall mm3ldi lcd,$7A ;z

После инициализации МК, ЖКИ и установки режима по умолчанию следует реализовать динамический опрос клавиатуры, который представляет собой следующую последовательность действий: группы кнопок условно разбиты на "линейки" и "колонки". Сначала программно на выходах PВ0-PВ3 выставляются единицы, а на P40 - ноль. При этом включена первая колонка, и осуществляется проверка нажатия кнопок именно этой колонки. Затем первая колонка отключается, и подключается следующая, и т.д.

Алгоритм опроса клавиатуры, который является частью главной программы, указан в чертеже РТ 468.524.008 П3, а ниже можно ознакомиться с листингом динамического опроса клавиатуры:

forever:ldi reg,$7F ;маска 01111111out PORTD,regnopnopsbis PIND,0 ;проверканажатиякнопкиrjmp r3;переход к метке нажатия кнопкиsbis PIND,1rjmp r7sbis PIND,2rjmp r11sbis PIND,3rjmp r15ldi reg,$BF ;маска 10111111out PORTD,reg nopnopsbis PIND,0rjmp r2sbis PIND,1rjmp r6sbis PIND,2rjmp r10sbis PIND,3rjmp r14 ldi reg,$DF ;маска 11011111out PORTD,regnopnopsbis PIND,0rjmp r1sbis PIND,1rjmp r5sbis PIND,2rjmp r9sbis PIND,3rjmp r13ldi reg,$EF ;маска 11101111out PORTD,regnopnopsbis PIND,0rjmp r0sbis PIND,1rjmp r4sbis PIND,2rjmp r8sbis PIND,3rjmp r12rjmp forever

Как видно из блок-схемы алгоритма работы программы, в случае нажатия какой-либо кнопки, программа переходит на метку той кнопки, которая оказалась нажатой. Здесь с помощью первого таймер-счетчика устанавливается порог счета, который определяет частоту данного режима, а также вызывается подпрограмма замены символа, который отображает частоту данного режима. После чего программа возвращается обратно на метку forever, где снова начинается динамический опрос клавиатуры. Ниже приведен листинг блока обработки нажатий кнопок:

r0:ldi temp, high($1E78) ;2Гцout OCR1AH, templdi temp, low($1E78)out OCR1AL, templdi lcd, $32rcall zamena1rjmp foreverr1:ldi temp, high($F40) ;4Гцout OCR1AH, templdi temp, low($F40)out OCR1AL, templdi lcd, $34rcall zamena1rjmp foreverr2:ldi temp, high($A60) ;6 Гцout OCR1AH, templdi temp, low($A60)out OCR1AL, templdi lcd, $36rcall zamena1rjmp foreverr3:ldi temp, high($7A0) ;8Гцout OCR1AH, templdi temp, low($7A0)out OCR1AL, templdi lcd, $38rcall zamena1rjmp foreverr4:ldi temp, high($618) ;10Гцout OCR1AH, templdi temp, low($618)out OCR1AL, templdi lcd,$31rcall zamenaldi lcd,$30rcall zamena1rjmp foreverr5:ldi temp, high($510) ;12Гцout OCR1AH, templdi temp, low($510)out OCR1AL, templdi lcd,$31rcall zamenaldi lcd,$32rcall zamena1rjmp foreverr6:ldi temp, high($45C) ;14Гцout OCR1AH, templdi temp, low($45C)out OCR1AL, templdi lcd,$31rcall zamenaldi lcd,$34rcall zamena1rjmp foreverr7:ldi temp, high($3D0) ;16Гцout OCR1AH, templdi temp, low($3D0)out OCR1AL, templdi lcd,$31rcall zamenaldi lcd,$36rcall zamena1rjmp foreverr8:ldi temp, high($358) ;18Гцout OCR1AH, templdi temp, low($358)out OCR1AL, templdi lcd,$31rcall zamena ldi lcd,$38rcall zamena1rjmp foreverr9:ldi temp, high($30C) ;20Гцout OCR1AH, templdi temp, low($30C)out OCR1AL, templdi lcd,$32rcall zamenaldi lcd,$30rcall zamena1rjmp foreverr10:ldi temp, high($2C6) ;22Гцout OCR1AH, templdi temp, low($2C6)out OCR1AL, templdi lcd,$32rcall zamenaldi lcd,$32rcall zamena1rjmp foreverr11:ldi temp, high($28B) ;24Гцout OCR1AH, templdi temp, low($28B)out OCR1AL, templdi lcd,$32rcall zamenaldi lcd,$34rcall zamena1rjmp foreverr12:ldi temp, high($259) ;26Гцout OCR1AH, templdi temp, low($259)out OCR1AL, templdi lcd,$32rcall zamenaldi lcd,$36rcall zamena1rjmp foreverr13:ldi temp, high($22E) ;28Гцout OCR1AH, templdi temp, low($22E)out OCR1AL, templdi lcd,$32rcall zamenaldi lcd,$38rcall zamena1rjmp foreverr14:ldi temp, high($208) ;30Гцout OCR1AH, templdi temp, low($208)out OCR1AL, templdi lcd,$33rcall zamenaldi lcd,$30rcall zamena1rjmp foreverr15:ldi temp, high($1E8) ;32Гцout OCR1AH, templdi temp, low($1E8)out OCR1AL, templdi lcd,$33rcall zamenaldi lcd,$32rcall zamena1rjmp forever

Был полностью описан алгоритм основной программы. Далее будет приведен алгоритм подпрограммы генерации и приведен ее листинг.

Подпрограмма генерации вызывается по прерыванию от первого таймер-счетчика при нажатии кнопки. Прерывания предварительно разрешены в инициализации микроконтроллера:

ldi temp, $40 ;настройка прерываний от Т1out TIMSK, temp sei ; разрешение общих прерываний

Генерация пилообразных импульсов была организована следующим образом: создана переменная, в которую изначально записано значение 0 и командой inc происходит увеличение значения переменной на 1, пока оно не достигнет 255. Далее сброс значения константы в ноль, и возобновление счета до порога. Блок-схема алгоритма подпрограммы генерации приведена на рис. 4.3.

Листинг подпрограммы генерации

generation:out PORTC, lev inc levreti

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

Весьма важным блоком программы является работа с ЖКИ.

При установке режима по умолчанию на ЖКИ выводится следующее:

«F = 2 Hz ». Далее при нажатии на кнопки изменяются лишь 4й и 5й символы, отображающие значение частоты, что происходит при помощи подпрограмм zamena и zamena1 соответственно. Для отображения на ЖКИ одного символа необходимо в переменную lcd записать значение символа, который необходимо отобразить, а далее проверить ЖКИ на готовность к общению и произвести запись в регистр DR. На рис. 4.4 приведен алгоритм вывода надписи на ЖКИ.

Рассмотрим алгоритм, который реализован в подпрограммах готовности и записи в регистры IR и DR. Для этого на рис. 4.5 приведена а блок-схема алгоритма подпрограммы готовности, на рис.4.6а подпрограмма записи в регистр DR, на рис. 4.6б подпрограмма записи в регистр IR.

Для осуществления работы с ЖКИ в каждой конкретной подпрограмме формируются необходимые в данном случае временные диаграммы :для случая записи в регистр IR и DR.

Рис. 4.5 – Блок-схема алгоритма проверки ЖКИ на готовность

Листинг подпрограммы готовности:

gotov:ldi temp, $00out DDRB,templdi temp, $FFout PORTB,tempout DDRA, tempmm1: ldi temp,0b00000010out PORTA, temprcall LCD_Delay sbi PORTA, Ercall LCD_Delayin temp, PINDrcall LCD_Delaycbi PORTA,Ercall LCD_Delaycbi PORTA,RWsbrs temp,7retrjmp mm1

а). б).

Рис. 4.6 – Блок-схема алгоритма подпрограмм записи в регистр IR(a) и записи в регистр DR(б)