A : #include<avr/io.h> void main() { DDRE=0xFB; TCCR3A = 0x32; TCCR3B = 0x19; ICR3 = 60000; OCR3B = ICR3 / 2; } A : #include<avr/io.h> #include<avr/signal.h> 마. 부저 제어하기 부저 (Buzzer)란 전기 신호를 소리로 변환시켜 주는 장치이다. 부저에는 내부에 전자석과 진동을 일으키는 판으로 이루어져 있으며, 전자석이 진동판을 아주 빠르 게 흔들어 소리를 발생 시키는 원리를 가지고 있다. 그래서 부저에 음을 출력하면 PWM 파형의 길이에 따라 음의 높이가 다르게 출력이 되는 것이다. 또한, 일반 스 피커와는 달리 출력 주파수의 범위가 한정되어 있어 주로 단순한 용도로 사용된다. 간단한 타이머/카운터를 이용하여 PWM 주파수를 생성한 뒤 부저에 입력하여 음 을 출력해보자. 1) 활용 실습 Q : 6.4_ 음계 ‘도’음을 출력하기 Q : 6.5_ 도트매트릭스의 전체가 1초에 한 번씩 깜박이고, 부저의 ‘도’음이 동시에 출력하게 하기
40
Embed
마.부저 제어하기 - elearning.kocw.netelearning.kocw.net/contents4/document/lec/2013/Mokwon/Parksejun/9.pdf · pwm 파형의 길이에 따라 음의 높이가 다르게 출력이
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
A :
#include<avr/io.h>
void main()
{
DDRE=0xFB;
TCCR3A = 0x32;
TCCR3B = 0x19;
ICR3 = 60000;
OCR3B = ICR3 / 2;
}
A :
#include<avr/io.h>
#include<avr/signal.h>
마. 부저 제어하기
부저 (Buzzer)란 전기 신호를 소리로 변환시켜 주는 장치이다. 부저에는 내부에
전자석과 진동을 일으키는 판으로 이루어져 있으며, 전자석이 진동판을 아주 빠르
게 흔들어 소리를 발생 시키는 원리를 가지고 있다. 그래서 부저에 음을 출력하면
PWM 파형의 길이에 따라 음의 높이가 다르게 출력이 되는 것이다. 또한, 일반 스
피커와는 달리 출력 주파수의 범위가 한정되어 있어 주로 단순한 용도로 사용된다.
간단한 타이머/카운터를 이용하여 PWM 주파수를 생성한 뒤 부저에 입력하여 음
을 출력해보자.
1) 활용 실습
Q : 6.4_ 음계 ‘도’음을 출력하기
Q : 6.5_ 도트매트릭스의 전체가 1초에 한 번씩 깜박이고, 부저의 ‘도’음이
동시에 출력하게 하기
unsigned char count, data;
void main(void)
{
DDRA=0xFF;
DDRC=0xFF;
DDRE=0xFB;
TCCR0=0x07;
TCNT0=0xFF-157;
TIMSK=0x01;
TIFR|=0x01;
TCCR3A = 0x32;
TCCR3B = 0x19;
ICR3 = 60000;
OCR3B = ICR3 / 2;
sei();
while(1)
{
PORTA=0xFF;
PORTC=data;
}
}
SIGNAL(TIMER0_OVF_vect)
{
cli();
TCNT0=0xFF-157;
count++;
if(count==100)
{
data=0xFF;
count=0;
}else
{
data=0x00;
}
sei();
}
A :
#include<avr/io.h>
#include<avr/signal.h>
unsigned char count;
unsigned int data=0;
void m_delay(unsigned int k)
{
unsigned int i, j;
for(i=0; i<2000; i++)
for(j=0; j<k; j++);
}
void buzzer(unsigned int s)
{
if(s==1)
{
ICR3 = 50000;
OCR3B = ICR3 / 2;
}else if(s==2)
{
Q : 6.6_ 부저의 8옥타브를 1초에 한 번씩 올려가며 출력하기
ICR3 = 45000;
OCR3B = ICR3 / 2;
}else if(s==3)
{
ICR3 = 40000;
OCR3B = ICR3 / 2;
}else if(s==4)
{
ICR3 = 35000;
OCR3B = ICR3 / 2;
}else if(s==5)
{
ICR3 = 33000;
OCR3B = ICR3 / 2;
}else if(s==6)
{
ICR3 = 31000;
OCR3B = ICR3 / 2;
}else if(s==7)
{
ICR3 = 29000;
OCR3B = ICR3 / 2;
}else if(s==8)
{
ICR3 = 27000;
OCR3B = ICR3 / 2;
}
}
void main(void)
{
DDRA=0xFF;
DDRC=0xFF;
DDRE=0xFB;
TCCR0=0x07;
TCNT0=0xFF-145;
TIMSK=0x01;
TCCR3A = 0x32;
TCCR3B = 0x19;
TIFR|=0x01;
sei();
while(1){}
}
SIGNAL(TIMER0_OVF_vect)
{
cli();
TCNT0=0xFF-145;
count++;
if(count==100)
{
data++;
buzzer(data);
count=0;
if(data==8)
{
data=0;
}
}
sei();
}
Q : 6.7_ ‘학교 종’노래를 부저로 출력하며, 도트매트릭스 가로 열을 한 줄씩
올리기(단, 가로 열 LED는 출력 후 꺼져야 함)
A :
#include<avr/io.h>
#include<avr/signal.h>
unsigned char count;
unsigned int data=0;
void m_delay(unsigned int k)
{
unsigned int i, j;
for(i=0; i<2000; i++)
for(j=0; j<k; j++);
}
void buzzer(unsigned int s)
{
if(s==1)
{
ICR3 = 33000;
OCR3B = ICR3 / 2;
}else if(s==2)
{
ICR3 = 0;
OCR3B = ICR3 / 2;
}else if(s==3)
{
ICR3 = 33000;
OCR3B = ICR3 / 2;
}else if(s==4)
{
ICR3 = 0;
OCR3B = ICR3 / 2;
}else if(s==5)
{
ICR3 = 31000;
OCR3B = ICR3 / 2;
}else if(s==6)
{
ICR3 = 0;
OCR3B = ICR3 / 2;
}else if(s==7)
{
ICR3 = 31000;
OCR3B = ICR3 / 2;
}else if(s==8)
{
ICR3 = 0;
OCR3B = ICR3 / 2;
}else if(s==9)
{
ICR3 = 33000;
OCR3B = ICR3 / 2;
}else if(s==10)
{
ICR3 = 0;
OCR3B = ICR3 / 2;
}else if(s==11)
{
ICR3 = 33000;
OCR3B = ICR3 / 2;
}else if(s==12)
{
ICR3 = 0;
OCR3B = ICR3 / 2;
}else if(s==13)
{
ICR3 = 40000;
OCR3B = ICR3 / 2;
}else if(s==14)
{
ICR3 = 0;
OCR3B = ICR3 / 2;
}else if(s==15)
{
ICR3 = 33000;
OCR3B = ICR3 / 2;
}else if(s==16)
{
ICR3 = 0;
OCR3B = ICR3 / 2;
}else if(s==17)
{
ICR3 = 40000;
OCR3B = ICR3 / 2;
}else if(s==18)
{
ICR3 = 0;
OCR3B = ICR3 / 2;
}else if(s==19)
{
ICR3 = 45000;
OCR3B = ICR3 / 2;
}else if(s==20)
{
ICR3 = 0;
OCR3B = ICR3 / 2;
}else if(s==21)
{
ICR3 = 40000;
OCR3B = ICR3 / 2;
}else if(s==22)
{
ICR3 = 0;
OCR3B = ICR3 / 2;
}else if(s==23)
{
ICR3 = 50000;
OCR3B = ICR3 / 2;
}else if(s==24)
{
ICR3 = 0;
OCR3B = ICR3 / 2;
}
}
void main(void)
{
unsigned int cnt;
DDRA=0xFF;
DDRC=0xFF;
DDRE=0xFB;
TCCR0=0x07;
TCNT0=0xFF-145;
TIMSK=0x01;
TCCR3A = 0x32;
TCCR3B = 0x19;
TIFR|=0x01;
sei();
while(1)
{
for(cnt=0; cnt<8; cnt++)
{
PORTA=0xFF;
PORTC=0x80>>cnt;
m_delay(50);
}
}
}
SIGNAL(TIMER0_OVF_vect)
{
cli();
TCNT0=0xFF-145;
count++;
if(count==30)
{
data++;
buzzer(data);
count=0;
if(data==24)
{
data=0;
}
}
sei();
}
2) 응용문제
① 슈퍼마리오 또는 알람 음 등 재미있는 멜로디 만들기
바. 모터 제어하기
모터는 크게 회전자(armature or rotor), 고정자(frame, case or housing), 전원 공