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

TODAY618 TOTAL2,171,817
사이트 이용안내
Login▼/회원가입
최신글보기 질문게시판 기술자료 동영상강좌

아두이노 센서 ATMEGA128 PWM LED 초음파 AVR 블루투스 LCD UART 모터 적외선


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

페이지 정보

작성자 master 작성일2018-03-03 17:49 조회3,930회 댓글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

조회수 3,930

등록된 댓글이 없습니다.

AVRHOME > AVR > 전체 목록

게시물 검색

2022년 1월 2월 3월 4월 5월 6월 7월 8월 9월 10월 11월 12월
2021년 1월 2월 3월 4월 5월 6월 7월 8월 9월 10월 11월 12월
2020년 1월 2월 3월 4월 5월 6월 7월 8월 9월 10월 11월 12월
2019년 1월 2월 3월 4월 5월 6월 7월 8월 9월 10월 11월 12월
2018년 1월 2월 3월 4월 5월 6월 7월 8월 9월 10월 11월 12월
Privacy Policy
MCU BASIC ⓒ 2020
모바일버전으로보기