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