MSP430定時(shí)器的PWM輸出
硬件介紹:MSP430系列單片機(jī)的TimerA結(jié)構(gòu)復(fù)雜,功能強(qiáng)大,適合應(yīng)用于工業(yè)控制,如數(shù)字化電機(jī)控制,電表和手持式儀表的理想配置。它給開(kāi)發(fā)人員提供了較多靈活的選擇余地。當(dāng)PWM 不需要修改占空比和時(shí)間時(shí),TimerA 能自動(dòng)輸出PWM,而不需利用中斷維持PWM輸出。
本文引用地址:http://www.ex-cimer.com/article/201611/316961.htmMSP430F16x和MSP430F14x單片機(jī)內(nèi)部均含有兩個(gè)定時(shí)器,TA和TB;TA有三個(gè)模塊,CCR0-CCR2;TB含有CCR0-CCR67個(gè)模塊;其中CCR0模塊不能完整的輸出PWM波形(只有三種輸出模式可用);TA可以輸出完整的2路PWM波形;TB可以輸出6路完整的PWM波形。
定時(shí)器的PWM輸出有有8種模式:
輸出模式0 輸出模式:輸出信號(hào)OUTx由每個(gè)捕獲/比較模塊的控制寄存器CCTLx中的OUTx位定義,并在寫(xiě)入該寄存器后立即更新。最終位OUTx直通。
輸出模式1 置位模式:輸出信號(hào)在TAR等于CCRx時(shí)置位,并保持置位到定時(shí)器復(fù)位或選擇另一種輸出模式為止。
輸出模式2 PWM翻轉(zhuǎn)/復(fù)位模式:輸出在TAR的值等于CCRx時(shí)翻轉(zhuǎn),當(dāng)TAR的值等于CCR0時(shí)復(fù)位。
輸出模式3 PWM置位/復(fù)位模式:輸出在TAR的值等于CCRx時(shí)置位,當(dāng)TAR的值等于CCR0時(shí)復(fù)位。
輸出模式4 翻轉(zhuǎn)模式:輸出電平在TAR的值等于CCRx時(shí)翻轉(zhuǎn),輸出周期是定時(shí)器周期的2倍。
輸出模式5復(fù)位模式:輸出在TAR的值等于CCRx時(shí)復(fù)位,并保持低電平直到選擇另一種輸出模式。
輸出模式6PWM翻轉(zhuǎn)/置位模式:輸出電平在TAR的值等于CCRx時(shí)翻轉(zhuǎn),當(dāng)TAR值等于CCR0時(shí)置位。
輸出模式7PWM復(fù)位/置位模式:輸出電平在TAR的值等于CCRx時(shí)復(fù)位,當(dāng)TAR的值等于CCR0時(shí)置位。
下圖是增計(jì)數(shù)模式下的輸出波形(本程序使用的是增模式3和7):
計(jì)數(shù)模式:
增計(jì)數(shù)模式
捕獲/比較寄存器CCR0用作Timer_A增計(jì)數(shù)模式的周期寄存器,因?yàn)镃CR0為16位寄存器,所以該模式適用于定時(shí)周期小于65 536的連續(xù)計(jì)數(shù)情況。計(jì)數(shù)器TAR可以增計(jì)數(shù)到CCR0的值,當(dāng)計(jì)數(shù)值與CCR0的值相等(或定時(shí)器值大于CCR0的值)時(shí),定時(shí)器復(fù)位并從0開(kāi)始重新計(jì)數(shù)。
連續(xù)計(jì)數(shù)模式
在需要65 536個(gè)時(shí)鐘周期的定時(shí)應(yīng)用場(chǎng)合常用連續(xù)計(jì)數(shù)模式。定時(shí)器從當(dāng)前值計(jì)數(shù)到0FFFFH后,又從0開(kāi)始重新計(jì)數(shù)。
增/減計(jì)數(shù)模式
需要對(duì)稱(chēng)波形的情況經(jīng)常可以使用增/減計(jì)數(shù)模式,該模式下,定時(shí)器先增計(jì)數(shù)到CCR0的值,然后反向減計(jì)數(shù)到0。計(jì)數(shù)周期仍由CCR0定義,它是CCR0計(jì)數(shù)器數(shù)值的2倍。
TA定時(shí)器有比較、捕獲兩種工作方式;比較可以產(chǎn)生PWM波形等,捕獲可以精確的測(cè)量時(shí)間;這里用的是比較輸出。
硬件介紹就這么多了,其他的可以參考msp430x1xx_family_users_guide(用戶(hù)指南)。
程序?qū)崿F(xiàn):
本程序是直接從msp430f42x移植的,只改動(dòng)了端口就能正常使用了。由此,430的模塊在不同的系列中是通用的,有關(guān)寄存器是一樣的;只是也許外部端口不太一樣。
程序初始化部分:完成TA相關(guān)寄存器的初始化。
char TAPwmInit(char Clk,char Div,char Mode1,char Mode2){TACTL = 0; //清除以前設(shè)置TACTL |= MC_1; //定時(shí)器TA設(shè)為增計(jì)數(shù)模式 switch(Clk) //選擇時(shí)鐘源{ case A: case a: TACTL|=TASSEL_1; break; //ACLKcase S: case s: TACTL|=TASSEL_2; break; //SMCLKcase E: TACTL|=TASSEL_0; break; //外部輸入(TACLK)case e: TACTL|=TASSEL_3; break; //外部輸入(TACLK取反)default : return(0); //參數(shù)有誤} switch(Div) //選擇分頻系數(shù){ case 1: TACTL|=ID_0; break; //1case 2: TACTL|=ID_1; break; //2case 4: TACTL|=ID_2; break; //4case 8: TACTL|=ID_3; break; //8default : return(0); //參數(shù)有誤} switch(Mode1) //設(shè)置PWM通道1的輸出模式。{ case P:case p: //如果設(shè)置為高電平模式TACCTL1 = OUTMOD_7; //高電平PWM輸出P1SEL |= BIT2; //從P1.2輸出 (不同型號(hào)單片機(jī)可能不一樣)P1DIR |= BIT2; //從P1.2輸出 (不同型號(hào)單片機(jī)可能不一樣) break;case N:case n: //如果設(shè)置為低電平模式 TACCTL1 = OUTMOD_3; //低電平PWM輸出P1SEL |= BIT2; //從P1.2輸出 (不同型號(hào)單片機(jī)可能不一樣) P1DIR |= BIT2; //從P1.2輸出 (不同型號(hào)單片機(jī)可能不一樣) break; case 0:case 0: //如果設(shè)置為禁用 P1SEL &= ~BIT2; //P1.2恢復(fù)為普通IO口 break; default : return(0); //參數(shù)有誤} switch(Mode2) //設(shè)置PWM通道1的輸出模式。{ case P:case p: //如果設(shè)置為高電平模式TACCTL2 =OUTMOD_7; //高電平PWM輸出P1SEL |= BIT3; //從P1.3輸出 (不同型號(hào)單片機(jī)可能不一樣)P1DIR |= BIT3; //從P1.3輸出 (不同型號(hào)單片機(jī)可能不一樣)break;case N:case n: //如果設(shè)置為低電平模式 TACCTL2 =OUTMOD_3; //低電平PWM輸出P1SEL |= BIT3; //從P1.3輸出 (不同型號(hào)單片機(jī)可能不一樣) P1DIR |= BIT3; //從P1.3輸出 (不同型號(hào)單片機(jī)可能不一樣) break; case 0:case 0: //如果設(shè)置為禁用 P1SEL &= ~BIT3; //P1.3恢復(fù)為普通IO口 break; default : return(0); //參數(shù)有誤} return(1); }
主要是設(shè)置TACTL寄存器,讓TA工作于增模式,設(shè)置時(shí)鐘源和分頻;CCTLx設(shè)置對(duì)應(yīng)的輸出模式;并且打開(kāi)相應(yīng)端口的第二功能。
設(shè)置周期函數(shù):設(shè)置PWM波形的周期,單位是多少個(gè)TACLK周期。
void TAPwmSetPeriod(unsigned int Period){TACCR0 = Period;}
工作于增模式時(shí),TA計(jì)數(shù)到TACCR0,設(shè)CCR0就完成了周期的設(shè)置。
設(shè)置占空比:設(shè)置TA的PWM輸出的有效電平的時(shí)間。
void TAPwmSetDuty(char Channel,unsigned int Duty){switch(Channel){case 1: TACCR1=Duty; break; case 2: TACCR2=Duty; break; }}
根據(jù)參數(shù)分別設(shè)置每一路的參數(shù)。
設(shè)置占空比,用千分比設(shè)置:
* 入口參數(shù):Channel: 當(dāng)前設(shè)置的通道號(hào) 1/2Percent: PWM有效時(shí)間的千分比 (0~1000) * 出口參數(shù):無(wú)* 說(shuō) 明: 1000=100.0% 500=50.0% ,依次類(lèi)推 * 范 例: TAPwmSetPermill(1,300)設(shè)置PWM通道1方波的占空比為30.0%TAPwmSetPermill(2,825)設(shè)置PWM通道2方波的占空比為82.5%*/void TAPwmSetPermill(char Channel,unsigned int Percent){unsigned long int Period;unsigned int Duty;Period = TACCR0;Duty = Period * Percent / 1000;TAPwmSetDuty(Channel,Duty);}
這個(gè)函數(shù)用千分比來(lái)設(shè)置PWM輸出的有效時(shí)間。方便程序的使用。
有關(guān)定時(shí)器,TI提供的大量的例程,這些歷程都很簡(jiǎn)潔、清晰。需要其他功能可以自己根據(jù)例程編寫(xiě)對(duì)應(yīng)的程序。程序?qū)崿F(xiàn)就這么多了,下面說(shuō)下本程序的使用方法。
使用示例:使用方式:依然是在工程中加入c文件;文件包含h頭文件;然后就可以正常使用本函數(shù)了。詳細(xì)參考示例工程和main.c。
main主要程序如下:
#include "msp430x16x.h" //430寄存器頭文件#include "TAPwm.h" //TA PWM輸出程序庫(kù)頭文件void main(){// Stop watchdog timer to prevent time out resetWDTCTL = WDTPW + WDTHOLD;ClkInit();TAPwmInit(A,1,P,P); //將定時(shí)器TA初始化成為PWM發(fā)生器//時(shí)鐘源=ACLK ; 無(wú)分頻; 通道1和通道2均設(shè)為高電平模式。TAPwmSetPeriod(500); //通道1/2的PWM方波周期均設(shè)為500個(gè)時(shí)鐘周期TAPwmSetDuty(1,200); //1通道 有效200個(gè)時(shí)鐘周期TAPwmSetPermill(2,200); //2通道 20.0%LPM0;}
本程序調(diào)用程序庫(kù),產(chǎn)生兩路PWM波形。
TA的PWM輸出就到這兒了,如果需要更多路的PWM波,可以使用TB,他可以產(chǎn)生6路完整的PWM波形;可以參考本程序編寫(xiě)TB的波形輸出程序。
評(píng)論