(10)MSP430F5529 定時器Timer_A

6.4  捕獲比較模塊html

這是在以上介紹的基礎上正式講TA的重要功能。異步

先看一個寄存器TACCTL0-TACCTL6:(TA中最複雜的寄存器,用到的時候查表啦) 函數

CMx:捕獲模式設定    00 不捕獲  01 上升沿捕獲  10 降低沿捕獲  11上升和降低沿都捕獲優化

CCISx捕獲源的選擇           00 CCIxA  01 CCIxB  10 GND  11 VCC spa

SCS:同步捕獲源,設定是否與時鐘同步   0 異步捕獲  同步捕獲 翻譯

SCCI:選擇的CCI輸入信號EQUx信號鎖存,並可經過該位讀取。設計

CAP 0-比較模式     1-捕獲模式htm

OUTMOD輸出模式控制位(以後會在輸出模塊詳細解釋)     blog

CCIE中斷使能,該位容許相應的CCIFG標誌中斷請求 。 0-中斷禁止      1 -中斷容許 事件

CCI3 捕獲比較輸入,所選擇的輸入信號能夠經過該位讀取

OUT  對於輸出模式0,該位直接控制輸出狀態 0-輸出低電平    1-輸出高電平

COV捕獲溢出位。該位表示一個捕獲溢出發出,COV必須由軟件復位。 0-沒有捕獲溢出發生   1-有捕獲溢出發生

CCIFG捕獲比較中斷標誌位。 0-沒有中斷掛起    1-有中斷掛起

最後一個寄存器TAIV:(還記得外部中斷寄存器嗎,裏面一樣存儲的只是一箇中斷代號)裏面沒有TACCR0的中斷標誌,由於TACCR0優先級最高,有一個專門的中斷向量)

這裏面的標誌位須要軟件手動清零。一種狀況例外:兩個中斷同時發生,先響應優先級高的中斷,當該中斷服務程序結束後,該位的中斷標誌會自動清零,而後去響應另一箇中斷。

6.4.1比較模式

  TA啓動時默認爲比較模式。CAP=0時選擇比較模式)

  比較模式簡介:(也就是通常意義上的定時計時模式)

  這是定時器的默認模式,當在比較模式下的時候,與捕獲模式相關的硬件中止工做,若是這個時候開啓定時器中斷,而後設置定時器終值(將終值寫入TACCRx),開啓定時器,當TAR的值增長到和某個TACCRx裏面的值相等的的時候,相應的中斷標誌位CCIFGx置一,同時中斷標誌位TAIFG置位。若中斷容許未開啓則只將中斷標誌位CCIFGx置一。還記得51單片機的定時器嗎)

  注意:當Timer_A要用到TACCR0的值做爲終值來計數(也就是增模式或者增減模式),很顯然TACCR0的值必定要大於其TACCRx的值,不然那些比TACCR0大的計數值就沒有存在的意義了。

  所謂的比較就是,若是計數器TAR中的值和某個TACCRx中的值相等了,那麼相應的標誌位就會置位。

   這只是一個原理,實際應用的時候,會很靈活,經過一個一個設定每次的TACCR值,能夠獲得想要的各類時間間隔。

         總結:比較模式用於選擇PWM輸出信號或在特定的時間間隔中斷。當TAR計數到TACCRx的值時: 

         ○相應的中斷標誌CCIFG置位;

  ○內部信號EQUx=1 

         EQUx根據輸出模式來影響輸出信號 

         ○輸入信號CCI鎖存到SCCI 

6.4.2  捕獲模式

   CAP=1時,選擇捕獲模式。捕獲模式用於記錄時間事件,好比速度估計或時間測量。捕獲輸入CCIXACCLXB鏈接外部的引腳或內部的信號,這經過CCISX位來選擇。CMX位選擇捕獲輸入信號觸發沿;上升沿、降低沿或二者都捕獲。當輸入信號的觸發沿到來時,捕獲事件發生: 

   定時器的TAR值複製到TACCRX寄存器中 

  ○中斷標誌位CCIFG置位 

注意:捕獲信號可能會和定時器時鐘不一樣步,並致使競爭條件的發生。將SCS位置位能夠在下個定時器時鐘使捕獲同步

              若是第二次捕獲發生時,第一次捕獲的TAR值尚未及時被存到TACCRx,捕獲比較寄存器就會產生一個溢出邏輯,COV位在此時置位, COV位必須軟件清除。

6.5 輸出模塊

  傳統的定時器,都是經過標誌位的判斷來定時觸發事件的。而430則具備輸出模塊,經過和定時結合起來,能夠方便的產生PWM信號或者其它控制信號

  每一個捕獲/比較器都有一個輸出口,P1.1-P1.5對應TA0.0-TA0.45個捕獲比較器的輸出

  輸出模式: 輸出模式由OUTMODx位來肯定,以下表對於全部模式來講(模式0除外),OUTx信號隨着定時器時鐘的上升沿而改變。輸出模式2367對輸出模式0無效,由於此模式下,EQUx=EQU0(復位指的是置0

OUTMODX

模式

說明

000

輸出

輸出信號OUTxOUT位定義。當OUT位更

新時,OUTx信號馬上更新 

001

置位

當定時器計數到TACCRX值時,輸出置位,並保

持置位直到定時器復位或選擇了另外一個輸出模式

010

翻轉/復位

當定時器計數到TACCRX值時,輸出翻轉。當定

時器計數到TACCR0值時,輸出復位 

011

置位/復位

當定時器計數到TACCRX值時,輸出置位。當定

時器計數到TACCR0值時,輸出復位 

100

翻轉

當定時器計數到TACCRX值時,輸出翻轉。輸出

信號的週期將是定時器的2

101

復位

當定時器計數到TACCRX值時,輸出復位,並保

持復位直到選擇了另外一個輸出模式 

110

翻轉/置位

當定時器計數到TACCRX值時,輸出翻轉。當定

時器計數到TACCR0值時,輸出置位

111

復位/置位

當定時器計數到TACCRX值時,輸出復位。當定

時器計數到TACCR0值時,輸出置位 

舉一個例子:結合上表看下圖 

              注意:在模式轉換的時候,必定要保持OUTMOD至少一位置位,除非轉向0模式。因此最好的作法是:先把OUTMOD置爲7,而後再清除掉不須要的位。

              作一個說明:比較模式下,當計數器TAR中的值和TACCRX中的設計值相等時,相應捕獲/比較器的EQUx就會置位。那麼EQU0EQUxOUTMOD是怎麼來影響輸出的呢?以模式2(翻轉/復位)爲例,該模式的定義是這樣的:當定時器計數到TACCRX值時,輸出翻轉。當定時器計數到TACCR0值時,輸出復位。因而,這句話就也能夠翻譯成在模式2的條件下,當EQUX=1時,輸出翻轉;當EQU0等於1的時候,輸出復位。這兩個信號這裏至關於兩個觸發(使能)信號了。 

總結

實驗一:

/*利用Timer_A比較模式下的多路定時,讓LED閃爍*/

#include <msp430f5529.h>

void main(void)

{

   WDTCTL=WDTPW+WDTHOLD;

   P1DIR|=(BIT1+BIT2+BIT3+BIT4+BIT5);  //P1.1-P1.5爲輸出方向

   P1OUT=0x00;                     //所有拉低,初始化LED全滅

   TA0CCTL1=CCIE;                  //捕獲比較器1開啓CCIFG位中斷

   TA0CCR1=13107;                      //置入要比較的數值0xff/5=13107

   TA0CCTL2=CCIE;                 //捕獲比較器2開啓中斷

   TA0CCR2=26214;                  //13107*2=26214

   TA0CCTL3=CCIE;                 //捕獲比較器3開啓中斷

   TA0CCR3=39321;                     //13107*3=39321

   TA0CCTL4=CCIE;                  //捕獲比較器4開啓中斷

   TA0CCR4=52428;                  //13107*4=52428

   TA0CTL|=TACLR+TAIE;              //開啓中斷並清零

   TA0CTL|=TASSEL_1+MC_2+TAIE;     //選擇SCLK32.768KHZ做爲時鐘,選用連續模式,並開啓中斷

   /*這樣的話,5個燈閃一遍的時間爲0xffff/32768=2S*/

   __enable_interrupt();    //開啓總中斷

   while(1);

}

/*TIMER0_A0_VECTOR是計時器0的CCR0的中斷寄存器,TIMER0_A1_VECTOR是計時器0的CCR1-CCR四、TA的寄存器*/

/*同理定時器TA1也是分爲兩個TIMER1_A0_VECTOR和TIMER1_A1_VECTOR*/

#pragma vector=TIMER0_A1_VECTOR

__interrupt void TimerA(void)

{

   switch(__even_in_range(TA0IV,14))

   /* 這句話的意思是:只有在TA0IV的值是在0--14內的偶數時纔會執行switch函數內的語句

            其做用是提升switch語句的效率*/

   {

      case 2:P1OUT=BIT1;break; //TACCR1 CCIFG置位,代表計數值和設定的13107相等了,也就是說計了0.4S了

      case 4:P1OUT=BIT2;break; //TACCR2 CCIFG置位,代表計了0.8S了

      case 6:P1OUT=BIT3;break; //TACCR3 CCIFG置位,代表計了1.2S了

      case 8:P1OUT=BIT4;break; //TACCR4 CCIFG置位,代表計了1.6S了

      case 14:P1OUT=BIT5;break;   //TAIFG置位,代表計了2S了

      default:break;

   }

}

 

實驗二:比較模式-增減模式輸出PWM

/*在比較和增減模式下產生PWM波(矩形波) */

/*提一個PWM波的用處:驅動直流電機。咱們知道對於直流電機,驅動它的電流的頻率並不影響轉速 ,只有佔空比會影響轉速*/

/*開發板上P2.0是有外接排針的,因此用這一端口輸出PWM*/

/*看CPU引腳發現,P2.0爲TA1.1,也就是定時器A1的1號捕獲比較器輸出口*/

#include <msp430.h>

void main(void)

{

   WDTCTL=WDTPW+WDTHOLD;

   P2SEL|=BIT0;             //聲明有特殊功能,不作普通I/O使用

   P2DIR|=BIT0;             //輸出

   P2DS |=BIT0;            //全力驅動,不然可能沒法驅動電機

   P2OUT&=~BIT0;            //初始化輸出低電平

   /*把SMCL配置爲XT2 4MHZ*/

   P5SEL=BIT2+BIT3;           //聲明特殊功能,將用做外部時鐘晶振XT2輸入

   UCSCTL6&=~XT2OFF;         //開啓XT2

   while(SFRIFG1 & OFIFG)

   {

      UCSCTL7 &=~(XT2OFFG+DCOFFG+XT1LFOFFG);//清除3種時鐘錯誤標誌

      SFRIFG1&=~(OFIFG);       //清除時鐘錯誤標誌位

   }                    //直到XT2從起振到振盪正常,沒有錯誤發生

   UCSCTL4|=SELS_5;           //把SMCLK的時鐘源選爲XT2 4MHZ

   TA1CCTL0=CCIE;              //定時器A1的捕獲比較器0開啓CCIFG位中斷

   TA1CCR0=200;                //置入計數終值,則PWM頻率爲10KHZ

   TA1CCTL1=CCIE;               //捕獲比較器1開啓中斷

   TA1CCR1=50;                 //佔空比爲75%

   TA1CTL|=TACLR;              //將計時器A1清零

   TA1CTL|=TASSEL_2+MC_3;         //定時器選擇SMCLK做爲時鐘源,且爲增減模式

   TA1CCTL1=OUTMOD_4;        //定時器A1中的捕獲比較器1,輸出模式爲4翻轉

   while(1);

}

 //呼吸燈//

//  介紹: 該程序利用TIMER A 的 UP模式 在P1.3腳產生PWM輸出

//  將CCR0設置爲1500來定義PWM的週期,利用循環不斷改變CCR1的值,

//  實現利用改變PWM的佔空比來改變LED亮度.

//  SMCLK = MCLK = TACLK = default DCO

#include <msp430f5529.h>

void delay_nms(unsigned int n)// 延時函數

  {

    unsigned int j;

    for (j=0;j<(n);j++)

    {

      __delay_cycles(400);   //過短會使LED顯得好像在常亮,太長就要等較長時間來觀察了

    }

  }

void main(void)

{

  unsigned const PWMPeriod = 1500; //設置PWM週期參數,const聲明此值不容許改變.該數值太大,會致使LED閃爍

  volatile unsigned int i;        //聲明變量i是隨時可變的,系統不要去優化這個值

  WDTCTL = WDTPW + WDTHOLD;   // 關閉看門狗

  P1DIR |=BIT3;              // 設置 P1.3爲輸出

  P1SEL |=BIT3;              // 設置 P1.3爲TA0.2輸出

  TA0CCR0 = PWMPeriod;           // 設置PWM 週期

  TA0CCTL2 = OUTMOD_7;           // 設置PWM 輸出模式爲:7 - PWM復位/置位模式,

                              // 即輸出電平在TAR的值等於CCR2時復位爲0,當TAR的值等於CCR0時置位爲1,改變CCR2,從而產生PWM。其實模式2也能夠

  TA0CTL= TASSEL_2 +MC_1;    // 設置TIMERA的時鐘源爲SMCLK, 計數模式爲up,到CCR0再自動從0開始計數

  while(1)

  {

   TA0CCR2=0;//確保最開始是暗的

    //漸亮過程:不斷設置TA0CCR2的值,使翻轉的時間變長,改變PWM的佔空比

    for(i=0;i<PWMPeriod;i+=1)

    {

      TA0CCR2=i;

      delay_nms(4-(i/500));  //佔空比變化的延時,調整延遲時間可改變呼吸燈變暗的速度

                             //在暗的時候延長delay時間,可加強效果

     }

    //漸暗過程:不斷設置TA0CCR2的值,使翻轉的時間變短,改變PWM的佔空比

    for(i=PWMPeriod;i>0;i-=1)

    {

      TA0CCR2=i;

      delay_nms(4-(i/500));           //佔空比變化的延時,調整延遲時間可改變呼吸燈變暗的速度

                                    //在暗的時候延長delay時間,可加強效果

    }

     TA0CCR2=0;  //確保燈暗

     delay_nms(250); //時間長一點,加強視覺效果

  }

}

 文章摘錄於:http://blog.lehu.shu.edu.cn/879836630/A450185.html

相關文章
相關標籤/搜索