BASIC4MCU | AVR | 타이머 | [PWM 스피커 개념] 128 코드비전 예제(ADC to PWM)
페이지 정보
작성자 master 작성일2018-03-03 17:49 조회5,212회 댓글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; // PWMTCCR3B=0x09; OCR3AH=999>>8; OCR3AL=999&0xFF; ETIMSK=0x10; //16KHzSREG=0x80;while(1){ }}
OC1A(PB5), OC1B(PB6)는 반대 위상의 출력이 나갑니다.이 예제에서는 ADC값을 PWM으로 출력하고 있는데꼭 16KHz로 맞출 필요는 없습니다.더 빠르게 출력해도 됩니다.동작시켜본 것은 아니니 참고하세요
댓글 0
조회수 5,212등록된 댓글이 없습니다.