■PWM■

Timer기능 안에 PWM mode가 있다. 주로 쓰는 것이 Fast Pwm mode.
PWM(Pulse Width Modulation) 신호는 디지털 소스를 사용하여 아날로그 신호를 생성하는 방법입니다. PWM 신호는 듀티 사이클과 주파수라는 두 가지 주요 구성 요소로 구성됩니다.
듀티 사이클은 신호가 하이(또는 켜짐) 상태에 있는 시간을 1 사이클을 완료하는 데 걸리는 총 시간의 백분율로 나타냅니다.
즉, Buzzer에서 PWM가 높은 것은 음향이 높은 것, 듀티 사이클이 짧을수록 높은 음이 나옵니다.
PWM 신호는 다양한 제어 어플리케이션에 사용됩니다. 주 용도는 DC 모터 제어이지만 밸브, 펌프, 유압 장치 및 기타 기계 부품을 제어하는 곳에도 사용할 수 있습니다.

TCCR0의 prescale과 TCNT0,OCR0의 값으로 클럭이 조정된다.
TCNT0은 주파수(Frequency)를 조절할 수 있다.
OCR0은 듀티 사이클 조절할 수 있다.
#include <avr/io.h>
#include <avr/interrupt.h>
#define F_CPU 16000000UL
#include <util/delay.h>
volatile int state, tone;
char f_table[8] = {17, 43, 66, 77, 97, 114, 117, 137};
ISR(TIMER0_OVF_vect)
{
PORTB ^= 1 << 4;
TCNT0 = f_table[tone];
}
int main()
{
DDRD = (0x00 << 7);
int i=0;
DDRB = 0x10;
TCCR0 = 0x03;
TIMSK = 0x01;
sei();
while(1) {
if (!(PIND & ( 1<<PIND7 )) )//버튼이 눌러졌다면
{
tone = f_table[rand()%8];
OCR0 = rand()%255;
}
};
}
'kernel Driver' 카테고리의 다른 글
[Atmega128]Character LCD (0) | 2019.04.30 |
---|---|
GPIO를 이용한 I2C구현 (0) | 2019.04.24 |