|
发表于 2013-1-6 20:47:19
|
显示全部楼层
在CTC 模式(WGM01:0 = 2) 适用于产生占空比为1:1的方波。通过改变分频系数N和OCR0的值改变频率,其频率计算公式为:% z [7 Q' l4 d' \/ d( M; a
fOC0= fclk/(2*N*(1+OCR0))/ n7 `6 N$ r7 ?- X
范例程序:
- m6 w7 @& W+ ~* ?/ R3 ]2 }. _/*///////////////////////////////////////////////
/ Z, d5 I1 d/ `( V7 k5 X' D/////////定时器TO的使用例程——CTC模式///////////( a( `' S0 I* n5 l/ r0 V1 q
//作者:宝山* h& a6 J: ^7 J3 G
//时间:2008.06.02* a" T6 P; X0 P
//编译环境:ICCV7 for AVR
0 o8 t$ U2 i. u1 O6 Z* _//晶体: 11.0592Mhz
. C# @) S( e2 r3 K$ I///////////////////////////////////////////////*/5 {1 N8 v6 A/ U$ ~/ T
#include <iom16v.h>% }, z5 j) x. q: d. b! R
#include <macros.h>
" H% m; }- e9 e2 w2 z7 h$ nvoid port_init(void)7 F- V2 E/ r3 S. Z
{
% f. T* N, N( x7 x# ?$ r% Y4 o6 CPORTA = 0x00;
+ P4 _7 [- f/ K" vDDRA = 0x00;( _3 L8 @6 W2 C
PORTB = 0x00; + q, r9 Q6 t8 b/ }3 Q; P
DDRB = 0x08; //PB3为PWM输出7 `$ y q" r( K: [6 T* a4 r
PORTC = 0x00; //m103 output only' x- F% \5 ?$ d0 A$ x% a
DDRC = 0x00;
- R+ r& L! S2 P8 n: L5 zPORTD = 0x00;
+ x% s" I# \$ ^% I. RDDRD = 0x00;
8 q& Y9 {) O7 T0 ^4 n5 j D8 I6 {}
3 P! j$ e& r. ?void timer0_init(void)* P/ K' g w/ a$ |, Q
{
# }. T" C, j% _# qTCCR0 = 0x00; //stop
8 J" |6 A/ h( X, B7 CTCNT0 = 0x01; // TCNT0要小于OCR0
3 r1 h. k. a7 W5 JOCR0 = 0x14; //改变此值可改变频率% _4 z3 Z, }6 }' \: v2 ?
TCCR0 = 0x1C; //设置为CTC模式,匹配时OC0取反,分频系数256- H# V! H9 C2 s' w. d
}% O7 k& _+ Q9 |! l( M
// 频率计算公式:fOCn= fclk/(2*N*(1+OCRN))
& f8 ?/ ?( Z; [+ \ C3 C) W// N=256,OCR0=0x14=20) ~: @/ c: c& {. J
// fOC0=11059200/(2*256*(1+20))=1.028KHz
& J4 ?% f1 }# A7 f& o1 m// 在PB3管脚输出占空比为1:1,频率为1.028KHz的方波信号- j3 \* \) n. P N1 S2 A3 V
// 通过改变分频系数N和OCR0的值改变频率0 T7 |, Q7 Q' j7 W# k5 F+ E2 D
#pragma interrupt_handler timer0_comp_isr:iv_TIM0_COMP
) L* k3 F3 e" d& @void timer0_comp_isr(void)
6 M ~6 n6 u# r- p{
# I# r1 b3 q3 h* h2 g o2 Y0 L) S//compare occured TCNT0=OCR0: B3 D; O; d |
}" N! u$ {2 ~6 \: o% S% Q3 ~; b) z
#pragma interrupt_handler timer0_ovf_isr:iv_TIM0_OVF4 a, ^! \8 z6 S# |* M
void timer0_ovf_isr(void)6 e, U R. R( A9 [2 l, `: g
{5 `2 Z0 j- C, E/ S
TCNT0 = 0x01; //reload counter value
% o" j+ r+ [; q# G5 `}3 x" }! i+ T. k
void init_devices(void)
) ]1 Z$ M- V& K{! Y, E# u% ? l& j. ?$ N! d
CLI(); //disable all interrupts! m" V( s3 _/ g* z( s2 x, `
port_init();2 U5 E; B7 Z7 `- W! U1 \4 K
timer0_init();! p8 h6 X7 b X ?2 d3 M' z4 {
MCUCR = 0x00;
+ E) e! a& T( p" N- I; L# Z9 J# {GICR = 0x00;
. ~! Y+ M$ f* o$ q# \2 ^' w6 iTIMSK = 0x03; //timer interrupt sources
# s5 r9 P+ y) d! _0 TSEI(); //re-enable interrupts' g1 K; Z' i/ n) D, y7 U
//all peripherals are now initialized* }1 b# F/ h# D- W
} Y+ V, P" \+ H
void main(void)
. G( d1 J0 }, |{
( R8 c' n0 Z2 u, p- J* z! Winit_devices();8 V6 d0 Q* T* U5 w4 ?
while(1);) o" O3 b" L' k. D5 K( V
}
4 W2 H3 i! M/ q' o! U4 ?4 P完整程序文件:
/ G# \2 l# T* j1 D( d$ ^* S: c' y# V# S
|
|