AVR

PWM 피아노

작성자 임베디드코리아 작성일17-09-27 14:43 조회2,700회 댓글0건
#include <avr/io.h>  // AVR 입출력에 대한 헤더 파일
#include <util/delay.h>  // delay 함수사용을 위한 헤더파일
 
/* 피아노 음계에 해당하는 PWM 주파수 */
unsigned int DoReMi[8] = {523,587, 659, 698, 783,880, 987, 1046};
 
int main(void) {
  unsigned char piano=0;
 
  DDRB = 0x80; // PWM 출력, OCR1C
 
  TCCR1A |= 0x0A; // COM1C(1:0)=“10”, OC1C핀사용, WGM3(1:0)=“10”
  TCCR1B |= 0x19; // WGM3(3:2)=“11”, CS3(2:0)=“001” 1분주 사용
  TCCR1C = 0x00;  // WGM3(3:0)=“1110”, Fast PWM, 모드 14
  TCNT1 = 0x0000; // 타이머1 카운터 초기화

    while(1)  {
        ICR1 = 14745600/DoReMi[piano]; // 버튼에 맞는 음향을 연주
        OCR1C = ICR1/2;  // 50% 듀티비
        piano++;    // piano 변수 1증가
        if(8 < piano) piano = 0;  // piano가 9가 되면 초기화
      _delay_ms(1000);
  }
}