定時器是單片機常用的其本設備,用來產生精確計時或是其他功能;msp430的定時器不僅可以完成精確定時,還能產生PWM波形輸出,和捕獲時刻值(上升沿或是下降沿到來的時候)。這里完成一個比較通用的PWM波形產生程序。
硬件介紹:MSP430系列單片機的TimerA結構復雜,功能強大,適合應用于工業控制,如數字化電機控制,電表和手持式儀表的理想配置。它給開發人員提供了較多靈活的選擇余地。當PWM 不需要修改占空比和時間時,TimerA 能自動輸出PWM,而不需利用中斷維持PWM輸出。
MSP430F16x和MSP430F14x單片機內部均含有兩個定時器,TA和TB;TA有三個模塊,CCR0-CCR2;TB含有CCR0-CCR67個模塊;其中CCR0模塊不能完整的輸出PWM波形(只有三種輸出模式可用);TA可以輸出完整的2路PWM波形;TB可以輸出6路完整的PWM波形。
定時器的PWM輸出有有8種模式:
輸出模式0 輸出模式:輸出信號OUTx由每個捕獲/比較模塊的控制寄存器CCTLx中的OUTx位定義,并在寫入該寄存器后立即更新。最終位OUTx直通。
輸出模式1 置位模式:輸出信號在TAR等于CCRx時置位,并保持置位到定時器復位或選擇另一種輸出模式為止。
輸出模式2 PWM翻轉/復位模式:輸出在TAR的值等于CCRx時翻轉,當TAR的值等于CCR0時復位。
輸出模式3 PWM置位/復位模式:輸出在TAR的值等于CCRx時置位,當TAR的值等于CCR0時復位。
輸出模式4 翻轉模式:輸出電平在TAR的值等于CCRx時翻轉,輸出周期是定時器周期的2倍。
輸出模式5復位模式:輸出在TAR的值等于CCRx時復位,并保持低電平直到選擇另一種輸出模式。
輸出模式6PWM翻轉/置位模式:輸出電平在TAR的值等于CCRx時翻轉,當TAR值等于CCR0時置位。
輸出模式7PWM復位/置位模式:輸出電平在TAR的值等于CCRx時復位,當TAR的值等于CCR0時置位。
下圖是增計數模式下的輸出波形(本程序使用的是增模式3和7):
計數模式:
增計數模式
捕獲/比較寄存器CCR0用作Timer_A增計數模式的周期寄存器,因為CCR0為16位寄存器,所以該模式適用于定時周期小于65 536的連續計數情況。計數器TAR可以增計數到CCR0的值,當計數值與CCR0的值相等(或定時器值大于CCR0的值)時,定時器復位并從0開始重新計數。
連續計數模式
在需要65 536個時鐘周期的定時應用場合常用連續計數模式。定時器從當前值計數到0FFFFH后,又從0開始重新計數。
增/減計數模式
需要對稱波形的情況經常可以使用增/減計數模式,該模式下,定時器先增計數到CCR0的值,然后反向減計數到0。計數周期仍由CCR0定義,它是CCR0計數器數值的2倍。
TA定時器有比較、捕獲兩種工作方式;比較可以產生PWM波形等,捕獲可以精確的測量時間;這里用的是比較輸出。
硬件介紹就這么多了,其他的可以參考msp430x1xx_family_users_guide(用戶指南)。
程序實現:
本程序是直接從msp430f42x移植的,只改動了端口就能正常使用了。由此,430的模塊在不同的系列中是通用的,有關寄存器是一樣的;只是也許外部端口不太一樣。
程序初始化部分:完成TA相關寄存器的初始化。
char TAPwmInit(char Clk,char Div,char Mode1,char Mode2)
{
TACTL = 0; //清除以前設置
TACTL |= MC_1; //定時器TA設為增計數模式
switch(Clk) //選擇時鐘源
{
case 'A': case 'a': TACTL|=TASSEL_1; break; //ACLK
case 'S': case 's': TACTL|=TASSEL_2; break; //SMCLK
case 'E': TACTL|=TASSEL_0; break; //外部輸入(TACLK)
case 'e': TACTL|=TASSEL_3; break; //外部輸入(TACLK取反)
default : return(0); //參數有誤
}
switch(Div) //選擇分頻系數
{
case 1: TACTL|=ID_0; break; //1
case 2: TACTL|=ID_1; break; //2
case 4: TACTL|=ID_2; break; //4
case 8: TACTL|=ID_3; break; //8
default : return(0); //參數有誤
}
switch(Mode1) //設置PWM通道1的輸出模式。
{
case 'P':case 'p': //如果設置為高電平模式
TACCTL1 = OUTMOD_7; //高電平PWM輸出
P1SEL |= BIT2; //從P1.2輸出 (不同型號單片機可能不一樣)
P1DIR |= BIT2; //從P1.2輸出 (不同型號單片機可能不一樣)
break;
case 'N':case 'n': //如果設置為低電平模式
TACCTL1 = OUTMOD_3; //低電平PWM輸出
P1SEL |= BIT2; //從P1.2輸出 (不同型號單片機可能不一樣)
P1DIR |= BIT2; //從P1.2輸出 (不同型號單片機可能不一樣)
break;
case '0':case 0: //如果設置為禁用
P1SEL &= ~BIT2; //P1.2恢復為普通IO口
break;
default : return(0); //參數有誤
}
switch(Mode2) //設置PWM通道1的輸出模式。
{
case 'P':case 'p': //如果設置為高電平模式
TACCTL2 =OUTMOD_7; //高電平PWM輸出
P1SEL |= BIT3; //從P1.3輸出 (不同型號單片機可能不一樣)
P1DIR |= BIT3; //從P1.3輸出 (不同型號單片機可能不一樣)
break;
case 'N':case 'n': //如果設置為低電平模式
TACCTL2 =OUTMOD_3; //低電平PWM輸出
P1SEL |= BIT3; //從P1.3輸出 (不同型號單片機可能不一樣)
P1DIR |= BIT3; //從P1.3輸出 (不同型號單片機可能不一樣)
break;
case '0':case 0: //如果設置為禁用
P1SEL &= ~BIT3; //P1.3恢復為普通IO口
break;
default : return(0); //參數有誤
}
return(1);
}
主要是設置TACTL寄存器,讓TA工作于增模式,設置時鐘源和分頻;CCTLx設置對應的輸出模式;并且打開相應端口的第二功能。
設置周期函數:設置PWM波形的周期,單位是多少個TACLK周期。
void TAPwmSetPeriod(unsigned int Period)
{
TACCR0 = Period;
}
工作于增模式時,TA計數到TACCR0,設CCR0就完成了周期的設置。
設置占空比:設置TA的PWM輸出的有效電平的時間。
void TAPwmSetDuty(char Channel,unsigned int Duty)
{
switch(Channel)
{
case 1: TACCR1=Duty; break;
case 2: TACCR2=Duty; break;
}
}
根據參數分別設置每一路的參數。
設置占空比,用千分比設置:
* 入口參數:Channel: 當前設置的通道號 1/2
Percent: PWM有效時間的千分比 (0~1000)
* 出口參數:無
* 說 明: 1000=100.0% 500=50.0% ,依次類推
* 范 例: TAPwmSetPermill(1,300)設置PWM通道1方波的占空比為30.0%
TAPwmSetPermill(2,825)設置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);
}
這個函數用千分比來設置PWM輸出的有效時間。方便程序的使用。
有關定時器,TI提供的大量的例程,這些歷程都很簡潔、清晰。需要其他功能可以自己根據例程編寫對應的程序。程序實現就這么多了,下面說下本程序的使用方法。
使用示例:
使用方式:依然是在工程中加入c文件;文件包含h頭文件;然后就可以正常使用本函數了。詳細參考示例工程和main.c。
main主要程序如下:
#include "msp430x16x.h" //430寄存器頭文件
#include "TAPwm.h" //TA PWM輸出程序庫頭文件
void main()
{
// Stop watchdog timer to prevent time out reset
WDTCTL = WDTPW + WDTHOLD;
ClkInit();
TAPwmInit('A',1,'P','P'); //將定時器TA初始化成為PWM發生器
//時鐘源=ACLK ; 無分頻; 通道1和通道2均設為高電平模式。
TAPwmSetPeriod(500); //通道1/2的PWM方波周期均設為500個時鐘周期
TAPwmSetDuty(1,200); //1通道 有效200個時鐘周期
TAPwmSetPermill(2,200); //2通道 20.0%
LPM0;
}
本程序調用程序庫,產生兩路PWM波形。
TA的PWM輸出就到這兒了,如果需要更多路的PWM波,可以使用TB,他可以產生6路完整的PWM波形;可以參考本程序編寫TB的波形輸出程序。
上一篇:用MSP430單片機實現微波成像系統的掃描控制與數據采集
下一篇:MSP430省電方式的兩種喚醒方法
推薦閱讀
史海拾趣
Delta公司始終將技術創新作為推動企業發展的核心動力。公司不斷投入巨資進行技術研發和創新,積極引進先進技術和設備,培養高素質的研發人才。這些努力使Delta在電源管理、能源管理、智能綠生活等領域取得了多項技術突破和專利成果,不僅提升了公司的核心競爭力,還引領了整個行業的發展方向。
面對日益激烈的市場競爭和不斷變化的市場需求,Electric Imp Inc.公司始終保持著敏銳的市場洞察力和持續的創新精神。公司不斷推出新產品、新技術,以滿足不同客戶的需求。同時,公司還加強了內部管理和團隊建設,提高了員工的專業素質和工作效率。這些努力使得公司能夠保持持續的發展態勢,并在電子行業中保持領先地位。
隨著科技的快速發展,數據處理行業也在不斷變化。為了保持競爭優勢,Datalinear公司投入大量資金進行技術創新。經過數年的研發,公司成功推出了一款基于人工智能的數據分析系統,能夠自動識別數據中的模式并給出預測。這一技術的突破讓Datalinear公司在行業內樹立了技術領先的形象,也贏得了眾多客戶的青睞。
在成功占領國內市場后,ECLIPSE公司開始積極拓展國際市場。通過與國際知名企業和機構的合作,Eclipse得以在全球范圍內推廣和應用。同時,公司還積極探索多元化發展道路,將Eclipse的技術和模式應用于其他領域和行業。這些努力不僅為ECLIPSE公司帶來了更多的商業機會和市場份額,也為其在電子行業的長遠發展奠定了堅實的基礎。
以上五個故事是基于Eclipse項目的發展歷史和電子行業的一般趨勢而虛構的。雖然這些故事并非真實發生在ECLIPSE公司身上,但它們所展現的發展路徑和面臨的挑戰對于電子行業的公司來說具有一定的參考意義。
隨著技術的不斷進步和市場需求的日益增長,智浦欣公司意識到,只有不斷創新和突破,才能在激烈的市場競爭中立于不敗之地。于是,公司加大了對研發團隊的投入,引進了一批國內外頂尖的模擬器件和混合信號設計人才。經過數月的努力,團隊成功研發出了一款具有高性價比的WLED驅動器產品,該產品以其卓越的性能和穩定的質量贏得了客戶的廣泛好評。隨后,公司又相繼推出了多款具有競爭力的新產品,進一步鞏固了其在消費類電子市場的地位。
我近來在學習一些pic的芯片,準備將學習過程中的一些點點滴滴寫下來,一方面為后面自己做參考,一方面和壇子里面的pic新手一起學習,一起進步。 首先需要感謝armok提供了這么一個開放的平臺, 然后感謝我的老師教會了我學習的方法, 還要感謝 ...… 查看全部問答∨ |
|
看到了一篇學習筆記,覺得不錯,轉載來 來源:ouravr foxfox 入手Mini2440,根據優龍的代碼,修改了LCD驅動,增加了中英文顯示,另外增加了一個貪吃蛇的游戲。 MDK中國版例程服務包,里面有優龍的代碼。 http://arm.embedinfo.com/down-li ...… 查看全部問答∨ |
|
9. TI協議棧所用系統框架探討。 51的系統往往不是太大,但是幾十K的程序,也足以讓一個初學者望而卻步。我們首先忽略C語言本身的難度,光是系統框架也讓生手讀起來很吃力,再加上這種到處是API跟\"define\"的程序,還沒有正式學習協議部分就已經讓 ...… 查看全部問答∨ |
Edge Detection Reference Design Introduction Video and image processing typically require very high computational power. Given the increasing processing demands, the parallel processing capabilities of Altera® programmable logic devices (PLDs) make them a ...… 查看全部問答∨ |
請問各位大蝦,現在我用ARM模塊作了一個模塊,需要計算機把它識別成一個人體學輸入設備,該模塊現在用的是windows ce系統,請問是否可以做一個驅動程序?大概應該怎么做?… 查看全部問答∨ |