ВКР Шавро В.В. (1228554), страница 4
Текст из файла (страница 4)
Объявляем библиотеку, содержащую описание и объявление всех специальных функциональных регистров микроконтроллера PIC18F452:
- #include <p18f452.h>;
- #include <delays.h> – библиотека, включающая в себя функции временных задержек;
- #include <math.h> – библиотека для простых вычислительных операций;
- #define LCD_Data PORTD – порту D присвоено имя LED;
- #define LCD_Set_E PORTCbits.RC1 = 1 – разрешена передача данных;
- #define LCD_Reset_E PORTCbits.RC1 = 0 – запрещена передача данных;
- #define LCD_Set_RS PORTCbits.RC0 = 1 – включить передача данных;
- #define LCD_Reset_RS PORTCbits.RC0 = 0 – включить передачу команд;
- #pragma config OSC = HS – режим генератора XT;
- #pragma config OSCS = OFF – запрещено переключение источника тактового// сигнала;
- #pragma config PWRT = ON – разрешена работа таймера включения питания;
- #pragma config BOR = OFF – запрещен сброс МК по снижению напряжения// питания;
- #pragma config WDT = OFF – сторожевой таймер отключен;
- #pragma config STVR = ON – разрешен сброс МК при переполнении стека;
- #pragma config LVP = OFF – низковольтное программирование запрещено.
4.3 Объявление переменных
- unsigned char mg_TMR0L = 0 – объявление переменной mg_TMR0L;
- unsigned char mg_TMR0H = 0 – объявление переменной mg_TMR0H;
- char rash = 0 – объявление переменной rash;
- unsigned int timer = 0 – объявление переменной timer;
- float timer_point = 0.00 – объявление переменной timer_point;
- float km = 0.00 – объявление переменной km;
- unsigned char ed = 0 – объявление переменной ed;
- unsigned char des = 0 – объявление переменной des;
- unsigned char sot = 0 – объявление переменной sot;
- char as = 0 – переменная позиции в первой строке дисплея;
- unsigned char stroca1[17] = {'K','.','M','o','s','h','n','o','s','t','i','=','0','.','0','0'} – массив, содержащий текст «Koef. Moshnosti = » – для первой строки дисплея прототипы функций;
- unsigned char number[10] = {'0','1','2','3','4','5','6','7','8','9'}
4.4 Запись данных на LSD
- void Write_LCD (unsigned char data) – функция записи данных на LCD;
- void Add_LCD (unsigned char add) – функция записи адреса символов, отображаемых на LCD;
- void Write_LCD (unsigned char data) – функция записи данных на LCD;
- LCD_Data = data – в порт D помещены данные;
- Delay1TCY() – временная задержка 1 мкс;
- LCD_Set_E – разрешена передача данных;
- Delay10TCYx(5) – временная задержка 10 мкс;
- LCD_Reset_E – запрещена передача данных;
- Delay1KTCYx(5) – временная задержка 1 мс;
- LCD_Data = 0 – очистка порта D.
4.5 Запись символов адреса, отображаемых на LSD
- void Add_LCD (unsigned char add) – функция записи адреса символов, отображаемых на LCD;
- LCD_Reset_RS – включить передачу команд;
- LCD_Data = 0x80 + add – в порт D помещен адрес символа;
- Delay1TCY() – временная задержка 1 мкс;
- LCD_Set_E – разрешена передача данных;
- Delay10TCYx(5) – временная задержка 10 мкс;
- LCD_Reset_E – запрещена передача данных;
- Delay1KTCYx(5) – временная задержка 1 мс;
- LCD_Data = 0 – очистка порта D;
- LCD_Set_RS – включить передачу данных.
4.6 Определение прерывания высокого уровня
- void prervo (void) – прототип функции прерывания;
- #pragma interrupt prervo – функция prervo определяется как;
- #pragma code high_vector = 0x08 – программа обслуживания прерывания;
- void high_vector (void) – с высоким приоритетом по адресу 0х08;
- _asm GOTO prervo _endasm – перейти к программе обслуживания прерывания;
- #pragma code – Вернуться в программный код, выполняемый до прерывания.
Следующий шаг – настройка прерываний по внутреннему сигналу модуля TMR0 и по внешнему сингалу портов RB0 и RB1:
- if (INTCONbits.TMR0IF = 1) – условие появления флага прерывания по TMR0;
- INTCONbits.TMR0IF = 0 – обнуление флага прерывания по таймеру;
- TMR0H = 0 – обнуление старшего байта;
- TMR0L = 0 – обнуление младшего байта;
- T0CONbits.TMR0ON = 0 – выключение TMR0;
- INTCONbits.INT0IF = 0 – обнуление флага прерывания по входу RB0;
- INTCON3bits.INT1IF = 0 – обнуление флага прерывания по входу RB1;
Вывод массива данных на первую строку дисплея:
- Add_LCD (0x0C);
- Write_LCD (*(number + 0));
- Add_LCD (0x0E);
- Write_LCD (*(number + 0));
- Add_LCD (0x0F);
- Write_LCD (*(number + 0))/
Настройка прерываний по внешнему сигналу потов RB0 и RB1:
- if (INTCONbits.INT0IF =1) – условие появления сигнала, напряжения (порт RB0);
- INTCONbits.INT0IF = 0 – обнуление флага прерывания;
- TMR0H = 0 – обнуление старшего байта;
- TMR0L = 0 – обнуление младшего байта;
- T0CONbits.TMR0ON = 1 – включение TMR0;
- if (INTCON3bits.INT1IF == 1) – условие появления сигнала, напряжения (порт RB1);
- INTCON3bits.INT1IF = 0 – обнуление флага прерывания;
- mg_TMR0L = TMR0L – запись значения TMR0L в // mg_TMR0L;
- mg_TMR0H = TMR0H – запись значения TMR0H в // mg_TMR0H;
- rash = 1 – разрешение на проведение расчета;
- T0CONbits.TMR0ON = 0 – выключение TMR0.
4.7 Начало главной программы
Настройка портов микроконтроллера:
- void main(void);
- TRISA = 0b00000011;
- PORTA = 0b00000000;
- TRISB = 0b00000011;
- PORTB = 0b00000000;
- TRISC = 0b00000000;
- TRISD = 0b00000000;
- PORTC = PORTD = 0b00000000;
Настройка разрешения прерываний, выбора активного фронта сигналов прерывания и глобального прерывания:
- INTCONbits.INT0IE = 1 – разрешение прерывания порта RB0;
- INTCON3bits.INT1IE = 1 – разрешение прерывания порта RB1;
- INTCON2bits.INTEDG0 = 1 – выбор активного фронта сигнала, прерывания (по фронту) RB0;
- INTCON2bits.INTEDG1 = 1 – выбор активного фронта сигнала, прерывания (по фронту) RB1;
- INTCONbits.TMR0IE = 1 – разрешение прерывания по TMR0;
- T0CON = 0b00001000 – настройка TMR0;
- TMR0H = 0 – обнуление старшего байта;
- TMR0L = 0 – обнуление младшего байта;
- INTCONbits.PEIE = 1 – разрешение периферийных прерываний;
- INTCONbits.GIE = 1 – разрешение глобального прерывания.
4.8 Инициализация LSD экрана
- Delay1KTCYx(100) – временная задержка 20 мс;
- LCD_Data = 0 – очистка порта D;
- LCD_Reset_RS – включить передачу команд;
- Write_LCD (0b00111000) – функциональные настройки: 8-битная разрядность интерфейса, страницы знакогенератора отключены;
- Write_LCD (0b00001100) – контроль включение выключение дисплея дисплея: дисплей включен, курсора нет, ничего не мигает;
- Write_LCD (0b00000001) – очистка дисплея;
- Write_LCD (0b00000110) – установка способа записи: курсор: сдвигается
вправо, сдвиг дисплея запрещен;
- Write_LCD (0b10000000) – установка DDRAM адреса (0h);
- LCD_Set_RS – включить передачу данных;
- for (as = 0; as <= 15; as++) Write_LCD (*(stroca1 + as)) – вывод текста из;
- Add_LCD (0x42) – массива stroca1 на первую строку дисплея.
4.9 Расчетная часть
- while(1);
- if (rash == 1);
- timer = mg_TMR0H;
- timer = timer << 8;
- timer |= mg_TMR0L;
- timer_point = timer / 5000.00;
- timer_point = timer_point * 0.314;
- km = cos (timer_point);
- for (ed = 0; km >= 1; ed ++) km = km - 1;
- for (des = 0; km >= 0.1; des ++) km = km - 0.1;
- for (sot = 0; km >= 0.01; sot ++) km = km - 0.01;
- rash = 0;
- km = 0;
- Add_LCD (0x0C);
- Write_LCD (*(number + ed));
- Add_LCD (0x0E);
- Write_LCD (*(number + des));
- Add_LCD (0x0F);
- Write_LCD (*(number + sot)).
Проанализировав программный код и убедившись в его корректности написания, необходимо произвести компиляцию, создать рабочую схему в программе Proteus и загрузить машинный код в микроконтроллер.
5 МОДЕЛИРОВАНИЕ РАБОТЫ ИЗМЕРИТЕЛЯ МОЩНОСТИ В ПРОГРАММЕ PROTEUS
5.1 Введение в систему Proteus 8.0
Цель данного раздела – изучить интерфейс программы Proteus 8.0 для моделирования схемы измерителя мощности.
Программный пакет Proteus фирмы Labcenter Electronics позволяет производить моделирование принципиальных схем, используя обширную библиотеку моделей электронных компонентов, включая следующие устройства: микроконтроллеры, логические элементы, триггеры, счетчики, светодиоды, ЖК индикаторы, температурные датчики, кнопки, переключатели и т.д. Кроме того, пакет содержит целый набор виртуальных измерительных приборов: осциллограф, логический анализатор, вольтметр, амперметр, спектроанализатор и др. Система Proteus состоит из двух модулей:
- ISIS – программа синтеза и моделирования непосредственно электронных схем;
- ARES – программа разработки печатных плат. Далее рассмотрим более детально модуль ISIS.[8]
5.2. Интерфейс системы схемотехнического моделирования Proteus 8.0
При запуске Proteus 8.0 на мониторе появляется рабочее пространство, разделенное на несколько областей (рис. 5.1). Большую часть занимает окно редактирования 1 (рис. 5.1), в котором проектируется принципиальная схема устройства.
Вверху расположены пункты меню 2, предоставляющие пользователю полный набор возможных действий, имеющихся в Proteus 8.0. Под ним находятся кнопки верхней панели инструментов 3, позволяющие выполнять часто используемые команды. Слева расположена панель инструментов 4, с помощью которых проектируется принципиальная схема устройства. В левом верхнем углу рабочего пространства располагается окно предварительного просмотра 5, позволяющее оперативно перемещаться по схеме проекта. Под ним расположено информационное окно 6, в которое выводятся данные различного рода, в зависимости от того, какая из кнопок нажата на левой панели инструментов 4. В нижнем левом углу находятся четыре кнопки управления процессом моделирования 7:
Рисунок 5.1 – Главное окно системы схемотехнического моделирования Proteus 8.0
- «Воспроизвести» – старт процесса моделирования;
- «Шаг» – пошаговое выполнения программы микроконтроллера;
- «Пауза» – пауза процесса моделирования;
- «Стоп» – остановка процесса моделирования.
5.3 Измеритель коэффициента мощности в программе Proteus 8.0
Для моделирования измерителя коэффициента мощности в программе Proteus 8.0 необходимы следующие элементы схемы:
- микроконтроллер (МК) PIC18F452, рисунок 5.2;
- источник постоянного напряжения, резистор, конденсатор, кварцевый резонатор, рисунок 5.3;
- источники сигналов, рисунок 5.4;
- осциллограф, рисунок 5.5;
- алфавитно жидкокристаллический дисплей (ЖКД), рисунок 5.6;
Рисунок 5.2 – Микроконтроллер (МК) PIC18F452
Рисунок 5.3 – Элементы схемы: С1 - конденсатор; Х1 - кварцевый резонатор; R1 - резистор; V1 - источник постоянного напряжения
Рисунок 5.4 – Источники сигналов: (B) - синусоидальный сигнал напряжения; (SYNC) - синхроимпульс
Рисунок 5.5 – Осциллограф
Алфавитно-цифровые жидкокристаллические дисплеи (ЖКД) предназначены для отображения большого объема информации при низком энергопотреблении. Широкое распространение получили конструкции жидкокристаллических дисплеев, базирующихся на формате семисегментных и точечных матриц. Как правило, алфавитно-цифровые ЖКД состоят из внутреннего контроллера управления и ЖК панели. В схеме моделирования измерителя коэффициента мощности используется алфавитно-цифровой ЖКД LM016L, позволяющий отображать 2 строки по 16 символов, отображающихся в матрице 5/8 точек (рисунок 5.6).














