天天看點

MSP430F5529庫函數定時器A——硬體PWM先上代碼詳解Timer_A_setCompareValue()函數介紹

需提前學習:MSP430F5529庫函數定時器A——定時中斷;引腳手冊擷取;

目錄

先上代碼

詳解

引腳複用

選擇引腳

擷取引腳手冊

看手冊 

時鐘選擇

分頻

周期

REGISTER選擇

比較輸出模式

模式類型

 增計數模式下的比較輸出

連續計數模式下的比較輸出

增減計數模式下的比較輸出

占空比選擇

Timer_A_outputPWM()初始化

函數定義

參數baseAddress

Timer_A_setCompareValue()函數介紹

函數定義

參數

baseAddress

compareRegister

 compareValue

先上代碼

我們先貼代碼,再介紹這樣友善了解。

#include "driverlib.h"


#define TIMER_PERIOD 8192

void Timer_A0_PWM_Init(void)
{
    Timer_A_outputPWMParam htim = {0};
    //P1.2複用輸出
    GPIO_setAsPeripheralModuleFunctionOutputPin(GPIO_PORT_P1, GPIO_PIN2);
    //時鐘源選為SMCLK =  1048576 HZ
    htim.clockSource = TIMER_A_CLOCKSOURCE_SMCLK;
    //分頻系數設為32  32768HZ
    htim.clockSourceDivider = TIMER_A_CLOCKSOURCE_DIVIDER_32;
    //裝載值設為8192 - 1  ,周期為0.25s
    htim.timerPeriod = TIMER_PERIOD - 1;
    //P1.2 對應 TA0.1 故設為TIMER_A_CAPTURECOMPARE_REGISTER_1   定時器為0
    htim.compareRegister = TIMER_A_CAPTURECOMPARE_REGISTER_1;
    //選擇複位置位模式
    htim.compareOutputMode = TIMER_A_OUTPUTMODE_RESET_SET;
    //設定占空比,為5%
    htim.dutyCycle = TIMER_PERIOD / 20 ;
    //P1.2 對應 TA0.1 為TIMER_A0_BASE
    Timer_A_outputPWM(TIMER_A0_BASE, &htim);
}


int main(void)
{
    WDT_A_hold(WDT_A_BASE);

    Timer_A0_PWM_Init();

    //interrupts enabled
    __bis_SR_register(GIE);

    while(1)
    {
    }
}


           

詳解

引腳複用

選擇引腳

 我們選擇P1.2作為硬體PWM輸出,他對應的是定時器0的1腳。是以複用引腳為輸出,使用GPIO_setAsPeripheralModuleFunctionOutputPin()函數

MSP430F5529庫函數定時器A——硬體PWM先上代碼詳解Timer_A_setCompareValue()函數介紹

擷取引腳手冊

可能有人想知道這個怎麼看,首先我們得獲引腳手冊。打開我的git倉庫——>點選引腳功能資料手冊英文版——>下載下傳

MSP430F5529庫函數定時器A——硬體PWM先上代碼詳解Timer_A_setCompareValue()函數介紹

看手冊 

這個引腳對應複用功能在7.2 Signal Descriptions章節,也就是第16頁。

時鐘選擇

clockSource 是時鐘選擇,我們此處選擇SMCLK時鐘。

SMCLK系統預設 1048576Hz,ACLK系統預設為32768Hz。

分頻

clockSourceDivider 是分頻的,如果你不知道這裡能填寫什麼,可以滑鼠到clockSourceDivider處,點選F3。你看他上面的注釋就是可選參數。

周期

選擇的周期數-1存入timerPeriod 中。如果我們定時周期為500,那麼存入timerPeriod 的值為499,也就是500-1

REGISTER選擇

因為我們設定的是P1.2引腳,檢視手冊可知,對應的是定時器0的CCI1A。是以此處選擇TIMER_A_CAPTURECOMPARE_REGISTER_1,如果是對應的定時器的CCI2A,此處就選擇TIMER_A_CAPTURECOMPARE_REGISTER_2。

比較輸出模式

compareOutputMode 設定比較輸出模式

模式類型

模式有如下

MSP430F5529庫函數定時器A——硬體PWM先上代碼詳解Timer_A_setCompareValue()函數介紹

對應可選參數如下

注意:電平輸出模式(000)沒有選擇

#define TIMER_A_OUTPUTMODE_OUTBITVALUE                                 OUTMOD_0
#define TIMER_A_OUTPUTMODE_SET                                         OUTMOD_1
#define TIMER_A_OUTPUTMODE_TOGGLE_RESET                                OUTMOD_2
#define TIMER_A_OUTPUTMODE_SET_RESET                                   OUTMOD_3
#define TIMER_A_OUTPUTMODE_TOGGLE                                      OUTMOD_4
#define TIMER_A_OUTPUTMODE_RESET                                       OUTMOD_5
#define TIMER_A_OUTPUTMODE_TOGGLE_SET                                  OUTMOD_6
#define TIMER_A_OUTPUTMODE_RESET_SET                                   OUTMOD_7
           

 增計數模式下的比較輸出

在增計數模式下,當TAR增加到TAxCCRn或從TAxCCR0計數到0時,定時器輸出信号按選擇的輸出模式發生變化。示例如圖所示,該示例利用了TAxCCR0和TAxCCR1。

因為我隻講增計數模式,感覺正常使用也隻會用到這個,是以建議看完這個一部分,下面兩個可以不看。

MSP430F5529庫函數定時器A——硬體PWM先上代碼詳解Timer_A_setCompareValue()函數介紹

連續計數模式下的比較輸出

在連續計數模式下,定時器輸出波形與增計數模式一樣,隻是計數器在增計數到TAxCCR0後還要繼續增計數到0FFFFh,這樣就延長了計數器計數到TAxCCR1數值的時間。在連續計數模式下的輸出波形如圖所示。在該示例中同樣用到了TAxCCR0和TAxCCR1。

MSP430F5529庫函數定時器A——硬體PWM先上代碼詳解Timer_A_setCompareValue()函數介紹

增減計數模式下的比較輸出

這個用的少 

MSP430F5529庫函數定時器A——硬體PWM先上代碼詳解Timer_A_setCompareValue()函數介紹

占空比選擇

這個裡面的數值你自己填,比如我設定的周期是TIMER_PERIOD。那麼我設定占空比為5%,就可以這樣寫

//設定占空比,為5%
    htim.dutyCycle = TIMER_PERIOD / 20 ;
           

Timer_A_outputPWM()初始化

函數定義

void Timer_A_outputPWM(uint16_t baseAddress, Timer_A_outputPWMParam *param)
           

作用

計時器A運作在增計數模式産生PWM

參數baseAddress

可選值如下

TIMER_A0_BASE
TIMER_A1_BASE
TIMER_A2_BASE
           

Timer_A_setCompareValue()函數介紹

我們做硬體PWM除了初始化的時候可以進行設定占空比,還可以在其他時刻進行設定占空比。這樣就需要使用這個函數了

函數定義

void Timer_A_setCompareValue (  uint16_t baseAddress,uint16_t compareRegister,uint16_t compareValue)
           

參數

baseAddress

baseAddress與Timer_A_outputPWM()函數的一緻

compareRegister

選擇所設定更改PWM的引腳

#define TIMER_A_CAPTURECOMPARE_REGISTER_0                                  0x02
#define TIMER_A_CAPTURECOMPARE_REGISTER_1                                  0x04
#define TIMER_A_CAPTURECOMPARE_REGISTER_2                                  0x06
#define TIMER_A_CAPTURECOMPARE_REGISTER_3                                  0x08
#define TIMER_A_CAPTURECOMPARE_REGISTER_4                                  0x0A
#define TIMER_A_CAPTURECOMPARE_REGISTER_5                                  0x0C
#define TIMER_A_CAPTURECOMPARE_REGISTER_6                                  0x0E
           

 compareValue

設定要最後改成的數值

繼續閱讀