AVR 따라하기 > 094 - [타이머 CTC 토글-1] Freq. Test

TODAY351 TOTAL312,436
사이트 이용안내
Login▼/회원가입
포럼 동영상강좌 회원가입


구글 플레이 스토어에서
Basic4mcu를 검색해보세요

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

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

BASIC4MCU | AVR 따라하기 | 2015년 강좌 | 094 - [타이머 CTC 토글-1] Freq. Test

페이지 정보

작성자 키트 작성일2017-08-23 16:31 조회465회 댓글0건

본문

	

 

3660040649_EdQ2gC64_25C725C725BE25C625B325EB-01.JPG3Ftype3Dw740
전자오르간의 펄스를 출력하기 위해서 타이머를 설정하고
타이머로 설정한 펄스값과 계산상의 값의 차이를 보기 위한 예제입니다.
//--------------------------------------------------------
// CVAVR
// [타이머 CTC 토글-1] Freq. Test
//--------------------------------------------------------
#include <mega128.h>
#include <math.h>
//
float         freq[90],freq1[90],err[90];
unsigned char PreScaler[90];
unsigned int  ocra[90];
int           n;
//
void main(void){  
   DDRB=0x20;   // PB5 펄스출력
   TCCR1A=0x40; TCCR1B=9; TCCR1C=0x80; OCR1A=0;
   while(1){     
      for(n=-45;n<45;n++){ freq[n+45]=440.0*pow(2.0,n/12.0); } // 36ms
      //
      for(n=0;n<90;n++){ // 15ms
           if     (((16000000.0/   1.0)/(freq[n]*2.0))<=65535.0){ PreScaler[n]=1; ocra[n]=(16000000.0/   1.0)/(freq[n]*2.0)-1; } 
           else if(((16000000.0/   8.0)/(freq[n]*2.0))<=65535.0){ PreScaler[n]=2; ocra[n]=(16000000.0/   8.0)/(freq[n]*2.0)-1; } 
           else if(((16000000.0/  64.0)/(freq[n]*2.0))<=65535.0){ PreScaler[n]=3; ocra[n]=(16000000.0/  64.0)/(freq[n]*2.0)-1; } 
           else if(((16000000.0/ 256.0)/(freq[n]*2.0))<=65535.0){ PreScaler[n]=4; ocra[n]=(16000000.0/ 256.0)/(freq[n]*2.0)-1; } 
           else if(((16000000.0/1024.0)/(freq[n]*2.0))<=65535.0){ PreScaler[n]=5; ocra[n]=(16000000.0/1024.0)/(freq[n]*2.0)-1; } 
      }
      //
      for(n=0;n<90;n++){ // 11ms
           if     (PreScaler[n]==1){ freq1[n]=(16000000.0/   1.0)/(ocra[n]+1.0)/2.0; } 
           else if(PreScaler[n]==2){ freq1[n]=(16000000.0/   8.0)/(ocra[n]+1.0)/2.0; } 
           else if(PreScaler[n]==3){ freq1[n]=(16000000.0/  64.0)/(ocra[n]+1.0)/2.0; } 
           else if(PreScaler[n]==4){ freq1[n]=(16000000.0/ 256.0)/(ocra[n]+1.0)/2.0; } 
           else if(PreScaler[n]==5){ freq1[n]=(16000000.0/1024.0)/(ocra[n]+1.0)/2.0; } 
      }
      //
      for(n=0; n<90; n++){ err[n]=(freq1[n]-freq[n])/freq[n]*100.0; } // 8ms
   }
}

//--------------------------------------------------------
// AVRStudio
// [타이머 CTC 토글-1] Freq. Test
//--------------------------------------------------------
#include <avr/io.h>
#include <math.h>
//
float         freq[90],freq1[90],err[90];
unsigned char PreScaler[90];
unsigned int  ocra[90];
int           n;
//
int main(void){  
   DDRB=0x20;   // PB5 펄스출력
   TCCR1A=0x40; TCCR1B=9; TCCR1C=0x80; OCR1A=0;
   while(1){     
      for(n=-45;n<45;n++){ freq[n+45]=440.0*pow(2.0,n/12.0); } // 36ms
      //
      for(n=0;n<90;n++){ // 15ms
           if     (((16000000.0/   1.0)/(freq[n]*2.0))<=65535.0){ PreScaler[n]=1; ocra[n]=(16000000.0/   1.0)/(freq[n]*2.0)-1; } 
           else if(((16000000.0/   8.0)/(freq[n]*2.0))<=65535.0){ PreScaler[n]=2; ocra[n]=(16000000.0/   8.0)/(freq[n]*2.0)-1; } 
           else if(((16000000.0/  64.0)/(freq[n]*2.0))<=65535.0){ PreScaler[n]=3; ocra[n]=(16000000.0/  64.0)/(freq[n]*2.0)-1; } 
           else if(((16000000.0/ 256.0)/(freq[n]*2.0))<=65535.0){ PreScaler[n]=4; ocra[n]=(16000000.0/ 256.0)/(freq[n]*2.0)-1; } 
           else if(((16000000.0/1024.0)/(freq[n]*2.0))<=65535.0){ PreScaler[n]=5; ocra[n]=(16000000.0/1024.0)/(freq[n]*2.0)-1; } 
      }
      //
      for(n=0;n<90;n++){ // 11ms
           if     (PreScaler[n]==1){ freq1[n]=(16000000.0/   1.0)/(ocra[n]+1.0)/2.0; } 
           else if(PreScaler[n]==2){ freq1[n]=(16000000.0/   8.0)/(ocra[n]+1.0)/2.0; } 
           else if(PreScaler[n]==3){ freq1[n]=(16000000.0/  64.0)/(ocra[n]+1.0)/2.0; } 
           else if(PreScaler[n]==4){ freq1[n]=(16000000.0/ 256.0)/(ocra[n]+1.0)/2.0; } 
           else if(PreScaler[n]==5){ freq1[n]=(16000000.0/1024.0)/(ocra[n]+1.0)/2.0; } 
      }
      //
      for(n=0; n<90; n++){ err[n]=(freq1[n]-freq[n])/freq[n]*100.0; } // 8ms
   }
}



440*2^(n/12)Hz

 

계산기 freq.

AVR freq.

Clock TCCR1B

OCR1A

error(%)

440*2^(-45/12)

C(도)

32.703209

32.703251

2

30577

0.00012831055

440*2^(-44/12)

C#

34.647831

34.648834

2

28860

0.00289560810

440*2^(-43/12)

D(레)

36.708103

36.709373

2

27240

0.00346052810

440*2^(-42/12)

D#

38.890873

38.892345

2

25711

0.00378616640

440*2^(-41/12)

E(미)

41.203442

41.204830

2

24268

0.00336998490

440*2^(-40/12)

F(파)

43.653530

43.654778

2

22906

0.00285751470

440*2^(-39/12)

F#

46.249294

46.251331

2

21620

0.00440449640

440*2^(-38/12)

G(솔)

48.999424

49.000393

2

20407

0.00197743760

440*2^(-37/12)

G#

51.913097

51.915688

2

19261

0.00498945270

440*2^(-36/12)

A(라)

55

55.002476

2

18180

0.00448747070

440*2^(-35/12)

A#

58.270466

58.271664

2

17160

0.00205561240

440*2^(-34/12)

B(시)

61.735420

61.736015

2

16197

0.00096394058

 

 

댓글 0

조회수 465

등록된 댓글이 없습니다.

AVR 따라하기HOME > AVR 따라하기 > 전체 목록

AVR 따라하기 목록
제목 작성자 작성일 조회
171 2015년 강좌 106 - [타이머인터럽트-19] 누른시간 & 뗀시간 & 더블클릭 체크 키트 17-08-23 680
170 2015년 강좌 105 - [타이머인터럽트-18] 스위치 누르는 시간 & 스위치 누르지 않는 시간 체크 댓글[3] 키트 17-08-23 1003
169 2015년 강좌 WS2812B [1개]- 테스트 - AVRstudio 키트 17-08-23 478
168 2015년 강좌 delay_us()보다 더 짧은 딜레이 함수 - 2 키트 17-08-23 700
167 2015년 강좌 delay_us()보다 더 짧은 딜레이 함수 - 1 키트 17-08-23 732
166 2015년 강좌 104 - [부저] 회로내장형 키트 17-08-23 802
165 2015년 강좌 103 - [타이머인터럽트-17] 스위치 누르는 시간 체크 키트 17-08-23 826
164 2015년 강좌 102 - [타이머인터럽트-16] 스위치 누를 때마다 1칸씩 좌우시프트 키트 17-08-23 878
163 2015년 강좌 101 - [타이머인터럽트-15] 스위치 8개 SRAM에 읽어서 LED에 출력 키트 17-08-23 547
162 2015년 강좌 100 - [타이머인터럽트-14] 스위치 8개 읽어서 LED에 출력 (포트 다이렉트) 키트 17-08-23 666
161 2015년 강좌 099 - [타이머인터럽트-13] 스위치 1개 SRMA에 읽어서 LED에 출력 키트 17-08-23 394
160 2015년 강좌 098 - [타이머인터럽트-12] 스위치 1개 읽어서 LED에 출력 키트 17-08-23 563
159 2015년 강좌 096 - [타이머 CTC 토글-3] 스위치 8개 피아노 키트 17-08-23 519
158 2015년 강좌 095 - [타이머 CTC 토글-2] Sound Test 키트 17-08-23 430
현재글 2015년 강좌 094 - [타이머 CTC 토글-1] Freq. Test 키트 17-08-23 466
게시물 검색

Privacy Policy
MCU BASIC ⓒ 2017