AVR有三個定時計數(shù)器,其中定時計數(shù)器0和定時計數(shù)器2是8位的,定時計數(shù)器1是16位。
在學(xué)習(xí)AVR定時計數(shù)器時,剛開始被一大堆的寄存器搞的有點暈了,后來認真的把Datasheet中的有關(guān)寄存器先看了一遍,再重新看定時計數(shù)器的內(nèi)容才理清了。這里做個總結(jié)吧,加深自己的印象。
定時計數(shù)器0和定時計數(shù)器2基本上是相同的。以定時計數(shù)器0來總結(jié)它的幾種工作模式的不同。
普通模式:不做介紹,和51里面是一模一樣的。
CTC模式:當(dāng)寄存器TCNT0與OCR0相等時(即匹配),OC0按照COM0[1:0]的值相應(yīng)的改變(置位,清零或取反)。同時TCNT0清零,TCNT0從0x00重新開始計數(shù),當(dāng)計數(shù)結(jié)果和下一個OCR0寄存器中值相等時又發(fā)生匹配。發(fā)生匹配時,匹配比較標(biāo)志OCF0置位,即OCF0=1,可申請匹配比較中斷。
快速PWM模式:當(dāng)寄存器TCNT0與OCR0匹配相等時,OC0按照COM0[1:0]的值相應(yīng)的置位或清零。與CTC模式不同的是TCNT0不會清零,而是繼續(xù)計數(shù),直到計數(shù)為0XFF,此時OC0會發(fā)生清零或置位。同時TCNT0從0x00重新開始計數(shù),當(dāng)計數(shù)結(jié)果和下一個OCR0寄存器中值相等時又發(fā)生匹配。與CTC模式不同發(fā)生匹配時,OCF0不會置位。TCNT0計數(shù)到0XFF時,計數(shù)溢出標(biāo)志TOV0置位,即TOV0=1,此時可申請溢出中斷。
相位可調(diào)PWM模式:此模式下,定時計數(shù)器是雙向計數(shù)器(可加可減),,從0x00一直加到0xff,在下一個計數(shù)脈沖到來時從0xff一直減到0x00。當(dāng)COM0[1:0]=2時,在加的過程中,若發(fā)生匹配,清零OC0;在減的過程中,若發(fā)生匹配,置位OC0。(當(dāng)COM0[1:0]=3時,和COM0[1:0]=2的情況相反)。與快速PWM模式不同的是,當(dāng)TCNT0計數(shù)到0xff時不會影響到OC0的輸出,而是當(dāng)從0xff減到0x00的過程中與下一個OCR0寄存器的值匹配時,OC0發(fā)生改變(加的過程是清零,那這時應(yīng)該是置位)。當(dāng)定時計數(shù)器計數(shù)到0x00時,計數(shù)溢出標(biāo)志TOV0置位,即TOV0=1,此時可申請溢出中斷。
以上幾種工作模式同時適合定時計數(shù)器0,1,2。只是定時計數(shù)器1的功能有所增強。下面將會討論。
星期二我看一個程序時候,那個程序是工作在快速PWM模式,選擇計數(shù)溢出中斷。當(dāng)時我還想為什么不選擇匹配中斷而要去等到計數(shù)溢出才中斷豈不是占用時間了,還去問老師了,現(xiàn)在看來是多么的愚蠢!快速PWM模式根本就沒有匹配中斷!
定時計數(shù)器0和2,在CTC模式下,頻率和相位可調(diào)。PWM模式下,頻率不可調(diào)。由頻率計數(shù)公司就可以看出。不論是CTC還是PWM都可以通過調(diào)節(jié)OCRn的值去調(diào)節(jié)占空比。(關(guān)于產(chǎn)生PWM波頻率的計算公式將會在后文給出的,關(guān)于定時計數(shù)器的各種寄存器可自己去查看Datasheet)
下面是定時計數(shù)器1比0和2的增強功能總結(jié):
1)定時計數(shù)器1比0和2有許多增強功能。在PWM模式時,可產(chǎn)生頻率和相位都可調(diào)的PWM波,這時8位定時計時器0和2所做不到的,因為定時計數(shù)器1具備輸入捕獲功能,即具備輸入捕獲寄存器ICR1,在PWM模式下,ICR1中可存放一個top值,就是這個top值可以改變PWM波的頻率。這點可在頻率計算公司看出。
2)定時計數(shù)器1有兩個輸出比較單元和兩個輸出比較寄存器OCR1A和OCR1B,因此可同時產(chǎn)生2路頻率相同,占空比不同的PWM波形。占空比的調(diào)整當(dāng)然由OCR1A和OCR1B來確定。波形在OC1A和OC1B引腳輸出。
3)定時計數(shù)器1具有輸入捕獲單元。可以精確的記錄外部事件發(fā)生的時間。捕獲外部事件的信號由引腳ICP1輸入。當(dāng)輸入捕獲信號產(chǎn)生,TCNT1中的計數(shù)值將被寫入輸入捕獲寄存器ICR1(ICR1H,ICR1L)中去。輸入捕獲信號也可由模擬比較器的AC0單元的輸出信號來觸發(fā)。關(guān)于觸發(fā)的方式有兩種,當(dāng)定時計數(shù)器1的控制寄存器B(即TCCR1B)中的第六位ICESE=0,下降沿觸發(fā);ICESE=1,上升沿觸發(fā)。當(dāng)滿足觸發(fā)條件時,輸入捕獲單元開始捕獲該事件的發(fā)生。利用該功能可以來對輸入波形頻率的測量。如果我沒有記錯的話在51里面定時計數(shù)器也有這個功能的,可以有GATE門控位的設(shè)置來達到這個目的。51里面,把GATE置位,那么此時定時計數(shù)器的啟動由INTX(X=0或1)引腳和TRX(X=0或1)來決定。可先把TRX置位,讓定時計數(shù)的啟動條件還欠缺INTX為高電平(即先讓INTX處于低電平),等待INTX變?yōu)楦唠娖剑敲创藭r定時計數(shù)器啟動了,等到INTX變?yōu)榈碗娖綍r定時計數(shù)器又被關(guān)閉了,那么此時定時計數(shù)器計數(shù)值即為一個PWM脈寬了。
說到這里突然想到了在AVR里面,定時計數(shù)器都有自己的分頻器,這里也可以先設(shè)置定時計數(shù)器的啟動條件都滿足,但設(shè)置為無分頻,此時相當(dāng)于人沒有了心臟,定時計數(shù)器此時是不工作的。可以在其他什么條件(如一個外部中斷里面)滿足時,給定時計數(shù)器分頻,此時定時計數(shù)器才工作!
剛才說到中斷,與51不同的是,AVR對中斷標(biāo)志位清“0”的操作時向該位寫“1”。即AVR清除中斷標(biāo)志位是軟件寫“1”。值得提醒的是在設(shè)置中斷寄存器的時候,最好先清除中斷標(biāo)志位,然后馬上將相應(yīng)的中斷允許控制位值“1”。
這里還需要說明的是上文提及到的定時計數(shù)器波形輸出引腳和輸入捕獲引腳,在使用之前,必須要先設(shè)置好它的方向寄存器是輸出還是輸入。如果是輸入的話還需要考慮是否需要上拉電阻。
說了這么多,差點忘記了個人覺得比較重要的一點。定時計數(shù)器1是16位的,它的每一個16位的寄存器分別配備了一個8位的TEMP寄存器,用來臨時性的保留寄存器的高8位數(shù)據(jù)。MCU從16位寄存器讀數(shù)據(jù)時時,低8位被送到MCU的同時,高8位被送到TEMP,當(dāng)MCU讀高8位時取的是TEMP中的數(shù)據(jù)。從MCU寫數(shù)據(jù)16位數(shù)據(jù)寄存器時,高8位寫到TEMP,寫低8位的時候,低8位與TEMP中的高8位組成16位數(shù)據(jù)寫到16位寄存器中。即讀的時候是先讀低8位,再讀高8位;寫的時候是先寫高8位,再寫低8位。
最后給出定時計數(shù)器常用3種工作模式的設(shè)置方法(以定時計數(shù)器1為例):
普通模式:
1,根據(jù)需要設(shè)置時鐘源,即設(shè)置控制寄存器TCCR1B。
2,根據(jù)定時時間和時鐘源確定定時器的初值寫入到數(shù)據(jù)寄存器TCNT1H和TCNT1B。
3,設(shè)置中斷時能位。
4,選擇中斷號,編寫中斷服務(wù)程序。注意需要在中斷服務(wù)程序中重載初值寫入到TCNT1H和TCNT1B(和51一樣的)!
CTC模式:
1,若輸出波形,設(shè)置端口OC1A或OC1B為輸出方式。
2,設(shè)置波形發(fā)生模式,選擇需要的時鐘源,即TCCR1B。
3,設(shè)置輸出模式,即TCCR1A。
4,根據(jù)需要設(shè)置上限值top(前面提到過的)寫入到輸出比較寄存器OCR1A。
5,根據(jù)公式計算頻率。
快速PWM模式:
1,若輸出波形,設(shè)置端口OC1A或OC1B為輸出方式。
2,設(shè)置PWM波形模式,選擇需要的時鐘源,即TCCR1A和TCCR1B。
3,設(shè)置波形的頻率,即OCR1A。
4,設(shè)置波形占空比,即OCCR1B。
6,根據(jù)頻率公式計算頻率。
評論
查看更多