Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Лаб3_ПЗА

.docx
Скачиваний:
11
Добавлен:
17.01.2020
Размер:
59.82 Кб
Скачать

МІНІСТЕРСТВО ОСВІТИ І НАУКИ УКРАЇНИ ХАРКІВСЬКИЙ НАЦІОНАЛЬНИЙ УНІВЕРСИТЕТ РАДІОЕЛЕКТРОНІКИ

Кафедра СТ

ЗВІТ з лабораторної роботи № 3 з дисципліни: «Периферійні засоби автоматики»

Варіант 7

Виконав: Перевірив:

ст. гр. АКТСІу -17-1 доц. каф. СТ

Черкашин В.А. Ребезюк Л. М.

Харків 2019

3 Вивчення принципів програмного управління яркістю блока світлодіодів та звуковим тоном п’єзовипромінювача, що під’єднанні до мікроконтролера AVR ATMEGA 128, за допомогою генерації ШІМ-сигналУ

3.1 Мета роботи

Вивчення принципів функціонування вбудованого в мікроконтролер AVR АТMEGA128 модуля генерації ШІМ-сигналу та набуття практичних навичок програмування мікроконтролера AVR ATMEGA 128 для управління за допомогою ШІМ-сигналу п'єзовипромінювачем (зумером) та блоком світлодіодів, підключених до мікроконтролеру.

3.2 Хід роботи

В ході виконання лабораторної роботи була написана програма, яка керує за допомогою ШІМ-сигналу п'єзовипромінювачем (зумером) та блоком світлодіодів, підключених до мікроконтролеру.

Схема алгоритму (див. рис. 3.1) та тексту програми вирішення завдання з розробки програми управління за допомогою ШІМ-сигналу п'єзовипромінювачем (зумером) та блоком світлодіодів наведено нижче.

Рисунок 3.1 – Схема алгоритму мікропрограмного виведення мелодії за допомогою ШІМ

Текст програми (main.c):

#include <avr/io.h>

#include <util/delay.h>

#include <avr/interrupt.h>

#include "t6963c.h"

#include "graphic.h"

#include <stdio.h>

#define F_CPU 11059200

#define TIM_MODE_DISABLED 0

#define TIM_MODE_PWM 1

#define TIM_MODE_PWM_BUZZ 2

#define TIM_MODE_CTC 3

/*global variable to store info about timer mode*/

volatile uint8_t timMode = 0;

/*string to show debug info on display*/

char* modeStrings[] = {

"Timer stopped ",

"PWM mode ",

"PWM with buzzer ON",

"CTC with buzzer ON"

};

/*function for polling buttons

returns 1 if button was pressed, 0 otherwise*/

uint8_t pollButton(volatile uint8_t *pinRegister, volatile uint8_t pinMask, uint8_t waitForRelease){

if (!(*pinRegister & (1 << pinMask))){

//delay for contact bounce protection

_delay_ms(50);

if (waitForRelease){

//wait for button to be released

while (!(*pinRegister & (1 << pinMask))){}

}

return 1;

} else {

return 0;

}

}

/*performs configuration of Timer0 periferal*/

void switchTimerMode(uint8_t mode){

switch (mode){

case TIM_MODE_DISABLED:

//stop timer

TCCR0 = 0x00;

TIMSK = 0x00;

DDRB &= ~(1 <<PB4);

break;

case TIM_MODE_PWM:

//enable PWM mode

TCCR0 = (1<<WGM01) | (1<<WGM00) | (1 << COM01) | (1 << CS01) | (1 << CS00);

//enable compare and overflow interrupts

TIMSK = (1<<OCIE0) | (1<<TOIE0);

//disable buzzer

DDRB &= ~(1 <<PB4);

break;

case TIM_MODE_PWM_BUZZ:

TCCR0 = (1<<WGM01) | (1<<WGM00) | (1 << COM01) | (1 << CS01) | (1 << CS00);

TIMSK = (1<<OCIE0) | (1<<TOIE0);

//enable buzzer

DDRB |= (1 <<PB4);

break;

case TIM_MODE_CTC:

//start timer in CTC mode

TCCR0 = (1<<WGM01) | (1 << COM00) | (1 << CS01) | (1 << CS00);

TIMSK = 0x00;

//enable buzzer

DDRB |= (1 <<PB4);

break;

}

}

/*draws compare register content on screen*/

inline void showCompareRegisterInfo(){

char ocrBuf[25];

GLCD_TextGoTo(0,1);

sprintf(ocrBuf, "Compare register: %3d", OCR0);

GLCD_WriteString(ocrBuf);

}

/*enable configure buttons and LED ports */

void initializePorts(){

PORTB = 0xFF;

DDRD = 0xFF;

}

int main(void) {

GLCD_InitalizeInterface();

GLCD_Initalize(); // Initalize LCD

GLCD_ClearGraphic(); // Clear graphic area

GLCD_ClearText(); // Clear text area

GLCD_ClearCG(); // Clear character generator area

GLCD_TextGoTo(0,0);// set text coordinates

GLCD_WriteString("TIMER SAMPLE"); // write text

OCR0 = 0x88;

initializePorts();

sei();

showCompareRegisterInfo();

int iter = 1;

while(iter>0){

_delay_ms(200);

if (pollButton(&PINB, PB5, 0)){

iter=0;

} else if (pollButton(&PINB, PB7, 0)){

if(timMode==3){timMode=1;}else{timMode++;}

timMode = timMode % (TIM_MODE_CTC + 1);

switchTimerMode(timMode);

}

GLCD_ClearText();

GLCD_TextGoTo(0,0);

GLCD_WriteString(modeStrings[timMode]);

showCompareRegisterInfo();

OCR0=0;

showCompareRegisterInfo();

_delay_ms(10000);

OCR0=140;

showCompareRegisterInfo();

_delay_ms(1000);

OCR0=0;

showCompareRegisterInfo();

_delay_ms(7000);

OCR0=140;

showCompareRegisterInfo();

_delay_ms(7000);

OCR0=180;

showCompareRegisterInfo();

_delay_ms(7000);

OCR0=120;

showCompareRegisterInfo();

_delay_ms(7000);

if (pollButton(&PINB, PB5, 0)){

OCR0+=40;

showCompareRegisterInfo(); }

else if (pollButton(&PINB, PB6, 1)){

//switch modes

timMode++;

timMode = timMode % (TIM_MODE_CTC + 1);

switchTimerMode(timMode);

//refresh info on the screen

GLCD_ClearText();

GLCD_TextGoTo(0,0);

GLCD_WriteString(modeStrings[timMode]);

showCompareRegisterInfo();

} else if (pollButton(&PINB, PB7, 0)){

OCR0-=40;

showCompareRegisterInfo();

}

}

}

/*interrupt service routine(ISR) for Timer0 overflow event*/

ISR(TIMER0_OVF_vect) {

PORTD = 0x00;

}

/*ISR for Timer0 compare match event*/

ISR(TIMER0_COMP_vect) {

PORTD = 0xFF;

}

ВИСНОВКИ

На лабораторній роботі були засвоєні принципи функціонування вбудованого в мікроконтролер AVR АТMEGA128 модуля генерації ШІМ-сигналу та набуття практичних навичок програмування мікроконтролера AVR ATMEGA 128 для управління за допомогою ШІМ-сигналу п'єзовипромінювачем (зумером) та блоком світлодіодів, підключених до мікроконтролеру.

Соседние файлы в предмете Периферийные средства автоматики