msp430f5529定時(shí)器
定時(shí)器A是一個(gè)復(fù)合了捕獲/比較寄存器的十六位的定時(shí)(加減)計(jì)數(shù)器。定時(shí)器A支持多重捕獲/比較,PWM輸出和內(nèi)部定時(shí),具有擴(kuò)展中斷功能,中斷可以由定時(shí)器溢出產(chǎn)生或由捕獲/比較寄存器產(chǎn)生。
特征簡(jiǎn)介:
○四種運(yùn)行模式的異步16位定時(shí)/計(jì)數(shù)器
○自身時(shí)鐘源可選擇配置
○最多達(dá)5個(gè)可配置的捕獲/比較寄存器(CCR)
capture/compare registers
○可配置的PWM輸出
○異步輸入和輸出鎖存
○對(duì)所有Timer_A中斷快速響應(yīng)的中斷向量寄存器
下面這張圖形象的解釋了Timer_A的結(jié)構(gòu)特性
6.2 TA(Timer_A)的幾個(gè)基本操作設(shè)置(含寄存器介紹及設(shè)置)
聲明:所有寄存器同樣支持字和字節(jié)操作,不要忘記這是什么意思
所有寄存器初始化都為0x0000
6.2.1 TA控制寄存器TACTL(最常用最基本)
再次說(shuō)明一下例如:TA0CTL、TA1CTL、TA2CTL分別表示3個(gè)不同
定時(shí)器A的控制寄存器
rw-(0)表示默認(rèn)讀寫(xiě)均為0
TASSELx :時(shí)鐘源選擇。盡量不要選TASSEL0-TACLK外部時(shí)鐘源,因?yàn)槿绻鸗ACLK和CPU時(shí)鐘不同步,很容易出問(wèn)題。(TA0CLK接P1.0引腳)
00 TACLK
01 ACLK
10 SMCLK
11 ~TACLK
IDx:第一次分頻控制。ID0-1分頻;ID1-2分頻;ID2-4分頻;ID3-8分頻
MC:工作模式控制。(建議在修改定時(shí)器運(yùn)行模式前先停止定時(shí)器(中斷使能、中斷標(biāo)志、TACLR例外),以避免產(chǎn)生未知的誤操作。)
00 停止模式:定時(shí)器停止
01 增模式: 定時(shí)器計(jì)數(shù)到TACCR0
10 連續(xù)模式,定時(shí)器計(jì)數(shù)到0FFFH
11增減模式:定時(shí)器加計(jì)數(shù)到TACCR0然后減計(jì)數(shù)到0000H
TACLR:定時(shí)器清零位。該位置位會(huì)復(fù)位TA寄存器,時(shí)鐘分頻和計(jì)數(shù)方向。
TACLR位會(huì)自動(dòng)復(fù)位并置0
TAIE:定時(shí)器中斷使能
0:中斷禁止
1:中斷允許
TAIFG:中斷標(biāo)志位
0:沒(méi)有中斷發(fā)生
1:有中斷掛起
6.2.2 計(jì)數(shù)值存放寄存器TAR
①顯然,最大存放計(jì)數(shù)值為0xFFFFh;
②(類(lèi)似51單片機(jī))可以被用來(lái)存放一個(gè)初值,然后選用連續(xù)模式。這樣不斷計(jì)滿再手動(dòng)填充,從而達(dá)到精確計(jì)時(shí)的效果;
③默認(rèn)為0,且對(duì)該寄存器可以直接賦值;
6.2.3 擴(kuò)展寄存器TAEX0
很簡(jiǎn)單,這個(gè)寄存器就是為了控制時(shí)鐘源的二次分頻(看結(jié)構(gòu)圖)。
該寄存器的低3為定義為T(mén)AIDEX:000-111分別表示1-8分頻
6.2.4 捕獲/比較寄存器TACCR0-TACCR4(共5個(gè))
比較模式下,用來(lái)設(shè)定計(jì)數(shù)終值;
捕獲模式下用來(lái)將捕獲的TAR值存放進(jìn)TACCRx中。
6.3 MC控制的四種工作模式的詳細(xì)講解
6.3.1 MC=0停止模式
這是系統(tǒng)默認(rèn)的模式,定時(shí)計(jì)數(shù)器禁止工作。
6.3.2 MC=1增模式
總結(jié)幾句話:(紅色標(biāo)記的很重要)
①此模式下嚴(yán)禁從0xffff開(kāi)始計(jì)數(shù);
②注意從0計(jì)到TACCR0,實(shí)際上記了TACCR0+1個(gè)數(shù);
③計(jì)到TACCR0后,會(huì)回到0重新開(kāi)始計(jì)數(shù);
④如果TAR的值大于TACCR0,這時(shí)候會(huì)立即從0開(kāi)始計(jì)數(shù);
⑤當(dāng)定時(shí)器計(jì)數(shù)到TACCR0的值時(shí),中斷標(biāo)志CCIFG位(之后會(huì)講到)置位。當(dāng)定時(shí)器由TACCR0返回0時(shí),TAIFG中斷標(biāo)志置位;
⑥在定時(shí)器運(yùn)行時(shí)修改TACCR0,如果新的周期值大于或等于舊的周期值,或大于當(dāng)前的定時(shí)器計(jì)數(shù)值,那么定時(shí)器立刻開(kāi)始執(zhí)行新周期計(jì)數(shù)。如果新周期小于當(dāng)前的計(jì)數(shù)值,那么定時(shí)器回到0。但是,在回到0之前會(huì)多一個(gè)額外的計(jì)數(shù)。
6.3.3 MC=2連續(xù)模式
在連續(xù)模式中,定時(shí)器重復(fù)計(jì)數(shù)到0FFFFH,然后重新從0開(kāi)始增計(jì)數(shù)(除非每次重裝計(jì)數(shù)初值)。當(dāng)定時(shí)器從0FFFFH到0時(shí),TAIFG中斷標(biāo)志置位。
應(yīng)用:連續(xù)模式下利用捕獲/比較器產(chǎn)生需要的時(shí)間間隔。原理是:計(jì)數(shù)在一直進(jìn)行,捕獲器TACCRX中存有第一個(gè)計(jì)數(shù)終值,每次捕獲器計(jì)到TACCRX時(shí),會(huì)產(chǎn)生中斷標(biāo)志,我們可以在中斷服務(wù)函數(shù)中寫(xiě)入一個(gè)計(jì)算好的下一個(gè)的計(jì)數(shù)終值,這樣無(wú)限計(jì)算和中斷下去,那么該捕獲器就會(huì)產(chǎn)生一個(gè)穩(wěn)定的時(shí)間間隔序列。(其實(shí)吧,不明白也沒(méi)關(guān)系。就算明白了,也不好用,因?yàn)橛?jì)算起來(lái)很麻煩而且也不好用)
如圖:
6.3.4 MC=3增減模式(常用于生成PWM波)
①該模式下,計(jì)數(shù)方向是固定的,即讓定時(shí)器停止后再重新啟動(dòng)定時(shí)器,它就沿著停止時(shí)的計(jì)數(shù)方向和數(shù)值開(kāi)始計(jì)數(shù)。如果不希望這樣,就需要將TACLR置位來(lái)清除方向。TACLR位也會(huì)清除TAR的值和定時(shí)器的時(shí)鐘分頻。
②此模式下置位情況如下圖:
③當(dāng)定時(shí)器運(yùn)行時(shí),改變TACCR0的值,如果正處于減計(jì)數(shù)的情況,定時(shí)器會(huì)繼續(xù)減到0,新的周期在減到0后開(kāi)始。
如果正處于增計(jì)數(shù)狀態(tài),新周期大于等于原來(lái)的周期,或比當(dāng)前計(jì)數(shù)值要大,定時(shí)器會(huì)增計(jì)數(shù)到新的周期;如果新周期小于原來(lái)的周期,定時(shí)器立刻開(kāi)始減計(jì)數(shù),但是,在定時(shí)器開(kāi)始減計(jì)數(shù)之前會(huì)多計(jì)一個(gè)數(shù)。
6.4 捕獲比較模塊
這是在以上介紹的基礎(chǔ)上正式講TA的重要功能。
先看一個(gè)寄存器TACCTL0-TACCTL6:(TA中最復(fù)雜的寄存器,用到的時(shí)候查表啦)
CMx:捕獲模式設(shè)定 00 不捕獲
01 上升沿捕獲
10 下降沿捕獲
11上升和下降沿都捕獲
CCISx:捕獲源的選擇 00 CCIxA
01 CCIxB
10 GND
11 VCC
SCS:同步捕獲源,設(shè)定是否與時(shí)鐘同步
0 異步捕獲
1 同步捕獲
SCCI:選擇的CCI輸入信號(hào)由EQUx信號(hào)鎖存,并可通過(guò)該位讀取。
CAP: 0-比較模式 1-捕獲模式
OUTMOD:輸出模式控制位。(之后會(huì)在輸出模塊詳細(xì)解釋)
CCIE:中斷使能,該位允許相應(yīng)的CCIFG標(biāo)志中斷請(qǐng)求 。
0-中斷禁止 1 -中斷允許
CCI 3 :捕獲比較輸入,所選擇的輸入信號(hào)可以通過(guò)該位讀取
OUT : 對(duì)于輸出模式0,該位直接控制輸出狀態(tài) 。
0-輸出低電平 1-輸出高電平
COV:捕獲溢出位。該位表示一個(gè)捕獲溢出發(fā)出,COV必須由軟件復(fù)位。
0-沒(méi)有捕獲溢出發(fā)生 1-有捕獲溢出發(fā)生
CCIFG:捕獲比較中斷標(biāo)志位。
0-沒(méi)有中斷掛起 1-有中斷掛起
最后一個(gè)寄存器TAIV:(還記得外部中斷寄存器嗎,里面同樣存儲(chǔ)的只是一個(gè)中斷代號(hào))
里面沒(méi)有TACCR0的中斷標(biāo)志,因?yàn)門(mén)ACCR0優(yōu)先級(jí)最高,有一個(gè)專(zhuān)門(mén)的中斷向量)
這里面的標(biāo)志位需要軟件手動(dòng)清零。一種情況例外:兩個(gè)中斷同時(shí)發(fā)生,先響應(yīng)優(yōu)先級(jí)高的中斷,當(dāng)該中斷服務(wù)程序結(jié)束后,該位的中斷標(biāo)志會(huì)自動(dòng)清零,然后去響應(yīng)另外一個(gè)中斷。
6.4.1比較模式
TA啟動(dòng)時(shí)默認(rèn)為比較模式。
(CAP=0時(shí)選擇比較模式)
比較模式簡(jiǎn)介:(也就是一般意義上的定時(shí)計(jì)時(shí)模式)
這是定時(shí)器的默認(rèn)模式,當(dāng)在比較模式下的時(shí)候,與捕獲模式相關(guān)的硬件停止工作,如果這個(gè)時(shí)候開(kāi)啟定時(shí)器中斷,然后設(shè)置定時(shí)器終值(將終值寫(xiě)入TACCRx),開(kāi)啟定時(shí)器,當(dāng)TAR的值增加到和某個(gè)TACCRx里面的值相等的的時(shí)候,相應(yīng)的中斷標(biāo)志位CCIFGx置一,同時(shí)中斷標(biāo)志位TAIFG置位。若中斷允許未開(kāi)啟則只將中斷標(biāo)志位CCIFGx置一。
(還記得51單片機(jī)的定時(shí)器嗎)
注意:當(dāng)Timer_A要用到TACCR0的值作為終值來(lái)計(jì)數(shù)(也就是增模式或者增減模式),很顯然TACCR0的值一定要大于其TACCRx的值,否則那些比TACCR0大的計(jì)數(shù)值就沒(méi)有存在的意義了。
下面是我畫(huà)的一個(gè)圖。比較形象的解釋了工作原理。(期間TACCR的值不改變)
所謂的比較就是,如果計(jì)數(shù)器TAR中的值和某個(gè)TACCRx中的值相等了,那么相應(yīng)的標(biāo)志位就會(huì)置位。
這只是一個(gè)原理,實(shí)際應(yīng)用的時(shí)候,會(huì)很靈活,通過(guò)一個(gè)一個(gè)設(shè)定每次的TACCR值,可以得到想要的各種時(shí)間間隔。
總結(jié):比較模式用于選擇PWM輸出信號(hào)或在特定的時(shí)間間隔中斷。當(dāng)TAR計(jì)數(shù)到TACCRx的值時(shí):
○相應(yīng)的中斷標(biāo)志CCIFG置位;
○內(nèi)部信號(hào)EQUx=1
○EQUx根據(jù)輸出模式來(lái)影響輸出信號(hào)
○輸入信號(hào)CCI鎖存到SCCI
6.4.2 捕獲模式
當(dāng)CAP=1時(shí),選擇捕獲模式。捕獲模式用于記錄時(shí)間事件,比如速度估計(jì)或時(shí)間測(cè)量。捕獲輸入CCIXA和CCLXB連接外部的引腳或內(nèi)部的信號(hào),這通過(guò)CCISX位來(lái)選擇。CMX位選擇捕獲輸入信號(hào)觸發(fā)沿;上升沿、下降沿或兩者都捕獲。當(dāng)輸入信號(hào)的觸發(fā)沿到來(lái)時(shí),捕獲事件發(fā)生:
○定時(shí)器的TAR值復(fù)制到TACCRX寄存器中
○中斷標(biāo)志位CCIFG置位
注意:①捕獲信號(hào)可能會(huì)和定時(shí)器時(shí)鐘不同步,并導(dǎo)致競(jìng)爭(zhēng)條件的發(fā)生。將SCS位置位可以在下個(gè)定時(shí)器時(shí)鐘使捕獲同步
②如果第二次捕獲發(fā)生時(shí),第一次捕獲的TAR值還沒(méi)有及時(shí)被存到TACCRx,捕獲比較寄存器就會(huì)產(chǎn)生一個(gè)溢出邏輯,COV位在此時(shí)置位, COV位必須軟件清除。
6.5 輸出模塊
傳統(tǒng)的定時(shí)器,都是通過(guò)標(biāo)志位的判斷來(lái)定時(shí)觸發(fā)事件的。而430則具有輸出模塊,通過(guò)和定時(shí)結(jié)合起來(lái),可以方便的產(chǎn)生PWM信號(hào)或者其它控制信號(hào)
每個(gè)捕獲/比較器都有一個(gè)輸出口,如P1.1-P1.5對(duì)應(yīng)TA0.0-TA0.4這5個(gè)捕獲比較器的輸出。
輸出模式: 輸出模式由OUTMODx位來(lái)確定,如下表對(duì)于所有模式來(lái)說(shuō)(模式0除外),OUTx信號(hào)隨著定時(shí)器時(shí)鐘的上升沿而改變。輸出模式2,3,6和7對(duì)輸出模式0無(wú)效,因?yàn)榇四J较拢珽QUx=EQU0。
(復(fù)位指的是置0)
OUTMODX模式說(shuō)明
000輸出輸出信號(hào)OUTx由OUT位定義。當(dāng)OUT位更
新時(shí),OUTx信號(hào)立刻更新
001置位當(dāng)定時(shí)器計(jì)數(shù)到TACCRX值時(shí),輸出置位,并保
持置位直到定時(shí)器復(fù)位或選擇了另一個(gè)輸出模式
010翻轉(zhuǎn)/復(fù)位當(dāng)定時(shí)器計(jì)數(shù)到TACCRX值時(shí),輸出翻轉(zhuǎn)。當(dāng)定
時(shí)器計(jì)數(shù)到TACCR0值時(shí),輸出復(fù)位
011置位/復(fù)位當(dāng)定時(shí)器計(jì)數(shù)到TACCRX值時(shí),輸出置位。當(dāng)定
時(shí)器計(jì)數(shù)到TACCR0值時(shí),輸出復(fù)位
100翻轉(zhuǎn)當(dāng)定時(shí)器計(jì)數(shù)到TACCRX值時(shí),輸出翻轉(zhuǎn)。輸出
信號(hào)的周期將是定時(shí)器的2倍
101復(fù)位當(dāng)定時(shí)器計(jì)數(shù)到TACCRX值時(shí),輸出復(fù)位,并保
持復(fù)位直到選擇了另一個(gè)輸出模式
110翻轉(zhuǎn)/置位當(dāng)定時(shí)器計(jì)數(shù)到TACCRX值時(shí),輸出翻轉(zhuǎn)。當(dāng)定
時(shí)器計(jì)數(shù)到TACCR0值時(shí),輸出置位
111復(fù)位/置位當(dāng)定時(shí)器計(jì)數(shù)到TACCRX值時(shí),輸出復(fù)位。當(dāng)定
時(shí)器計(jì)數(shù)到TACCR0值時(shí),輸出置位
舉一個(gè)例子:結(jié)合上表看下圖
注意:在模式轉(zhuǎn)換的時(shí)候,一定要保持OUTMOD至少一位置位,除非轉(zhuǎn)向0模式。所以最好的做法是:先把OUTMOD置為7,然后再清除掉不需要的位。
做一個(gè)說(shuō)明:比較模式下,當(dāng)計(jì)數(shù)器TAR中的值和TACCRX中的設(shè)計(jì)值相等時(shí),相應(yīng)捕獲/比較器的EQUx就會(huì)置位。那么EQU0、EQUx和OUTMOD是怎么來(lái)影響輸出的呢?以模式2(翻轉(zhuǎn)/復(fù)位)為例,該模式的定義是這樣的:當(dāng)定時(shí)器計(jì)數(shù)到TACCRX值時(shí),輸出翻轉(zhuǎn)。當(dāng)定時(shí)器計(jì)數(shù)到TACCR0值時(shí),輸出復(fù)位。于是,這句話就也可以翻譯成在模式2的條件下,當(dāng)EQUX=1時(shí),輸出翻轉(zhuǎn);當(dāng)EQU0等于1的時(shí)候,輸出復(fù)位。這兩個(gè)信號(hào)這里相當(dāng)于兩個(gè)觸發(fā)(使能)信號(hào)了。
總結(jié)
實(shí)驗(yàn)一:
/*利用Timer_A比較模式下的多路定時(shí),讓LED閃爍*/
#include
void main(void)
{
WDTCTL=WDTPW+WDTHOLD;
P1DIR|=(BIT1+BIT2+BIT3+BIT4+BIT5);//P1.1-P1.5為輸出方向
P1OUT=0x00; //全部拉低,初始化LED全滅
TA0CCTL1=CCIE; //捕獲比較器1開(kāi)啟CCIFG位中斷
TA0CCR1=13107; //置入要比較的數(shù)值0xff/5=13107
TA0CCTL2=CCIE; //捕獲比較器2開(kāi)啟中斷
TA0CCR2=26214; //13107*2=26214
TA0CCTL3=CCIE; //捕獲比較器3開(kāi)啟中斷
TA0CCR3=39321; //13107*3=39321
TA0CCTL4=CCIE; //捕獲比較器4開(kāi)啟中斷
TA0CCR4=52428; //13107*4=52428
TA0CTL|=TACLR+TAIE; //開(kāi)啟中斷并清零
TA0CTL|=TASSEL_1+MC_2+TAIE;//選擇SCLK32.768KHZ作為時(shí)鐘,選用連續(xù)模式,并開(kāi)啟中斷
/*這樣的話,5個(gè)燈閃一遍的時(shí)間為0xffff/32768=2S*/
__enable_interrupt(); //開(kāi)啟總中斷
while(1);
}
/*TIMER0_A0_VECTOR是計(jì)時(shí)器0的CCR0的中斷寄存器,TIMER0_A1_VECTOR是計(jì)時(shí)器0的CCR1-CCR4、TA的寄存器*/
/*同理定時(shí)器TA1也是分為兩個(gè)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ù)時(shí)才會(huì)執(zhí)行switch函數(shù)內(nèi)的語(yǔ)句
其作用是提高switch語(yǔ)句的效率*/
{
case 2:P1OUT=BIT1;break; //TACCR1 CCIFG置位,表明計(jì)數(shù)值和設(shè)定的13107相等了,也就是說(shuō)計(jì)了0.4S了
case 4:P1OUT=BIT2;break; //TACCR2 CCIFG置位,表明計(jì)了0.8S了
case 6:P1OUT=BIT3;break; //TACCR3 CCIFG置位,表明計(jì)了1.2S了
case 8:P1OUT=BIT4;break; //TACCR4 CCIFG置位,表明計(jì)了1.6S了
case 14:P1OUT=BIT5;break; //TAIFG置位,表明計(jì)了2S了
default:break;
}
}
實(shí)驗(yàn)二:比較模式-增減模式輸出PWM波
/*在比較和增減模式下產(chǎn)生PWM波(矩形波) */
/*提一個(gè)PWM波的用處:驅(qū)動(dòng)直流電機(jī)。我們知道對(duì)于直流電機(jī),驅(qū)動(dòng)它的電流的頻率并不影響轉(zhuǎn)速 ,只有占空比會(huì)影響轉(zhuǎn)速*/
/*開(kāi)發(fā)板上P2.0是有外接排針的,所以用這一端口輸出PWM*/
/*看CPU引腳發(fā)現(xiàn),P2.0為T(mén)A1.1,也就是定時(shí)器A1的1號(hào)捕獲比較器輸出口*/
#include
void main(void)
{
WDTCTL=WDTPW+WDTHOLD;
P2SEL|=BIT0; //聲明有特殊功能,不做普通I/O使用
P2DIR|=BIT0; //輸出
P2DS |=BIT0; //全力驅(qū)動(dòng),否則可能無(wú)法驅(qū)動(dòng)電機(jī)
P2OUT&=~BIT0; //初始化輸出低電平
/*把SMCL配置為XT2 4MHZ*/
P5SEL=BIT2+BIT3; //聲明特殊功能,將用作外部時(shí)鐘晶振XT2輸入
UCSCTL6&=~XT2OFF; //開(kāi)啟XT2
while(SFRIFG1 & OFIFG)
{
UCSCTL7 &=~(XT2OFFG+DCOFFG+XT1LFOFFG);//清除3種時(shí)鐘錯(cuò)誤標(biāo)志
SFRIFG1&=~(OFIFG);//清除時(shí)鐘錯(cuò)誤標(biāo)志位
} //直到XT2從起振到振蕩正常,沒(méi)有錯(cuò)誤發(fā)生
UCSCTL4|=SELS_5; //把SMCLK的時(shí)鐘源選為XT2 4MHZ
TA1CCTL0=CCIE; //定時(shí)器A1的捕獲比較器0開(kāi)啟CCIFG位中斷
TA1CCR0=200; //置入計(jì)數(shù)終值,則PWM頻率為10KHZ
TA1CCTL1=CCIE; //捕獲比較器1開(kāi)啟中斷
TA1CCR1=50; //占空比為75%
TA1CTL|=TACLR; //將計(jì)時(shí)器A1清零
TA1CTL|=TASSEL_2+MC_3; //定時(shí)器選擇SMCLK作為時(shí)鐘源,且為增減模式
TA1CCTL1=OUTMOD_4; //定時(shí)器A1中的捕獲比較器1,輸出模式為4翻轉(zhuǎn)
while(1);
}
//呼吸燈//
// 介紹: 該程序利用TIMER A 的 UP模式 在P1.3腳產(chǎn)生PWM輸出
// 將CCR0設(shè)置為1500來(lái)定義PWM的周期,利用循環(huán)不斷改變CCR1的值,
// 實(shí)現(xiàn)利用改變PWM的占空比來(lái)改變LED亮度.
// SMCLK = MCLK = TACLK = default DCO
#include
void delay_nms(unsigned int n)// 延時(shí)函數(shù)
{
unsigned int j;
for (j=0;j<(n);j++)
{
__delay_cycles(400); //太短會(huì)使LED顯得好像在常亮,太長(zhǎng)就要等較長(zhǎng)時(shí)間來(lái)觀察了
}
}
void main(void)
{
unsigned const PWMPeriod = 1500; //設(shè)置PWM周期參數(shù),const聲明此值不允許改變.該數(shù)值太大,會(huì)導(dǎo)致LED閃爍
volatile unsigned int i; //聲明變量i是隨時(shí)可變的,系統(tǒng)不要去優(yōu)化這個(gè)值
WDTCTL = WDTPW + WDTHOLD; // 關(guān)閉看門(mén)狗
P1DIR |=BIT3; // 設(shè)置 P1.3為輸出
P1SEL |=BIT3; // 設(shè)置 P1.3為T(mén)A0.2輸出
TA0CCR0 = PWMPeriod; // 設(shè)置PWM 周期
TA0CCTL2 = OUTMOD_7; // 設(shè)置PWM 輸出模式為:7 - PWM復(fù)位/置位模式,
// 即輸出電平在TAR的值等于CCR2時(shí)復(fù)位為0,當(dāng)TAR的值等于CCR0時(shí)置位為1,改變CCR2,從而產(chǎn)生PWM。其實(shí)模式2也可以
TA0CTL= TASSEL_2 +MC_1; // 設(shè)置TIMERA的時(shí)鐘源為SMCLK, 計(jì)數(shù)模式為up,到CCR0再自動(dòng)從0開(kāi)始計(jì)數(shù)
while(1)
{
TA0CCR2=0;//確保最開(kāi)始是暗的
//漸亮過(guò)程:不斷設(shè)置TA0CCR2的值,使翻轉(zhuǎn)的時(shí)間變長(zhǎng),改變PWM的占空比
for(i=0;i
{
TA0CCR2=i;
delay_nms(4-(i/500)); //占空比變化的延時(shí),調(diào)整延遲時(shí)間可改變呼吸燈變暗的速度
//在暗的時(shí)候延長(zhǎng)delay時(shí)間,可增強(qiáng)效果
}
//漸暗過(guò)程:不斷設(shè)置TA0CCR2的值,使翻轉(zhuǎn)的時(shí)間變短,改變PWM的占空比
for(i=PWMPeriod;i>0;i-=1)
{
TA0CCR2=i;
delay_nms(4-(i/500)); //占空比變化的延時(shí),調(diào)整延遲時(shí)間可改變呼吸燈變暗的速度
//在暗的時(shí)候延長(zhǎng)delay時(shí)間,可增強(qiáng)效果
}
TA0CCR2=0; //確保燈暗
delay_nms(250); //時(shí)間長(zhǎng)一點(diǎn),增強(qiáng)視覺(jué)效果
}
}