Лаб3_ПЗА
.docxМІНІСТЕРСТВО ОСВІТИ І НАУКИ УКРАЇНИ ХАРКІВСЬКИЙ НАЦІОНАЛЬНИЙ УНІВЕРСИТЕТ РАДІОЕЛЕКТРОНІКИ
Кафедра СТ
ЗВІТ з лабораторної роботи № 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 для управління за допомогою ШІМ-сигналу п'єзовипромінювачем (зумером) та блоком світлодіодів, підключених до мікроконтролеру.