AVR > [PWM 스피커 개념] 128 코드비전 예제(ADC to PWM)

인기검색어 > 아두이노 센서 ATMEGA128

최신글 질문게시판 동영상강좌 가입하기

▼ BASIC4MCU 후원업체 신제품 정보 ▼

▲ BASIC4MCU 후원업체 신제품 정보 ▲

BASIC4MCU > AVR

타이머 | [PWM 스피커 개념] 128 코드비전 예제(ADC to PWM)

페이지 정보

작성자 master 작성일18-03-03 17:49 조회4,937회 댓글0건

본문

사람 음성의 오디오 출력은 16KHz면 알아들을만 합니다.
고음이 많은 클래식 악기 연주 소리는 제대로 안나오겠죠

 

    TCCR3B=0x09OCR3AH=999>>8OCR3AL=999&0xFFETIMSK=0x10//16KHz

타이머3 CTC 비교A매치 인터럽트의 설정입니다.

인터럽트 함수에서는 이 주기로 ADC를 읽고 PWM 출력을 내보냅니다.

16KHz는 62.5us 주기

 

    TCCR1A=0xB2TCCR1B=0x19ICR1=255// PWM

타이머1 모드14 FAST PWM 설정입니다.

타이머클럭은 62.5ns이고 256분해능이므로 
PWM주기는 16us 입니다.
16KHz 샘플링 주기에 정확히 동기시키지 못하므로 약간의 오차(최대 16us)는 발생합니다만
저같은 막귀는 이 차이를 잘 모를 수 있습니다.ㅎㅎ

 

    ADMUX=0x60ADCSRA=0xE5// AVCC레퍼런스 // 좌측정렬 // 프리런닝 // 32분주

16000000Hz/32/13=38461.53846153846Hz = 25us

ADC 변환주기도 16KHz와 정확히 일치 시키기 어려우니 변환시간을 더 빠르게 설정하셔도 됩니다.

 

    ADMUX=0x60ADCSRA=0xE4// AVCC레퍼런스 // 좌측정렬 // 프리런닝 // 16분주

이렇게 설정하면 12.5us 주기가 되겠죠

샘플링 주기가 짧아질 수록 ADC 분해능이 낮아집니다.

 

#include <mega128.h>
//
interrupt[TIM3_COMPA]void timer3_compa_isr(void){
  char data;
  data=ADCH;
  OCR1AL=data;
  OCR1BL=data;
}
//
void main(void){
  DDRB=0x60;
  ADMUX=0x60;  ADCSRA=0xE4;             // AVCC레퍼런스 // 좌측정렬 // 프리런닝 // 16분주
  TCCR1A=0xB2TCCR1B=0x19;   ICR1=255// PWM
  TCCR3B=0x09OCR3AH=999>>8OCR3AL=999&0xFFETIMSK=0x10//16KHz
  SREG=0x80;
  while(1){ }
}

 

OC1A(PB5), OC1B(PB6)는 반대 위상의 출력이 나갑니다.

이 예제에서는 ADC값을 PWM으로 출력하고 있는데
꼭 16KHz로 맞출 필요는 없습니다.
더 빠르게 출력해도 됩니다.

동작시켜본 것은 아니니 참고하세요

댓글 : 0

조회수 : 4,937

등록된 댓글이 없습니다.

게시물 검색

AVR 목록

게시물 검색


Privacy Policy
MCU BASIC ⓒ 2017
PC버전