타이머 | [PWM 스피커 개념] 128 코드비전 예제(ADC to PWM)
페이지 정보
작성자 master 작성일18-03-03 17:49 조회4,937회 댓글0건본문
사람 음성의 오디오 출력은 16KHz면 알아들을만 합니다.
고음이 많은 클래식 악기 연주 소리는 제대로 안나오겠죠
TCCR3B=0x09; OCR3AH=999>>8; OCR3AL=999&0xFF; ETIMSK=0x10; //16KHz
타이머3 CTC 비교A매치 인터럽트의 설정입니다.
인터럽트 함수에서는 이 주기로 ADC를 읽고 PWM 출력을 내보냅니다.
16KHz는 62.5us 주기
TCCR1A=0xB2; TCCR1B=0x19; ICR1=255; // PWM
타이머1 모드14 FAST PWM 설정입니다.
타이머클럭은 62.5ns이고 256분해능이므로
PWM주기는 16us 입니다.
16KHz 샘플링 주기에 정확히 동기시키지 못하므로 약간의 오차(최대 16us)는 발생합니다만
저같은 막귀는 이 차이를 잘 모를 수 있습니다.ㅎㅎ
ADMUX=0x60; ADCSRA=0xE5; // AVCC레퍼런스 // 좌측정렬 // 프리런닝 // 32분주
16000000Hz/32/13=38461.53846153846Hz = 25us
ADC 변환주기도 16KHz와 정확히 일치 시키기 어려우니 변환시간을 더 빠르게 설정하셔도 됩니다.
ADMUX=0x60; ADCSRA=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=0xB2; TCCR1B=0x19; ICR1=255; // PWM
TCCR3B=0x09; OCR3AH=999>>8; OCR3AL=999&0xFF; ETIMSK=0x10; //16KHz
SREG=0x80;
while(1){ }
}
OC1A(PB5), OC1B(PB6)는 반대 위상의 출력이 나갑니다.
이 예제에서는 ADC값을 PWM으로 출력하고 있는데
꼭 16KHz로 맞출 필요는 없습니다.
더 빠르게 출력해도 됩니다.
동작시켜본 것은 아니니 참고하세요
댓글 : 0
조회수 : 4,937
등록된 댓글이 없습니다.