1. avr定時器/計數(shù)器0 --TC0 --CTC模式輸出PWM
CTC:比較匹配時清零計數(shù)器模式,。當(dāng)計數(shù)器TCNT0的數(shù)值等于比較寄存器OCR0時計數(shù)器TCNT0自動清零。OCR0定義了計數(shù)器的最大(TOP)值,這個模式使得用戶可以很容易地控制比較匹配輸出的頻率。T/C0的比較輸出腳為OC0(PB3),PB口的第三腳,在此模式下可以在OC0上輸出PWM控制外部設(shè)備。
例如:在OC0腳上輸出20HZ的方波信號,方波的周期時間為T=1/20HZ=0.05秒=50ms,半個周期為25ms,系統(tǒng)采用8MHZ晶振,1024分頻,時鐘計數(shù)頻率為8000000/1024=7812.5HZ,每個時鐘脈沖時間為1/7812.5=0.128ms, 定時25ms的計數(shù)值為25ms/0.128ms=195,將195賦值為T/C0的比較寄存器OCR0,啟動定時器后,TCNT0從0開始計數(shù),當(dāng)計數(shù)到195時,產(chǎn)生比較中斷,在OC0腳上輸出20HZ的占空比為50%的方波信號。
操作過程如下:
一、I/O管腳初始化:PB3(OC0)腳設(shè)為輸出,DDRB|=(1< 二、使能全局中斷:SREG=0X80; 三、T/C0比較中斷允許:TIMSK|=(1< 四、TCCR0配置:分頻系數(shù)為1024, TCCR0|=(1< CTC模式設(shè)置, TCCR0|=(1< 比較匹配時OC0取反 TCCR0|=(1< 五、計數(shù)器付初值: TCNT0=0; OCR0=195; //付初值后定時器開始工作 //函數(shù)功能:在PB3上輸出20HZ的方波,并在PD7上產(chǎn)生周期2秒的周期信號。(代碼來自輕松玩轉(zhuǎn)avr單片機(jī)c語言cd) #include
char Counter = 0; // 計數(shù)變量清零
/********端口初始化********/
void port_init()
{
DDRB|=(1<
/********定時器0初始化********/
void timer0_init()
{
SREG = 0x80; //使能全局中斷
TIMSK= (1<< OCIE0); //T/C0比較匹配中斷允許
TCCR0=(1<
TCNT0 = 0; //定時初值設(shè)置,
OCR0 = 195; //比較匹配寄存器初值
}
/********主函數(shù)********/
void main()
{
port_init();
timer0_init();
while(1);
}
/********定時器0比較匹配中斷服務(wù)函數(shù)********/
#pragma interrupt_handler timer0_COMP:20
void timer0_COMP(void)
{
TCNT0 = 0; //定時初值設(shè)置,
OCR0 = 195; //比較匹配寄存器初值
if(++Counter >= 40) //定時時間到1S嗎?定時中斷溢出40次為1S
{
PORTD^=(1<
}
}