MSP430F5529 (六)定時器Timer_A-2
6.4.2 捕獲模式
當CAP=1時,選擇捕獲模式。捕獲模式用于記錄時間事件,比如速度估計或時間測量。捕獲輸入CCIXA和CCLXB連接外部的引腳或內(nèi)部的信號,這通過CCISX位來選擇。CMX位選擇捕獲輸入信號觸發(fā)沿;上升沿、下降沿或兩者都捕獲。當輸入信號的觸發(fā)沿到來時,捕獲事件發(fā)生:
○定時器的TAR值復制到TACCRX寄存器中
○中斷標志位CCIFG置位
注意:①捕獲信號可能會和定時器時鐘不同步,并導致競爭條件的發(fā)生。將SCS位置位可以在下個定時器時鐘使捕獲同步
②如果第二次捕獲發(fā)生時,第一次捕獲的TAR值還沒有及時被存到TACCRx,捕獲比較寄存器就會產(chǎn)生一個溢出邏輯,COV位在此時置位, COV位必須軟件清除。
6.5 輸出模塊
傳統(tǒng)的定時器,都是通過標志位的判斷來定時觸發(fā)事件的。而430則具有輸出模塊,通過和定時結(jié)合起來,可以方便的產(chǎn)生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 | 置位 | 當定時器計數(shù)到TACCRX值時,輸出置位,并保 持置位直到定時器復位或選擇了另一個輸出模式 |
010 | 翻轉(zhuǎn)/復位 | 當定時器計數(shù)到TACCRX值時,輸出翻轉(zhuǎn)。當定 時器計數(shù)到TACCR0值時,輸出復位 |
011 | 置位/復位 | 當定時器計數(shù)到TACCRX值時,輸出置位。當定 時器計數(shù)到TACCR0值時,輸出復位 |
100 | 翻轉(zhuǎn) | 當定時器計數(shù)到TACCRX值時,輸出翻轉(zhuǎn)。輸出 信號的周期將是定時器的2倍 |
101 | 復位 | 當定時器計數(shù)到TACCRX值時,輸出復位,并保 持復位直到選擇了另一個輸出模式 |
110 | 翻轉(zhuǎn)/置位 | 當定時器計數(shù)到TACCRX值時,輸出翻轉(zhuǎn)。當定 時器計數(shù)到TACCR0值時,輸出置位 |
111 | 復位/置位 | 當定時器計數(shù)到TACCRX值時,輸出復位。當定 時器計數(shù)到TACCR0值時,輸出置位 |
舉一個例子:結(jié)合上表看下圖
注意:在模式轉(zhuǎn)換的時候,一定要保持OUTMOD至少一位置位,除非轉(zhuǎn)向0模式。所以最好的做法是:先把OUTMOD置為7,然后再清除掉不需要的位。
做一個說明:比較模式下,當計數(shù)器TAR中的值和TACCRX中的設計值相等時,相應捕獲/比較器的EQUx就會置位。那么EQU0、EQUx和OUTMOD是怎么來影響輸出的呢?以模式2(翻轉(zhuǎn)/復位)為例,該模式的定義是這樣的:當定時器計數(shù)到TACCRX值時,輸出翻轉(zhuǎn)。當定時器計數(shù)到TACCR0值時,輸出復位。于是,這句話就也可以翻譯成在模式2的條件下,當EQUX=1時,輸出翻轉(zhuǎn);當EQU0等于1的時候,輸出復位。這兩個信號這里相當于兩個觸發(fā)(使能)信號了。
總結(jié)
實驗一:
/*利用Timer_A比較模式下的多路定時,讓LED閃爍*/
#include
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; //置入要比較的數(shù)值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作為時鐘,選用連續(xù)模式,并開啟中斷
/*這樣的話,5個燈閃一遍的時間為0xffff/32768=2S*/
__enable_interrupt(); //開啟總中斷
while(1);
}
/*TIMER0_A0_VECTOR是計時器0的CCR0的中斷寄存器,TIMER0_A1_VECTOR是計時器0的CCR1-CCR4、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內(nèi)的偶數(shù)時才會執(zhí)行switch函數(shù)內(nèi)的語句
其作用是提高switch語句的效率*/
{
case 2:P1OUT=BIT1;break; //TACCR1 CCIFG置位,表明計數(shù)值和設定的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;
}
}
評論