6.4 捕獲比較模塊html
這是在以上介紹的基礎上正式講TA的重要功能。異步
先看一個寄存器TACCTL0-TACCTL6:(TA中最複雜的寄存器,用到的時候查表啦) 函數
CMx:捕獲模式設定 00 不捕獲 01 上升沿捕獲 10 降低沿捕獲 11上升和降低沿都捕獲優化
CCISx:捕獲源的選擇 00 CCIxA 01 CCIxB 10 GND 11 VCC spa
SCS:同步捕獲源,設定是否與時鐘同步 0 異步捕獲 1 同步捕獲 翻譯
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時,選擇捕獲模式。捕獲模式用於記錄時間事件,好比速度估計或時間測量。捕獲輸入CCIXA和CCLXB鏈接外部的引腳或內部的信號,這經過CCISX位來選擇。CMX位選擇捕獲輸入信號觸發沿;上升沿、降低沿或二者都捕獲。當輸入信號的觸發沿到來時,捕獲事件發生:
○定時器的TAR值複製到TACCRX寄存器中
○中斷標誌位CCIFG置位
注意:①捕獲信號可能會和定時器時鐘不一樣步,並致使競爭條件的發生。將SCS位置位能夠在下個定時器時鐘使捕獲同步
②若是第二次捕獲發生時,第一次捕獲的TAR值尚未及時被存到TACCRx,捕獲比較寄存器就會產生一個溢出邏輯,COV位在此時置位, COV位必須軟件清除。
6.5 輸出模塊
傳統的定時器,都是經過標誌位的判斷來定時觸發事件的。而430則具備輸出模塊,經過和定時結合起來,能夠方便的產生PWM信號或者其它控制信號
每一個捕獲/比較器都有一個輸出口,如P1.1-P1.5對應TA0.0-TA0.4這5個捕獲比較器的輸出。
輸出模式: 輸出模式由OUTMODx位來肯定,以下表對於全部模式來講(模式0除外),OUTx信號隨着定時器時鐘的上升沿而改變。輸出模式2,3,6和7對輸出模式0無效,由於此模式下,EQUx=EQU0。(復位指的是置0)
OUTMODX |
模式 |
說明 |
000 |
輸出 |
輸出信號OUTx由OUT位定義。當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就會置位。那麼EQU0、EQUx和OUTMOD是怎麼來影響輸出的呢?以模式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