Chapter. 7 타이머와 PWM HBE-MCU-Multi AVR Jaeheug, Lee
목차 1. PWM(Pulse Width Modulatio) 2. 8비트타이머 / 카운터의동작모드 3. 16비트타이머 / 카운터 4. PWM으로 LED 밝기조절하기 5. 타이머로버저울리기
PWM(Pulse Width Modulatio) 펄스 (Pulse) 와펄스폭 (Pulse Width) 펄스 : 짧은시간동안생기는진동현상 펄스폭 : 하나의펄스가가지는폭 펄스 (Pulse) 전압 시간 펄스폭 (Pulse Width)
PWM(Pulse Width Modulatio) PWM( 펄스폭변조 ) 펄스폭을전송하고자하는신호에따라변화시키는변조방식 모터제어나전압제어등에널리사용 100 50% 30% 10% PWM 주기안에서의펄스폭으로신호의값을나타냄 PWM 주기 ATmega128 의타이머는펄스를만드는데매우유용하다 10% 30% 50% 100 펄스폭 (Pulse Width)
8 비트타이머 / 카운터의동작모드 Normal Mode( 일반동작모드 ) 카운터는업카운터로서만동작 MAX(0xFF) 값이되면, BOTTOM(0x00) 값부터다시시작 MAX 위치에서오버플로우인터럽트발생 TCNT의초기값을설정하여전체타이머주기를결정 TCCR레지스터의 WGM1:0 = 00으로설정 숫자세기구간 인터럽트발생위치 0 TCNT ( 초기값 ) 255
8 비트타이머 / 카운터의동작모드 CTC(Clear Timer o Compare match) Mode 카운트의한계값 ( 최대로세는수 ) 을설정 카운터는업카운터로서만동작 0으로부터설정된한계값까지세고다시 0으로클리어 TCNT 값이증가하여, OCR값과일치하면출력비교인터럽트발생 OCR의값을바꾸면그다음카운터주기를원하는대로변경가능 OC단자를이용하여출력파형발생가능 TCCR의 COM1~0을 01로설정 OCR레지스터값을바꿔가면서출력비교에의해 OC의신호를토글 출력되는파형의주기는 foc = fclk / (2*N*(1+OCR0)) 로계산 TCCR레지스터의 WGM1:0를 10 으로설정
8 비트타이머 / 카운터의동작모드 CTC(Clear Timer o Compare match) Mode 인터럽트발생위치 숫자세기구간 0 255 OCR ( 한계값 )
8 비트타이머 / 카운터의동작모드 CTC(Clear Timer o Compare match) Mode
8 비트타이머 / 카운터의동작모드 Fast PWM Mode 0에서 255까지세는동안두번의인터럽트발생가능 카운터는업카운터로서만동작 TCNT 값이증가하여, OCR값과일치하면출력비교인터럽트발생 TCNT는업카운팅을계속하여 255까지증가했다가 0으로바뀌는순간오버플로우인터럽트발생 OCR의값을바꾸면그다음카운터주기를원하는대로변경가능 두가지모드로 OC0핀에구형파출력가능 비반전비교출력모드 TCCR 레지스터의 COM 비트를 10 로설정 TCNT0가 OCR0와일치하면, OC0 핀에 0를출력하고 TCNT0가 0이되면 OC0 핀에 1을출력 반전비교출력모드 TCCR 레지스터의 COM 비트를 11 로설정 TCNT0가 OCR0와일치하면, OC0 핀에 1을출력하고, TCNT0가 0이되면 OC0 핀에 0을출력 출력파형주파수 foc = fclk / (N*256)
8 비트타이머 / 카운터의동작모드 Fast PWM Mode TCCR 레지스터의 WGM1:0 를 11 으로설정 높은주파수의 PWM 파형발생시유용 인터럽트발생위치 숫자세기구간 0 255 OCR ( 한계값 )
8 비트타이머 / 카운터의동작모드 Fast PWM Mode
8 비트타이머 / 카운터의동작모드 PCPWM(Phase Correct Pulse Width Modulatio) Mode Fast PWM 과유사 업카운팅과다운카운팅이번갈아일어남 TCNT 값이증가하여, OCR 값과일치하면출력비교인터럽트발생 TCNT 는업카운팅을계속하여 TCNT 는 255 에도달하면다운카운팅시작. 다운카운팅을하다가 0 에도달하면오버플로우인터럽트가발생 OCR 의값을바꾸면그다음카운터주기를원하는대로변경가능 PWM 주기를변경하기위해 OCR 레지스터에새로운값을기록하더라도즉시변경되지않고 TCNT 이 255 에도달하면갱신됨.
8 비트타이머 / 카운터의동작모드 PCPWM(Phase Correct Pulse Width Modulatio) Mode 두가지모드로 OC0 핀에구형파출력가능 비반전비교출력모드 (TCCR 레지스터의 COM 비트를 10 로설정 ) 업카운트중에 TCNT0와 OCR0가일치하면, OC0핀에 0를출력다운카운트중에일치하면, OC0핀에 1을출력 반전비교출력모드 (TCCR 레지스터의 COM 비트를 11 로설정 ) 업카운트중에 TCNT0와 OCR0가일치하면, OC0핀에 1을출력다운카운트중에일치하면, OC0핀에 0를출력 출력파형주파수 foc = fclk / (N*256)
8 비트타이머 / 카운터의동작모드 PCPWM(Phase Correct Pulse Width Modulatio) Mode TCCR 레지스터의 WGM1:0 를 01 으로설정 높은분해능의 PWM 파형발생시유용 인터럽트발생위치 인터럽트발생위치 숫자세기구간 0 255 OCR ( 한계값 )
8 비트타이머 / 카운터의동작모드 PCPWM(Phase Correct Pulse Width Modulatio) Mode
16 비트타이머 / 카운터 16 비트타이머 / 카운터 타이머 / 카운터 1,3 16비트의카운터를보유 2 16 = 65536 까지셀수있음 10비트프리스케일러내장 입력캡쳐유닛내장 비교매치에서타이머클리어 ( 오토리로드 ) 3개의 PWM 출력 가변 PWM 주기파형출력 3개의출력비교유닛내장 T1, T3핀에의한카운터동작 10개의인터럽트소스 오버플로우, 출력비교매치 A,B,C, 입력캡쳐
16 비트타이머 / 카운터 16 비트타이머 / 카운터레지스터 TCCRxA~C 타이머 x 의동작방식설정 TCNTx(Timer/CouNTer x) ` 타이머 x 의 16 비트카운터값을저장 OCRxA~C(Output Compare Resister x A~C) TCNTx 의값과출력비교되기위한 16 비트데이터값을저장 ICRx(Iput Capture Register x) 입력캡쳐시 TCNTx 의카운터값을저장 TIMSK(Timer Iterrupt MaSK) ETIMSK(Exteded TIMSK) TIFR(Timer Iterrupt Flag Register) ETIFR(Exteded TIFR)
16 비트타이머 / 카운터 TCCRA(Timer/Couter Cotrol Register A) 타이머 / 카운터제어레지스터 A (=1 or 3) 타이머 / 카운터 1,3 의동작을설정 7 6 5 4 3 2 1 0 COMA1 COMA0 COMB1 COMB0 COMC1 COMC0 WGM1 WGM0 비트 7:6 : COMA1:0 비트 5:4 : COMB1:0 비트 3:2 : COMC1:0 비트 1:0 : WGM1:0
16 비트타이머 / 카운터 TCCRA(Timer/Couter Cotrol Register A) COMA1:0, COMB1:0, COMC1:0 출력비교핀 OCA 와 OCB, OCC 를제어 출력모드비교, o-pwm COMA1/COM B1/COMC1 COMA0/COM B0/COMC0 설명 0 0 ormal 포트동작, OCA/OCB/OCC 분리 0 1 Toggle OCA/OCB/OCC o compare match 1 0 1 1 Clear OCA/OCB/OCC o compare match (low level 에서출력 ) Set OCA/OCB/OCC o compare match (high level 에서출력 )
16 비트타이머 / 카운터 TCCRA(Timer/Couter Cotrol Register A) 출력모드비교, Fast-PWM COMA1/COM B1/COMC1 COMA0/COM B0/COMC0 설명 0 0 ormal 포트동작, OCA/OCB/OCC 분리 0 1 1 0 1 1 WGM3:0=15:Toggle OCA o compare match, OCB discoected(ormal포트동작 ) For all other WGM3:0 settigs, ormal 포트동작, OCA/OCB/OCC discoected Clear OCA/OCB/OCC o compare match, set OCA / OCB / OCC at TOP Set OCA/OCB/OCC o compare match, clear OCA/OCB/OCC at TOP
16 비트타이머 / 카운터 TCCRA(Timer/Couter Cotrol Register A) 출력모드비교, Phase correct ad Phase ad Frequecy Correct PWM COMA1/COM B1/COMC1 COMA0/COM B0/COMC0 설명 0 0 ormal 포트동작, OCA/OCB/OCC 분리 0 1 1 0 1 1 WGM3:0=9 or 14:Toggle OCA o compare match, OCB discoected(ormal포트동작 ) For all other WGM3:0 settigs, ormal 포트동작, OCA/OCB/OCC discoected 업카운팅일때 Clear OCA/OCB/OCC o compare match, 다운카운팅일때 set OCA / OCB / OCC at TOP 업카운팅일때 Set OCA/OCB/OCC o compare match, 다운카운팅일때clear OCA/OCB/OCC at TOP
16 비트타이머 / 카운터 TCCRA(Timer/Couter Cotrol Register A) 비트 1:0 : WGM1:0 : 15 가지의동작모드를결정 Mode WGM13 WGM12 WGM11 WGM10 (CTC1) (PWM11) (PWM10) 타이머 / 카운터의 1,3 동작모드 TOP OCR1x TOV1플래그업데이트 Set 시점 0 0 0 0 0 0xFFFF Immediate MAX 1 0 0 0 1 PWM, Phase Correct, 8-bit 0x00FF TOP BOTTOM 2 0 0 1 0 PWM, Phase Correct, 9-bit 0x01FF TOP BOTTOM 3 0 0 1 1 PWM, Phase Correct, 10-bit 0x03Ff TOP BOTTOM 4 0 1 0 0 CTC OCR1A Immediate MAX 5 0 1 0 1 Fast PWM 8-bit 0x00FF TOP TOP 6 0 1 1 0 Fast PWM 9-bit 0x01FF TOP TOP 7 0 1 1 1 Fast PWM 10-bit 0x03Ff TOP TOP 8 1 0 0 0 PWM, Phase ad Frequecy Correct ICR1 BOTTOM BOTTOM 9 1 0 0 1 PWM, Phase ad Frequecy Correct OCR1A BOTTOM BOTTOM 10 1 0 1 0 PWM, Phase Correct ICR1 TOP BOTTOM 11 1 0 1 1 PWM, Phase Correct OCR1A TOP BOTTOM 12 1 1 0 0 CTC ICR1 Immediate MAX 13 1 1 0 1 Reserved - - - 14 1 1 1 0 Fast PWM ICR1 TOP TOP 15 1 1 1 1 Fast PWM OCR1A TOP TOP
16 비트타이머 / 카운터 TCCRB(Timer/Couter Cotrol Register B) 타이머 / 카운터제어레지스터 B (=1 or 3) 타이머 / 카운터 1,3 의프리스케일러등을설정하는기능수행 7 6 5 4 3 2 1 0 ICNC ICES - WGM3 WGM2 CS2 CS1 CS0 비트 7 : ICNC 비트 6 : ICES 비트 4:3 : WGM3:2 비트2:0 : CS2:0, -클럭선택
16 비트타이머 / 카운터 TCCRB(Timer/Couter Cotrol Register B) 비트 7 : ICNC 1 로세트하면 Iput Capture Noise Caceler 설정 입력캡처핀 (ICP) 의입력을필터링 4 개의오실레이터사이클만큼지연 비트 6 : ICES ICP 에해당되는에지의형태를선택 1 로설정하면상승에지에서검출, 0 으로설정하면하강에지에서검출 카운터값은 ICR 에저장되고, 입력캡처플래그 (ICP) 가설정된경우입력캡처인터럽트가발생된다. 비트 4:3 : WGM3:2 TCCRxA 의비트 1~0(WGMx1~0) 와결합하여동작모드를설정
16 비트타이머 / 카운터 TCCRB(Timer/Couter Cotrol Register B) 비트 2:0 : CS2:0 분주비와클럭소스를선택 CS2 CS1 CS0 설명 0 0 0 클럭소스가없음 ( 타이머 / 카운터가멈춤 ) 0 0 1 클럭소스존재 ( 프리스케일링이없음 ) 0 1 0 8분주 0 1 1 64분주 1 0 0 256분주 1 0 1 1024분주 1 1 0 T1핀에서외부클럭소스, 하강에지에서클럭발생 1 1 1 T1핀에서외부클럭소스, 상승에지에서클럭발생
16 비트타이머 / 카운터 TCCRC(Timer/Couter Cotrol Register C) 타이머 / 카운터제어레지스터 C (=1 or 3) 타이머 / 카운터 1,3 의 Force Output Compare 를설정 7 6 5 4 3 2 1 0 FOCA FOCB FOCC - - - - - 비트 7 : FOCA 비트 6 : FOCB 비트 5 : FOCC o-pwm 모드일경우에만활성화 1 로설정하면 compare match 가파형발생장치로되어, OCA/OCB/O CC 에출력비교가일치할때출력되는값과동일한출력을내보낸다.
16 비트타이머 / 카운터 TCNT (Timer Couter Rgister ) 타이머카운터레지스터 (=1 or 3) 타이머 / 카운터1,3의 16비트카운터값을저장하고있는레지스터 읽기및쓰기가가능한카운터로동작하며자동으로증가한다. 16 비트레지스터값을저장 TCNTH 와 TCNTL 로구성. 15 14 13 12 11 10 9 8 TCNT15 TCNT14 TCNT13 TCNT12 TCNT11 TCNT10 TCNT9 TCNT8 7 6 5 4 3 2 1 0 TCNT7 TCNT6 TCNT5 TCNT4 TCNT3 TCNT2 TCNT1 TCNT0
16 비트타이머 / 카운터 OCRA, OCRB, OCRC (Output Compare Register) 출력비교레지스터 (TCNT1/3 와계속적으로비교 ) 16 비트 두레지스터의값이일치했을때, OCA, OCB, OCC 핀을통하여설정된값이출력되거나출력비교인터럽트가발생 ICR(Iput Capture Register) 입력캡쳐레지스터 입력캡쳐핀 ICx 으로들어오는신호변화를검출하여일어나는입력캡쳐시 TCNTx 의카운터값을저장하는 16 비트레지스터 이때 ICFx 플래그가세트되고입력캡쳐인터럽트가요청 어떤신호의주기측정에응용
16 비트타이머 / 카운터 TIMSK(Timer Iterrupt MaSK) 타이머인터럽트마스크레지스터 타이머 / 카운터 0, 타이머 / 카운터 1, 타이머 / 카운터 2 가발생하는인터럽트를개별적으로 eable 하는레지스터 7 6 5 4 3 2 1 0 OCIE2 TOIE2 TICIE1 OCIE1A OCIE1B TOIE1 OCIE0 TOIE0 비트 5 : TICIE1 비트 4~3 : OCIE1A~B 비트 2 : TOIE1
16 비트타이머 / 카운터 TIMSK(Timer Iterrupt MaSK) TICIE1:Timer Iput Capture Iterrupt Eable 1 1 로설정되면타이머 1 의입력캡쳐인터럽트를개별적으로 Eable IC1 핀에서캡쳐트리거이벤트가발생했을경우, TIFR.ICF1 플래그가세트되면서인터럽트서비스루틴이실행 OCIE1A~B: Output Compare match Iterrupt Eable timer 1 A~B 1 로설정되면타이머 1 의출력비교인터럽트 A, B 를개별적으로 Eable. TCNT1 과 OCR1A/B 의값이일치하면, TIFR.OCF1A/B 플래그가세트되면서인터럽트서비스루틴이실행. TOIE1 : Timer Overflow Iterrupt Eable for timer 1 1 로설정되면타이머 1 의오버플로우인터럽트를개별적으로 Eable 타이머 / 카운터 1 의오버플로우가발생시 TIFR.TOV1 플래그가세트되면서인터럽트서비스루틴이실행.
16 비트타이머 / 카운터 ETIMSK(Exteded Timer Iterrupt MaSK) 확장타이머인터럽트마스크레지스터 타이머 1, 3 이발생하는인터럽트를개별적으로 Eable 제어하는레지스터 7 6 5 4 3 2 1 0 - - TICIE3 OCIE3A OCIE3B TOIE3 OCIE3C OCIE1C 비트 5 : TICIE3 비트 4~3 : OCIE3A~B 비트 2 : TOIE3 비트 1~0 : OCIExC
16 비트타이머 / 카운터 ETIMSK(Exteded Timer Iterrupt MaSK) TICIE3 : Timer Iput Capture Iterrupt Eable 3 1로설정되면타이머3의입력캡쳐인터럽트를개별적으로 Eable IC3 핀에서캡쳐트리거이벤트가발생했을경우, TIFR.EICF3 플래그가세트되면서인터럽트서비스루틴실행 OCIE3A~B : Output Compare match Iterrupt Eable timer 3 A~B 1로설정되면타이머3의출력비교인터럽트 A, B를개별적으로 Eable. TCNT3과 OCR3A/B의값이일치하면, ETIFR.OCF3A/B 플래그가세트되면서인터럽트서비스루틴실행. TOIE3 : Timer Overflow Iterrupt Eable for timer 1 1로설정되면타이머3의오버플로우인터럽트를개별적으로 Eable. 타이머 / 카운터3의오버플로우가발생시 ETIFR.TOV3 플래그가세트되면서인터럽트서비스루틴이실행. OCIExC : Output Compare match Iterrupt Eable timer x C 1로설정되면타이머x의출력비교인터럽트 C를개별적으로 Eable. TCNT3/1과 OCR3C/OCR1C의값이일치하면, ETIFR.OCF3C/ETIFR.OCF1C 플래그가세트되면서인터럽트서비스루틴이실행.
16 비트타이머 / 카운터 TIFR(Timer Iterrupt Frag Register) 타이머인터럽트플래그레지스터 타이머 0~2 가발생하는인터럽트플래그를저장하는레지스터 7 6 5 4 3 2 1 0 - - ICF1 OCF1A OCF1B TOV1 - - 비트 5 : ICF1(Iput Capture Flag 1) 비트 4~3 : OCF1A~B(Output Compare match Flag 1 A~B) 비트 2 : TOV1 (Timer Overflow Flag 1)
16 비트타이머 / 카운터 TIFR(Timer Iterrupt Frag Register) ICF1 : Iput Capture Flag 1 입력캡쳐신호또는아날로그비교기로부터의신호에의해캡쳐동작이수행될때 1 로세트되고, 입력캡쳐인터럽트가발생. ICR1 레지스터가 TOP 값으로사용되는동작모드에서 TCNT1 의값이 TOP 과같아질때 1 로세트되고인터럽트가발생 OCF1A~B : Output Compare match Flag 1 A~B TCNT1 레지스터와출력비교레지스터 OCR1A~B 의값을비교하여같으면 OC F1A~B 는 1 로세트되고출력비교인터럽트가발생 TOV1 : Timer Overflow Flag 1 오버플로우가발생하면 (0xFFFF 까지세고 0x0000 으로넘어가게되면 ) 이 TOV 1 는 1 로세트되면서오버플로우인터럽트가발생 Phase correct PWM 모드에서는타이머 1 이 0x00 에서계수방향을바꿀때 T OV1 가세트됨.
16 비트타이머 / 카운터 ETIFR(Exteded Timer Iterrupt Frag Register) 타이머인터럽트플래그레지스터 타이머 1,3 이발생하는인터럽트플래그를저장하는레지스터 7 6 5 4 3 2 1 0 - - ICF3 OCF3A OCF3B TOV3 OCF3C OCF1C 비트 5 : ICF3(Iput Capture Flag 3) 비트 4,3,1 : OCF3A,B,C (Output Compare match Flag 3 A,B,C) 비트 2 : TOV3 (Timer Overflow Flag 3) 비트 0 : OCF1C: Output Compare match Flag 1 C
16 비트타이머 / 카운터 ETIFR(Exteded Timer Iterrupt Frag Register) ICF3 : Iput Capture Flag 3 입력캡쳐신호또는아날로그비교기로부터의신호에의해캡쳐동작이수행될때 1 로세트되고입력캡쳐인터럽트발생. ICR3 레지스터가 TOP 값으로사용되는동작모드에서 TCNT3 의값이 TOP 과같아질때 1 로세트되고인터럽트발생. OCF3A,B,C: Output Compare match Flag 3 A,B,C TCNT3 레지스터와출력비교레지스터 OCR3A~C 의값을비교하여같으면 OC F3A~C 는 1 로세트되고출력비교인터럽트요청. TOV3 : Timer Overflow Flag 3 오버플로우가발생하면이 TOV3 는 1 로세트되면서오버플로우인터럽트발생 PC PWM 모드에서는타이머 1 이 0x00 에서계수방향을바꿀때 TOV3 가세트 OCF1C: Output Compare match Flag 1 C TCNT1 레지스터와출력비교레지스터 OCR1C 의값을비교하여같으면 OCF1C 는 1 로세트되고출력비교인터럽트발생
16 비트타이머 / 카운터동작모드 16 비트타이머 / 카운터동작모드 크게나누어 5 가지동작모드 8 비트타이머 / 카운터 4 가지모드 + PFC PWM(Phase ad Frequecy Correct PWM) 모드 세분하면총 15 가지동작모드로구분 Normal Mode( 일반동작모드 ) 타이머 는항상상향카운터로만동작 TCNT 의값이 0xFFFF 에서 0 으로바뀌는순간 TOV 비트가세트되며오버플로우인터럽트발생 TCCRxA~B 의 WGMx3~0 = 00 으로설정 카운터가 16 비트라는것을제외하고는 8 비트타이머와동일
16 비트타이머 / 카운터동작모드 CTC(Clear Timer o Compare match) 모드 4 번모드 인터럽트 : TCNT 의값이 OCRA 에설정한값과일치되면그다음클럭사이클에서 TCNT 의값이 0 으로클리어되고, OCFA 비트가세트되며출력비교인터럽트발생 출력파형 : COMA/COMB/COMC1~0 을 01 로설정하고 OCRA 레지스터값을바꿔가면서출력비교에의해 OCA/OCB/OCC 의신호를토글 12 번모드 인터럽트 : TCNT 의값이 ICR 에설정한값과일치되면그다음클럭사이클에서 TCNT 의값이 0 으로클리어되고, ICF 비트가세트되며입력캡쳐인터럽트발생 출력파형 : COMA/COMB/COMC1~0 을 01 로설정하고 OCRA/OCRB/ O CRC 레지스터값을바꿔가면서출력비교에의해 OCA/OCB/OCC 의신호를토글 TCCRB 레지스터의 WGMx3~0 을 4 또는 12 로설정
16 비트타이머 / 카운터동작모드 CTC(Clear Timer o Compare match) 모드
16 비트타이머 / 카운터동작모드 Fast PWM(Fast Pulse Width Modulatio) 모드 TCNT는반복적으로업카운팅하며항상 0x0000~TOP의값을가짐 TCNT의값이 TOP 값과일치되면그다음사이클에서 0으로클리어 모드별 TOP 값 동작모드 5 6 7 14 15 TOP 값 0x00FF 0x01FF 0x03FF ICR1 OCR1A 인터럽트 OCFA비트세트, 출력비교인터럽트발생 ICF비트세트, 입력캡춰인터럽트발생 TOV비트세트, 오버플로우인터럽트발생 TCCRxB 레지스터의 WGMx3~0 비트를 5,6,7,14,15 로설정
16 비트타이머 / 카운터동작모드 Fast PWM(Fast Pulse Width Modulatio) 모드 출력파형 COM1:0 가 10 일때 TCNT의값이 ICR이나 OCRA/OCRB/OCRC 값과같아지면 OCA/ OCB/OCC의값은 0으로클리어 TOP까지증가했다가 0으로바뀌는순간 OCA/OCB/OCC 는 1로세트 COM1:0 가 11 일때 TCNT의값이 ICR이나 OCRA/OCRB/OCRC 값과같아지면 OCA/ OCB/OCC의값은 1로세트 TOP까지증가했다가 0으로바뀌는순간 OCA/OCB/OCC 는 0으로클리어 COM1:0 가 00 or 01 일때 OCA/OCB/OCC 는신호출력되지않음
16 비트타이머 / 카운터동작모드 Fast PWM(Fast Pulse Width Modulatio) 모드
16 비트타이머 / 카운터동작모드 PC PWM(Phase Correct PWM) 모드 TCNT 는업카운팅하여 TOP 으로증가하다가다운카운팅으로 0x0000 으로감소를반복 모드별 TOP 값 동작모드 1 2 3 10 11 TOP 값 0x00FF 0x01FF 0x03FF ICR1 OCR1A 인터럽트 OCFA비트세트, 출력비교인터럽트발생 ICF비트세트, 입력캡춰인터럽트발생 TOV비트세트, 오버플로우인터럽트발생 TCCRxB 레지스터의 WGMx3~0 비트를 1,2,3,10,11 로설정
16 비트타이머 / 카운터동작모드 PC PWM(Phase Correct PWM) 모드 출력파형 COM1:0 가 10 일때 TCNT 의값이 OCRA/OCRB/OCRC 레지스터에설정한값과일치되면 OCA/OCB/OCC 의값은상향카운팅의경우에는 0 으로, 하향의경우에는 1 로세트. COM1:0 가 11 일때 TCNT 의값이 OCRA/OCRB/OCRC 레지스터에설정한값과일치되면 OCA/OCB/OCC 의값은상향카운팅의경우에는 1 로, 하향의경우에는 0 로세트. COM1:0 가 00 or 01 일때 OCA/OCB/OCC 는신호출력되지않음 PWM 주기를변경하기위해 OCRA/OCRB/OCRC 레지스터에새로운값을기록하더라도즉시변경되지않고 TCNT 이 TOP 에도달하면비로소값이갱신된다
16 비트타이머 / 카운터동작모드 PC PWM(Phase Correct PWM) 모드
16 비트타이머 / 카운터동작모드 PFC PWM(Phase & Frequecy Correct PWM) 모드 PC PWM 모드와거의유사 모드별 TOP 값 모드 8 : ICR1 모드 9 : OCRA TCNT 는업카운팅하여 TOP 으로증가하다가다운카운팅으로 0x0000 으로감소를반복 인터럽트 OCFA 비트세트, 출력비교인터럽트발생 ICF 비트세트, 입력캡춰인터럽트발생 TOV 비트세트, 오버플로우인터럽트발생 새로운값으로의갱신이 TCNT 가 0 일때이루어짐. TCCRxB 레지스터의 WGMx3~0 비트를 8,9 로설정
16 비트타이머 / 카운터동작모드 PFC PWM(Phase & Frequecy Correct PWM) 모드 출력파형 COM1:0 가 10 일때 TCNT 의값이 OCRA/OCRB/OCRC 레지스터에설정한값과일치되면 OCA/OCB/OCC 의값은상향카운팅의경우에는 0 으로, 하향의경우에는 1 로세트. COM1:0 가 11 일때 TCNT 의값이 OCRA/OCRB/OCRC 레지스터에설정한값과일치되면 OCA/OCB/OCC 의값은상향카운팅의경우에는 1 로, 하향의경우에는 0 로세트. COM1:0 가 00 or 01 일때 OCA/OCB/OCC 는신호출력되지않음
16 비트타이머 / 카운터동작모드 PFC PWM(Phase & Frequecy Correct PWM) 모드
실습 9 : PWM 으로 LED 밝기조절 실습개요 타이머 0 의 PC PWM 동작모드를이용하여 LED 의밝기를조절하는실습 PWM 동작모드에서 OC0 핀을통해 PWM 신호를만들어출력함으로써, LED 의밝기를조절하도록함. 밝기는 PWM 신호의듀티비 (Pulse Duty) 에의해좌우됨. 실습목표 타이머0의 PWM 기능동작원리이해 타이머0의 PCPWM 모드제어방법의습득 ( 관련레지스터이해 ) PWM 신호출력제어방법습득
실습 9 : PWM 으로 LED 밝기조절 사용모듈 : MCU 모듈, LED 모듈 MCU 모듈포트 B 의비트 4 MCU 모듈 LED 모듈 Sigal LED1 LED 모듈
실습 9 : PWM 으로 LED 밝기조절 모듈결선방법 MCU 모듈포트 B 의 PB4 를 2 핀케이블로 LED 모듈의 LED 1 에연결
실습 9 : PWM 으로 LED 밝기조절 구동프로그램 : 사전지식 PWM 신호에의한 LED 의밝기조절방법 가장밝음 100% 듀티비 100% 인경우 LED 는가장밝을것이며, 듀티비가 0% 이면 LED 는꺼진다 중간 50% 어두움 10% 출력비교용레지스터 (OCR) 값을조절하여 OC0 로출력되는 PWM 신호의듀티비를원하는대로변경 꺼짐 0%
실습 9 : PWM 으로 LED 밝기조절 구동프로그램 : 사전지식 (PWM 동작모드설정 ) 타이머 / 카운터 0 사용 Phase Correct PWM 동작모드사용 TCCR0 설정 CS 비트는 01 로세팅하여 Prescaler 의분주비를 1 로설정 FOC 비트는 0 로설정 WGM 비트는 PC PWM 모드인 01 로설정 COM 비트는 11 로세팅하여업카운팅의경우 OC0 를 1 로세트하고, 다운카운팅의경우 OC0 를클리어시키도록설정 PWM 클럭 = 메인클럭 /N*510, (N = 클럭분주 )
실습 9 : PWM 으로 LED 밝기조절 구동프로그램 : 사전지식 (PWM 동작모드설정 ) OCR TCNT 값 OC0 신호 어두움 밝음
실습 9 : PWM 으로 LED 밝기조절 구동프로그램 : 소스분석 Pwm_led.c 1) #iclude<avr/io.h> #iclude<avr/iterrupt.h> #iclude<util/delay.h> it mai(){ usiged char Light=0; PB4 는 OC0 핀 (PWM 출력핀 ) 2) DDRB = 0x10; TCCR0 = 0x71; /* 0~7비트까지의레지스터중에서 4번째비트의레지스터를사용하여출력한다. */ // PWM, No Prescalig /* 0~7비트까지의모든레지스터중에서 0, 4, 5, 6번째의레지스터를사용하여출력한다. */
실습 9 : PWM 으로 LED 밝기조절 구동프로그램 : 소스분석 TCCR0 = 0x71; 7 6 5 4 3 2 1 0 FOC WGM0 COM1 COM0 WGM1 CS2 CS1 CS0 0 1 1 1 0 0 0 1 CS는 001 이므로 Prescaler의분주비가 1 WGM(1:0) 는 01 이므로 PC PWM 모드 COM(1:0) 는 11 로세팅 FOC 는 0 로세팅
실습 9 : PWM 으로 LED 밝기조절 3) TCNT0 = 0; while(1){ for(light=0;light<255;light++){ OCR0 = Light; _delay_ms(10); //10ms만큼의딜레이간격 } for(light=255;0<light;light--){ OCR0 = Light; _delay_ms(10); } } retur 0; }
실습 9 : PWM 으로 LED 밝기조절 실행결과
실습 10 : 타이머로버저울리기 실습개요 타이머를이용하여원하는주파수의신호를만들고, 이를버저에입력하여여러가지소리를내도록설계 16 비트타이머인타이머 / 카운터 3 을사용하며, 동작모드는 CTC 모드을사용 각기다른스위치입력에따라, 다른주파수의신호를만들어준다. 실습목표 16 비트타이머 / 카운터활용방법의습득 ( 관련레지스터이해 ) 버저의동작원리이해
실습 10 : 타이머로버저울리기 사용모듈 : MCU 모듈, Audio 모듈, 스위치모듈 MCU 모듈포트 E PE3 핀 MCU 모듈포트 D MCU 모듈 Audio 모듈 Audio 모듈 Piezo Sigal Switch 모듈버튼스위치 Sigal Switch 모듈
실습 10 : 타이머로버저울리기 사용모듈 : Audio 모듈회로 압전버저관련회로
실습 10 : 타이머로버저울리기 모듈결선방법 MCU 모듈포트 E 의 PE3 을 Audio 모듈의 PIEZO 에연결. MCU 모듈포트 D 의 PD0~PD7 을 Switch 모듈의 BT0~BT7 에연결.
실습 10 : 타이머로버저울리기 구동프로그램 : 사전지식 타이머를이용하여버저를여러가지소리가나도록울리도록함. 각기다른스위치입력에따라, 다른주파수의신호를만들어주면됨 16비트타이머 / 카운터 3을이용 / 동작모드는 12번 CTC모드를사용 TCCR3A/TCCR3B/ TCCR3C 레지스터들을적절히세팅 버저에입력될신호는 OC3A핀을사용 WGM(3:0) 은 1100 으로세팅 COM3A(1:0) 비트를 01 로설정하여토글모드를사용프리스케일러는 CS(2:0) 비트에 001 을세팅하여 1분주로한다 OC3A 핀출력신호의주파수 OC3A 주파수 = 메인클럭 / (2 * 분주비 * (1 + ICR3))
실습 10 : 타이머로버저울리기 구동프로그램 : 소스분석 PIEZO.c 1) #iclude<avr/io.h> #iclude<util/delay.h> #defie FREQ(x) (usiged it)(7372800/(2*(x))) 2) void Chage_FREQ(usiged it freq); 3) void STOP_FREQ(); 4) void Pop_Butto(); usiged char Push_Butto(); 5) usiged it key2doremi(usiged char key); it mai(){ usiged char piao=0; DDRE = 0x08; DDRD = 0x00; /* 0~7 비트의레지스터중에서 3 번째레지스터를 사용하여출력 */ // 버튼입력
실습 10 : 타이머로버저울리기 6) TCCR3A = 0x40; /* COM3A(1:0) = 01, COM3B(1:0) = 00, COM3C(1:0) = 00, OC3A핀사용 WGM3(1:0) = 00 */ TCCR3B = 0x19; /* WGM3(3:2) = 11 CTC 12모드사용 CS3(2:0) = 001 1분주사용 ICNC3 = 0, ICES3 = 0 */ TCCR3C = 0x00; /* FOC3A = 0, FOC3B = 0, FOC3B = 0, */ TCNT3 = 0x0000; STOP_FREQ(); // T/C1 value=0 // 초기값을클리어한다. while(1){ piao = Push_Butto(); // 버튼을누를때까지대기 Chage_FREQ(key2DoReMi(piao)); // 버튼에맞는음향을연주한다. Pop_Butto(); // 버튼이눌러지지않을때까지대기 STOP_FREQ(); // 연주를정지한다. } retur 0; }
실습 10 : 타이머로버저울리기 7) void Chage_FREQ(usiged it freq){ usiged it x; } TCCR3A = 0x40; TCCR3B = 0x19; do{ x=tcnt3; }while(x>=freq(freq)); ICR3 = FREQ(freq); // 위와동일 // 위와동일 void STOP_FREQ(){ TCCR3A = 0x00; TCCR3B = 0x00; TCNT3 = 0; ICR3 = FREQ(0); PORTE = 0xFF; } // 포트 E 출력, 초기값
실습 10 : 타이머로버저울리기 7) void Pop_Butto(){ while((pind & 0xFF)!=0x00); } usiged char Push_Butto(){ while((pind & 0xFF)==0x00); retur PIND; } usiged it key2doremi(usiged char key){ usiged it _ret=0; switch(key){ case 0x01: _ret = 523; break; case 0x02: _ret = 587; break; case 0x04: _ret = 659; break; 7) case 0x08: _ret = 698; break; case 0x10: _ret = 783; break; case 0x20: _ret = 880; break; case 0x40: _ret = 987; break; case 0x80: _ret = 1046; break; } retur _ret; }
실습 10 : 타이머로버저울리기 실행결과