定時(shí)計(jì)數(shù)器的結(jié)構(gòu)與應(yīng)用定時(shí)計(jì)數(shù)器(Timer/Counter)常用于計(jì)數(shù)、延時(shí)、測(cè)量 周期、頻率、脈寬、提供定時(shí)脈沖信號(hào)等。在實(shí)際應(yīng)用中,對(duì)于轉(zhuǎn)速,位移、速度、流量等物理量的 測(cè)量,通常也是由傳感器轉(zhuǎn)換成脈沖電信號(hào),通過(guò)使用定時(shí)計(jì) 數(shù)器來(lái)測(cè)量其周期或頻率,再經(jīng)過(guò)計(jì)算處理獲得。
AVR的定時(shí)計(jì)數(shù)器接口功能: 通過(guò)定時(shí)計(jì)數(shù)器與比較匹配寄存器相互配合,生成占空比 可變的方波信號(hào),即脈沖寬度調(diào)制輸出PWM信號(hào),可用于 D/A、馬達(dá)無(wú)級(jí)調(diào)速控制、變頻控制等。本文主要介紹的是AVR單片機(jī)定時(shí)/計(jì)數(shù)器學(xué)習(xí)筆記,具體的跟隨小編來(lái)了解下。
AVR單片機(jī)定時(shí)/計(jì)數(shù)器學(xué)習(xí)筆記
定時(shí)/計(jì)數(shù)器1(16位)有普通模式、CTC模式、快速PWM模式、相位修正PWM模式等工作模式。
1、普通模式(設(shè)為溢出中斷工作方式,向量號(hào)為9)
工作原理:在設(shè)定的時(shí)鐘頻率下,計(jì)數(shù)寄存器由初值逐次加1,當(dāng)達(dá)到計(jì)數(shù)最大值(65535)時(shí),溢出,執(zhí)行中斷子程序。
需要配置的寄存器:T/C1控制寄存器B(TCCR1B)、計(jì)數(shù)寄存器(TCNT1H和TCNT1L)、T/C1中斷屏蔽寄存器(TIMSK)。
(1)由TCCR1B的bit2、bit1、bit0設(shè)置時(shí)鐘頻率(有內(nèi)部和外部)
(2)由TCNT1H和TCNT1L設(shè)置計(jì)數(shù)初值(注意應(yīng)先寫(xiě)H,再寫(xiě)L)
(3)由TIMSK的bit2設(shè)置中斷使能(注意最后還應(yīng)開(kāi)啟總中斷SREG|=BIT(7))
編程時(shí)中斷的聲明 #pragma interrupt_handler 中斷函數(shù)名:中斷向量號(hào)
注意:在中斷子程序中,應(yīng)該再次裝入計(jì)數(shù)初值,因?yàn)檫M(jìn)入中斷時(shí)計(jì)數(shù)初值變成了0。
2、CTC模式(需要用到OC1A、OC1B兩個(gè)引腳)
應(yīng)用:用于產(chǎn)生占空比為50%的方波信號(hào)
( N為分頻系數(shù) )
需要配置的寄存器:T/C1控制寄存器A(TCCR1A)、T/C1控制寄存器B(TCCR1B)、輸出比較寄存器1A(OCR1A)。
(1)TCCR1A的bit7、bit6用于設(shè)置OC1A腳的比較輸出模式,bit5、bit4用于設(shè)置OC1B腳的比較輸出模式。(此處我們都設(shè)為,比較匹配時(shí)OC1A、OC1B電平取反)
(2)TCCR1B的bit4、bit3和TCCR1A的bit1、bit0組合來(lái)設(shè)置波形產(chǎn)生模式。(此處我們?cè)O(shè)為模式4—CTC模式)
(3)TCCR1B的bit2、bit1、bit0設(shè)置時(shí)鐘頻率。
(4)OCR1A用來(lái)設(shè)置計(jì)數(shù)的上限值
例程:
#include 《iom16v.h》
#include 《macros.h》
void main()
{
DDRD|=0X30; //PD4、PD5設(shè)為輸出
TCCR1A=0X50; //比較匹配時(shí)取反
TCCR1B=0X09; //CTC模式,無(wú)預(yù)分頻
OCR1A=1999; //OC1A、OC1B均產(chǎn)生2KHz的方波信號(hào)(系統(tǒng)時(shí)鐘為8MHz)
}
3、快速PWM模式(需要用到OC1A、OC1B兩個(gè)引腳)
前提:由TCCR1B的bit4、bit3和TCCR1A的bit1、bit0組合來(lái)設(shè)置波形產(chǎn)生模式為模式15(快速PWM)。
(1)TCCR1A的bit7、bit6用于設(shè)置OC1A腳的比較輸出模式,bit5、bit4用于設(shè)置OC1B腳的比較輸出模式。(此處我們?cè)O(shè)為,OC1A比較匹配時(shí)取反;OC1B比較匹配時(shí)清零,TOP時(shí)置位)
(2)TCCR1B的bit2、bit1、bit0設(shè)置時(shí)鐘頻率。
(3)OCR1A用來(lái)設(shè)置計(jì)數(shù)的上限值,OCR1B用來(lái)設(shè)置計(jì)數(shù)的匹配值
例程1:
#include 《iom16v.h》
#include 《macros.h》
void main()
{
DDRD|=0X30;
TCCR1A=0X63; //15模式,OC1B比較匹配時(shí)清零,TOP時(shí)置1;OC1A匹配時(shí)取反
TCCR1B=0X1B; //64預(yù)分頻
OCR1A=1249; //上限值,OC1B輸出100Hz;OC1A輸出50Hz方波
OCR1B=250; //匹配值,OC1B輸出占空比為20%
}
例程2:
#include《iom16v.h》
#include《macros.h》
//產(chǎn)生38KHz 占空比為50%的信號(hào)
void main()
{
DDRD|=0X30;
TCCR1A=0X23; //配置寄存器,OC1A作為普通IO口;OC1B比較匹配時(shí)清零,TOP時(shí)置1
TCCR1B=0X19; //15模式,無(wú)預(yù)分頻
OCR1A=209; //上限值,得到38KHz的PWM信號(hào)(OC1B口)
OCR1B=104; //匹配寄存器,2分之1的占空比
}
例程3:
#include《iom16v.h》
#include《macros.h》
//產(chǎn)生1Hz 占空比為50%的信號(hào)
void main()
{
DDRD|=0X30;
TCCR1A=0X23; //配置寄存器,OC1A作為普通IO口;OC1B比較匹配時(shí)清零,TOP時(shí)置1
TCCR1B=0X1D; //15模式,1024預(yù)分頻
OCR1A=7811; //上限值,得到1Hz的PWM信號(hào)(OC1B口)
OCR1B=3905; //匹配寄存器,2分之1的占空比
-
AVR單片機(jī)
+關(guān)注
關(guān)注
22文章
607瀏覽量
55482
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論