硬件介紹:
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晶振配置詳解
推薦閱讀
史海拾趣
在2010年4月的上海張江高科技園區,一群志同道合的工程師和創業者聚集在一起,共同創立了上海智浦欣微電子有限公司。他們懷揣著對模擬及數模混合IC技術的深厚理解和熱愛,立志要在消費類電子市場占據一席之地。起初,公司面臨著資金緊張、技術挑戰和市場壓力等多重困難,但團隊成員憑借對技術的執著和對市場的敏銳洞察,逐步攻克難題,研發出了幾款性能優越的音頻放大器和電源管理產品,為公司贏得了初步的市場認可。
隨著技術的不斷進步和市場需求的日益增長,智浦欣公司意識到,只有不斷創新和突破,才能在激烈的市場競爭中立于不敗之地。于是,公司加大了對研發團隊的投入,引進了一批國內外頂尖的模擬器件和混合信號設計人才。經過數月的努力,團隊成功研發出了一款具有高性價比的WLED驅動器產品,該產品以其卓越的性能和穩定的質量贏得了客戶的廣泛好評。隨后,公司又相繼推出了多款具有競爭力的新產品,進一步鞏固了其在消費類電子市場的地位。
第二次世界大戰期間,Emerson迅速調整生產策略,轉產炮彈彈殼等軍需品。在隨后的五年中,公司共生產出超過1000萬支銅制炮彈彈殼,為戰爭的勝利做出了重要貢獻。同時,Emerson還利用戰時的技術積累,為戰后的電氣工業發展奠定了基礎。
ETAL公司成立于XXXX年,由一群富有遠見和熱情的電子工程師創立。他們看到了電子技術在全球范圍內的廣泛應用和巨大潛力,決定投身于這一行業。起初,ETAL主要專注于電子元器件的研發和生產,通過不斷的技術創新和產品優化,逐漸在市場上樹立了良好的口碑。
隨著產品的不斷創新和技術的不斷突破,創世公司的市場份額逐漸擴大。公司的SD NAND產品已經廣泛應用于醫療設備、工業控制、軌道交通、安防、網絡設備等多個領域。這一市場布局的成功,不僅提升了創世公司的品牌影響力,也為其在電子行業樹立了良好的口碑。同時,創世公司還積極參與各種行業展會和交流活動,與國內外客戶建立了廣泛的合作關系,進一步拓展了市場。
創世公司(CS)的創立源于對未來技術趨勢的敏銳洞察。在5G、人工智能、物聯網等行業還未廣泛崛起的初期,創世公司就預見到這些技術將引領未來電子行業的發展?;谶@種戰略眼光,創世公司決定專注于SD NAND存儲產品的研發和生產。這一決策不僅為公司的后續發展奠定了堅實的基礎,也展示了創始團隊對未來技術趨勢的堅定信心。
目前我在uboot中增加了一個fat32分區,現在總共一個binfs分區,一個1m的fat32分區,剩下的就為另一個fat32分區。在系統起來后存儲管理器的屬性中能看到part00,part01,part*02。第一個是binfs分區,后兩個為fat分區,感覺part01好象沒有mount上, ...… 查看全部問答∨ |
|
以前一直是做應用軟件,很少接觸到工控這塊。PLC儀器是omron SYSMAC CPM2AH,通過RS232串口連接通訊,目前我這只有一些地址表(比如00011、00100、00102、01307)等等,我看了網絡上的說明只明白大致獲取、寫入狀態命令格式,其他的大致不知道怎樣 ...… 查看全部問答∨ |
改進的緩沖區管理模塊的作用在于加強VxWorks實時操作系統對內存的管理,并為上層應用程序提供所需內存申請和釋放工作。因此改進模塊位于VxWorks實時操作系統模塊和應用程序模塊之間。 CPU實際物理內存在bootRoom啟動 ...… 查看全部問答∨ |
開發板是 pxa310 handheld platform development kit 燒寫軟件是用 marvell(R)XDB JTAG Debugger(SDT2.1) 在燒寫中出現的錯誤是: Executing Initialization Script... Downloading burn algorithm to the target... Error: Operation failed! ...… 查看全部問答∨ |
我要用GDI中的PolyPolygon來填充一個區域 ,這個區域大小不定,如果這個區域不是很大的時候,還算正常,但是這個區域大了,填充時會很慢,這是為什么,大家有沒有好的解決辦法呢… 查看全部問答∨ |
最近有點閑,想找點事樂呵樂呵,做一個智能小車吧! 目標是:開始的時候實現通過上位機軟件遙控小車運動,等以后買了傳感器實現自適應蔽障或追蹤活動目標 可是小馬達驅動部分沒有專門的驅動芯片,BUT,我這里有很多75NF75和2907之類的MOS管(大家 ...… 查看全部問答∨ |
|