在线看毛片网站电影-亚洲国产欧美日韩精品一区二区三区,国产欧美乱夫不卡无乱码,国产精品欧美久久久天天影视,精品一区二区三区视频在线观看,亚洲国产精品人成乱码天天看,日韩久久久一区,91精品国产91免费

<menu id="6qfwx"><li id="6qfwx"></li></menu>
    1. <menu id="6qfwx"><dl id="6qfwx"></dl></menu>

      <label id="6qfwx"><ol id="6qfwx"></ol></label><menu id="6qfwx"></menu><object id="6qfwx"><strike id="6qfwx"><noscript id="6qfwx"></noscript></strike></object>
        1. <center id="6qfwx"><dl id="6qfwx"></dl></center>

            新聞中心

            EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > AVR定時(shí)/計(jì)數(shù)器應(yīng)用設(shè)計(jì)

            AVR定時(shí)/計(jì)數(shù)器應(yīng)用設(shè)計(jì)

            作者: 時(shí)間:2016-11-11 來源:網(wǎng)絡(luò) 收藏
            定時(shí)/計(jì)數(shù)器(Timer/counter)是單片機(jī)芯片中最基本的外圍接口,它的用途非常廣泛,常用于測量時(shí)間、速度、頻率、脈寬、提供定時(shí)脈沖信號等。相對于一般8位單片機(jī)而言,AVR不僅配備了更多的定時(shí)/計(jì)數(shù)器接口,而且還是增強(qiáng)型的,功能非常強(qiáng)大。ATmega128一共配置了2個(gè)8位和2個(gè)16位,共4個(gè)定時(shí)/計(jì)數(shù)器,本小節(jié)重點(diǎn)對它的一些增強(qiáng)功能的應(yīng)用做基本的介紹。

            5.9.1預(yù)分頻器
            定時(shí)/計(jì)數(shù)器最基本的功能就是對脈沖信號計(jì)數(shù),當(dāng)計(jì)數(shù)器計(jì)滿后(8位為255,16位為65535),再來一個(gè)脈沖它就翻轉(zhuǎn)到0,并產(chǎn)生中斷信號。同其他單片機(jī)類似,AVR的定時(shí)/計(jì)數(shù)器的計(jì)數(shù)脈沖可以來自外部的引腳,也可以由從內(nèi)部系統(tǒng)時(shí)鐘獲得;但AVR的定時(shí)/計(jì)數(shù)器在內(nèi)部系統(tǒng)時(shí)鐘和計(jì)數(shù)單元之間增加了一個(gè)預(yù)分頻器,利用預(yù)分頻器,定時(shí)/計(jì)數(shù)器可以從內(nèi)部系統(tǒng)時(shí)鐘獲得不同頻率的信號。表5-1為系統(tǒng)時(shí)鐘為4MHz使用定時(shí)/計(jì)數(shù)器0的最高計(jì)時(shí)精度和時(shí)寬范圍。

            表5-1T/C0計(jì)時(shí)精度和時(shí)寬(系統(tǒng)時(shí)鐘4MHz)
            分頻系數(shù)計(jì)時(shí)頻率最高計(jì)時(shí)精度(TCNT0=255)最寬時(shí)寬(TCNT0=0)
            14MHz0.25us64us
            8500KHz2us512us
            32125KHz8us2.048ms
            6462.5KHz16us4.096ms
            12831.25KHz32us8.192ms
            25615.625KHz64us16.384ms
            10243906.25Hz256us65.536ms

            從表中看出,在系統(tǒng)時(shí)鐘為4MHz時(shí),8位的T/C0最高計(jì)時(shí)精度為0.25us,最長的時(shí)寬可達(dá)到65.536ms。而使用16位的定時(shí)/計(jì)數(shù)器時(shí),不需要輔助的軟件計(jì)數(shù)器,就可以非常方便的設(shè)計(jì)一個(gè)時(shí)間長達(dá)16.777216秒(精度為256us)的定時(shí)器,這對于其它的8位單片機(jī)是做不到的。
            AVR單片機(jī)的每一個(gè)定時(shí)/計(jì)數(shù)器都配備獨(dú)立的、多達(dá)10位的預(yù)分頻器,由軟件設(shè)定分頻系數(shù),與8/16位定時(shí)/計(jì)數(shù)器配合,可以提供多種檔次的定時(shí)時(shí)間。使用時(shí)可選取最接近的定時(shí)檔次,即選8/16位定時(shí)/計(jì)數(shù)器與分頻系數(shù)的最優(yōu)組合,減少了定時(shí)誤差。所以,AVR定時(shí)/計(jì)數(shù)器的顯著特點(diǎn)之一是:高精度和寬時(shí)范圍,使得用戶應(yīng)用起來更加靈活和方便。此外,AVR的USART、SPI、I2C、WDT等都不占用這些定時(shí)/計(jì)數(shù)器。

            5.9.2輸入捕捉功能
            ATmega128的兩個(gè)16位定時(shí)/計(jì)數(shù)器(T/C1、T/C3)具有輸入捕捉功能,它是AVR定時(shí)/計(jì)數(shù)器的又一個(gè)顯著的特點(diǎn)。其基本作用是當(dāng)一個(gè)事件發(fā)生時(shí),立即將定時(shí)/計(jì)數(shù)器的值鎖定在輸入捕捉寄存器中(定時(shí)/計(jì)數(shù)器保持繼續(xù)運(yùn)行)。利用輸入捕捉功能,可以對一個(gè)事件從發(fā)生到結(jié)束的時(shí)間進(jìn)行更加精確,如下面的示例中精確測量一個(gè)脈沖的寬度。
            測量一個(gè)脈沖的寬度,就是測量脈沖上升沿到下降之間的時(shí)間。不使用輸入捕捉功能,一般情況往往需要使用兩個(gè)外圍部件才能完成和實(shí)現(xiàn)。如使用1個(gè)定時(shí)/計(jì)數(shù)器加1個(gè)外部中斷(或模擬比較器):定時(shí)/計(jì)數(shù)器用于計(jì)時(shí);而外部中斷方式設(shè)置成電平變化觸發(fā)方式,用于檢測脈沖的上升和下降沿。當(dāng)外部中斷輸入電平由低變高,觸發(fā)中斷,讀取時(shí)間1;等到輸入電平由高變低時(shí),再次觸發(fā)中斷,讀取時(shí)間2;兩次時(shí)間差既為脈沖寬度。這種實(shí)現(xiàn)方式不僅多占用了一個(gè)單片機(jī)的內(nèi)部資源,而且精度也受到中斷響應(yīng)時(shí)間的限制。因?yàn)橐坏┲袛喟l(fā)生,MCU響應(yīng)中斷需要時(shí)間,在中斷中可能要進(jìn)行適當(dāng)?shù)闹袛喱F(xiàn)場保護(hù),才能讀取時(shí)間值。而此時(shí)的時(shí)間值比中斷發(fā)生的時(shí)間已經(jīng)滯后了。
            而使用ATmega128的1個(gè)定時(shí)/計(jì)數(shù)器,再配合其輸入捕捉功能來測量脈沖的寬度就非常方便,下面是實(shí)現(xiàn)的程序示例。

            #include

            #defineICP1 PIND.4 //脈沖輸入由ICP1(Pind.4)輸入

            unsignedcharov_counter;
            unsignedintrising_edge,falling_edge;
            unsignedlongpulse_clocks;

            interrupt[TIM1_OVF]voidtimer1_ovf_isr(void) //T/C1溢出中斷
            {
            ov_counter++; //記錄溢出次數(shù)
            }

            interrupt[TIM1_CAPT]voidtimer1_capt_isr(void) //T/C1捕捉中斷
            {
            if(ICP1)
            { //上升沿中斷
            rising_edge=ICR1; //記錄上升沿開始時(shí)間
            TCCR1B=TCCR1B&0xBF; //設(shè)置T/C1為下降沿觸發(fā)捕捉
            ov_counter=0; //清零溢出計(jì)數(shù)器
            }
            else
            { //下降沿中斷
            falling_edge=ICR1; //記錄下降沿時(shí)間
            TCCR1B=TCCR1B|0x40; //設(shè)置T/C1為上升沿觸發(fā)捕捉
            pulse_clocks=(unsignedlong)falling_edge-(unsignedlong)rising_edge
            +(unsignedlong)ov_counter*0x10000/500; //計(jì)算脈沖寬度
            }
            }

            voidmain(void)
            {
            TCCR1B=0x42; //初始化T/C1,1/8分頻,上升沿觸發(fā)捕捉
            TIMSK=0x24; //允許T/C1溢出和捕捉中斷
            #asm("sei")

            while(1)
            {………
            };
            }
            這段程序是在CVAVR中實(shí)現(xiàn)的。在T/C1的捕捉中斷中,先檢查ICP1的實(shí)際狀態(tài),以確定是出現(xiàn)了上升沿還是下降沿信號。如果中斷是由上升沿觸發(fā)的(ICP1為高電平),程序便開始一次脈沖寬度的測量:記錄下上升沿出現(xiàn)的時(shí)間,把T/C1的捕捉觸發(fā)方式改為下降沿觸發(fā),并清空溢出計(jì)數(shù)器。如果中斷由下降沿觸發(fā)(ICP1為低電平),表示到達(dá)脈沖的未端,程序記錄下降沿出現(xiàn)時(shí)間,計(jì)算出脈沖的寬度,再將T/C1的捕捉觸發(fā)方式改為上升沿觸發(fā),以開始下一次的測量。
            脈沖的實(shí)際寬度(毫秒格式)是根據(jù)T/C1的計(jì)數(shù)時(shí)鐘個(gè)數(shù)來計(jì)算的。本例中T/C1的計(jì)數(shù)時(shí)鐘是系統(tǒng)時(shí)鐘(4MHz)的8分頻,即500KHz,相應(yīng)的計(jì)數(shù)脈沖寬度為2us。因此計(jì)算出從上升沿和下降沿之間總的計(jì)數(shù)脈沖個(gè)數(shù),除以500個(gè)脈沖(為1ms)即得到以毫秒為單位的被測脈沖寬度了。
            可以看到,使用定時(shí)/計(jì)數(shù)器以及配合它的捕捉功能測量脈沖寬度,不僅節(jié)省系統(tǒng)的硬件資源,編寫程序簡單,而且精度也高,因?yàn)樽x到的上升沿和下降沿的時(shí)間就是其實(shí)際發(fā)生的時(shí)間。


            評論


            技術(shù)專區(qū)

            關(guān)閉