MSP430程式庫定時器TA的PWM輸出

來源:互聯網
上載者:User

定時器是單片機常用的其本裝置,用來產生精確計時或是其他功能;msp430的定時器不僅可以完成精確定時,還能產生PWM波形輸出,和捕獲時刻值(上升沿或是下降沿到來的時候)。這裡完成一個比較通用的PWM波形產生程式。

  1. 硬體介紹:

    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(使用者指南)。

  2. 程式實現:

    本程式是直接從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提供的大量的常式,這些曆程都很簡潔、清晰。需要其他功能可以自己根據常式編寫對應的程式。程式實現就這麼多了,下面說下本程式的使用方法。

  3. 使用樣本:

    使用方式:依然是在工程中加入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的波形輸出程式。有什麼不足之處,歡迎評論,討論。

附件:程式庫

作者:給我一杯酒

出處:http://Engin.cnblogs.com/

本文著作權歸作者和部落格園共有,歡迎轉載,轉載保留此段文字並且註明出處;謝謝。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.