MSP430F5529 DriverLib 库函数学习笔记(六)定时器A产生PWM波
生活随笔
收集整理的這篇文章主要介紹了
MSP430F5529 DriverLib 库函数学习笔记(六)定时器A产生PWM波
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
目錄
- 1.通過Timer_A_outputPWM配置產生PWM波
- 初始化函數
- 計算
- 修改占空比的函數
- 整體程序
- 效果
- 2.單定時器產生多路PWM信號
- 初始化函數
- 實驗結果
- 3.對稱PWM信號的產生
- 初始化程序
- 實驗結果
平臺:Code Composer Studio 10.3.1
MSP430F5529 LaunchPad? Development Kit
(MSP?EXP430F5529LP)
???????
1.通過Timer_A_outputPWM配置產生PWM波
所選輸出引腳為P1.2
初始化函數
#define TIMER_PERIOD 12500 void Timer_A_PWM_Init(void) {Timer_A_outputPWMParam htim = {0};//P1.2復用輸出GPIO_setAsPeripheralModuleFunctionOutputPin(GPIO_PORT_P1, GPIO_PIN2); //時鐘源選為SMCLK = 25MHzhtim.clockSource = TIMER_A_CLOCKSOURCE_SMCLK; //分頻系數設為40htim.clockSourceDivider = TIMER_A_CLOCKSOURCE_DIVIDER_40;//裝載值設為12500 - 1htim.timerPeriod = TIMER_PERIOD - 1;//P1.2 對應 TA0.1 故設為TIMER_A_CAPTURECOMPARE_REGISTER_1htim.compareRegister = TIMER_A_CAPTURECOMPARE_REGISTER_1;htim.compareOutputMode = TIMER_A_OUTPUTMODE_RESET_SET;//初始比較值為裝載值的一半 即初始占空比為50%htim.dutyCycle = TIMER_PERIOD / 2;//P1.2 對應 TA0.1 為TIMER_A0_BASETimer_A_outputPWM(TIMER_A0_BASE, &htim); }計算
時鐘源為SMCLK = 25MHz
分頻系數為40
裝載值為12500 - 1
故所得PWM頻率為25MHz/40/12500=50Hz
修改占空比的函數
修改占空比即修改比較值,故使用Timer_A_setCompareValue函數
我選擇在外部中斷服務函數內進行修改,按下一次按鈕分別為占空比減少10%和增加10%
//****************************************************************************** // //This is the PORT2_VECTOR interrupt vector service routine // //****************************************************************************** #pragma vector=PORT2_VECTOR // P2口中斷源 __interrupt void Port_2 (void) // 聲明一個中斷服務程序,名為Port_2() {if(GPIO_getInterruptStatus(GPIO_PORT_P2, GPIO_PIN1)){delay_ms(20);if(!GPIO_getInputPinValue(GPIO_PORT_P2, GPIO_PIN1)){//P1.0 = toggleTimer_A_setCompareValue(TIMER_A0_BASE,TIMER_A_CAPTURECOMPARE_REGISTER_1,Timer_A_getCaptureCompareCount(TIMER_A0_BASE, TIMER_A_CAPTURECOMPARE_REGISTER_1) - TIMER_PERIOD / 10);while(!GPIO_getInputPinValue(GPIO_PORT_P2, GPIO_PIN1));}//P2.1 IFG clearedGPIO_clearInterrupt(GPIO_PORT_P2, GPIO_PIN1);} }//****************************************************************************** // //This is the PORT1_VECTOR interrupt vector service routine // //****************************************************************************** #pragma vector=PORT1_VECTOR // P2口中斷源 __interrupt void Port_1 (void) // 聲明一個中斷服務程序,名為Port_1() {if(GPIO_getInterruptStatus(GPIO_PORT_P1, GPIO_PIN1)){delay_ms(20);if(!GPIO_getInputPinValue(GPIO_PORT_P1, GPIO_PIN1)){//P1.0 = toggleTimer_A_setCompareValue(TIMER_A0_BASE,TIMER_A_CAPTURECOMPARE_REGISTER_1,Timer_A_getCaptureCompareCount(TIMER_A0_BASE, TIMER_A_CAPTURECOMPARE_REGISTER_1) + TIMER_PERIOD / 10);while(!GPIO_getInputPinValue(GPIO_PORT_P1, GPIO_PIN1));}//P2.1 IFG clearedGPIO_clearInterrupt(GPIO_PORT_P1, GPIO_PIN1);} }整體程序
#include "driverlib.h"#define MCLK_IN_HZ 25000000#define delay_us(x) __delay_cycles((MCLK_IN_HZ/1000000*(x))) #define delay_ms(x) __delay_cycles((MCLK_IN_HZ/1000*(x)))void SystemClock_Init(void) {PMM_setVCore(PMM_CORE_LEVEL_3); //高主頻工作需要較高的核心電壓//XT1引腳復用GPIO_setAsPeripheralModuleFunctionInputPin(GPIO_PORT_P5, GPIO_PIN4);GPIO_setAsPeripheralModuleFunctionOutputPin(GPIO_PORT_P5, GPIO_PIN5);//起振XT1UCS_turnOnLFXT1(UCS_XT1_DRIVE_3,UCS_XCAP_3);//XT2引腳復用GPIO_setAsPeripheralModuleFunctionInputPin(GPIO_PORT_P5, GPIO_PIN2);GPIO_setAsPeripheralModuleFunctionOutputPin(GPIO_PORT_P5, GPIO_PIN3);//起振XT2UCS_turnOnXT2(UCS_XT2_DRIVE_4MHZ_8MHZ);//XT2作為FLL參考時鐘,先8分頻,再50倍頻 4MHz / 8 * 50 = 25MHzUCS_initClockSignal(UCS_FLLREF, UCS_XT2CLK_SELECT, UCS_CLOCK_DIVIDER_8);UCS_initFLLSettle(25000, 50);//XT1作為ACLK時鐘源 = 32768HzUCS_initClockSignal(UCS_ACLK, UCS_XT1CLK_SELECT, UCS_CLOCK_DIVIDER_1);//DCOCLK作為MCLK時鐘源 = 25MHzUCS_initClockSignal(UCS_MCLK, UCS_DCOCLK_SELECT, UCS_CLOCK_DIVIDER_1);//DCOCLK作為SMCLK時鐘源 = 25MHzUCS_initClockSignal(UCS_SMCLK, UCS_DCOCLK_SELECT, UCS_CLOCK_DIVIDER_1);//設置外部時鐘源的頻率,使得在調用UCS_getMCLK, UCS_getSMCLK 或 UCS_getACLK時可得到正確值UCS_setExternalClockSource(32768, 4000000); }#define TIMER_PERIOD 12500 void Timer_A_PWM_Init(void) {Timer_A_outputPWMParam htim = {0};GPIO_setAsPeripheralModuleFunctionOutputPin(GPIO_PORT_P1, GPIO_PIN2);htim.clockSource = TIMER_A_CLOCKSOURCE_SMCLK;htim.clockSourceDivider = TIMER_A_CLOCKSOURCE_DIVIDER_40;htim.timerPeriod = TIMER_PERIOD - 1;htim.compareRegister = TIMER_A_CAPTURECOMPARE_REGISTER_1;htim.compareOutputMode = TIMER_A_OUTPUTMODE_RESET_SET;htim.dutyCycle = TIMER_PERIOD / 2;Timer_A_outputPWM(TIMER_A0_BASE, &htim); }void KEY_S1_Init(void) {GPIO_setAsInputPinWithPullUpResistor(GPIO_PORT_P2, GPIO_PIN1);//P2.1 interrupt enabledGPIO_enableInterrupt(GPIO_PORT_P2, GPIO_PIN1); //使能中斷//P2.1 Hi/Lo edgeGPIO_selectInterruptEdge(GPIO_PORT_P2, GPIO_PIN1, GPIO_HIGH_TO_LOW_TRANSITION); //設置中斷類型//P2.1 IFG clearedGPIO_clearInterrupt(GPIO_PORT_P2, GPIO_PIN1); //清除中斷標志位 }void KEY_S2_Init(void) {GPIO_setAsInputPinWithPullUpResistor(GPIO_PORT_P1, GPIO_PIN1);//P2.1 interrupt enabledGPIO_enableInterrupt(GPIO_PORT_P1, GPIO_PIN1); //使能中斷//P2.1 Hi/Lo edgeGPIO_selectInterruptEdge(GPIO_PORT_P1, GPIO_PIN1, GPIO_HIGH_TO_LOW_TRANSITION); //設置中斷類型//P2.1 IFG clearedGPIO_clearInterrupt(GPIO_PORT_P1, GPIO_PIN1); //清除中斷標志位 }int main(void) {WDT_A_hold(WDT_A_BASE);SystemClock_Init();Timer_A_PWM_Init();KEY_S1_Init();KEY_S2_Init();//interrupts enabled__bis_SR_register(GIE);while(1){} }//****************************************************************************** // //This is the PORT2_VECTOR interrupt vector service routine // //****************************************************************************** #pragma vector=PORT2_VECTOR // P2口中斷源 __interrupt void Port_2 (void) // 聲明一個中斷服務程序,名為Port_2() {if(GPIO_getInterruptStatus(GPIO_PORT_P2, GPIO_PIN1)){delay_ms(20);if(!GPIO_getInputPinValue(GPIO_PORT_P2, GPIO_PIN1)){//P1.0 = toggleTimer_A_setCompareValue(TIMER_A0_BASE,TIMER_A_CAPTURECOMPARE_REGISTER_1,Timer_A_getCaptureCompareCount(TIMER_A0_BASE, TIMER_A_CAPTURECOMPARE_REGISTER_1) - TIMER_PERIOD / 10);while(!GPIO_getInputPinValue(GPIO_PORT_P2, GPIO_PIN1));}//P2.1 IFG clearedGPIO_clearInterrupt(GPIO_PORT_P2, GPIO_PIN1);} }//****************************************************************************** // //This is the PORT1_VECTOR interrupt vector service routine // //****************************************************************************** #pragma vector=PORT1_VECTOR // P2口中斷源 __interrupt void Port_1 (void) // 聲明一個中斷服務程序,名為Port_1() {if(GPIO_getInterruptStatus(GPIO_PORT_P1, GPIO_PIN1)){delay_ms(20);if(!GPIO_getInputPinValue(GPIO_PORT_P1, GPIO_PIN1)){//P1.0 = toggleTimer_A_setCompareValue(TIMER_A0_BASE,TIMER_A_CAPTURECOMPARE_REGISTER_1,Timer_A_getCaptureCompareCount(TIMER_A0_BASE, TIMER_A_CAPTURECOMPARE_REGISTER_1) + TIMER_PERIOD / 10);while(!GPIO_getInputPinValue(GPIO_PORT_P1, GPIO_PIN1));}//P2.1 IFG clearedGPIO_clearInterrupt(GPIO_PORT_P1, GPIO_PIN1);} }效果
2.單定時器產生多路PWM信號
初始化函數
#define TIMER_PERIOD 12500 void Timer_A_PWM_Init(void) { //復用P1.2、P1.3、P1.4、P1.5輸出GPIO_setAsPeripheralModuleFunctionOutputPin(GPIO_PORT_P1, GPIO_PIN2|GPIO_PIN3|GPIO_PIN4|GPIO_PIN5);Timer_A_initUpModeParam htim = {0};htim.clockSource = TIMER_A_CLOCKSOURCE_SMCLK;htim.clockSourceDivider = TIMER_A_CLOCKSOURCE_DIVIDER_40;htim.timerPeriod = TIMER_PERIOD - 1;htim.timerInterruptEnable_TAIE = TIMER_A_TAIE_INTERRUPT_DISABLE;htim.captureCompareInterruptEnable_CCR0_CCIE = TIMER_A_CCIE_CCR0_INTERRUPT_DISABLE;htim.timerClear = TIMER_A_DO_CLEAR;htim.startTimer = true;Timer_A_initUpMode(TIMER_A0_BASE, &htim);Timer_A_initCompareModeParam htim_PWM = {0};htim_PWM.compareInterruptEnable = TIMER_A_CAPTURECOMPARE_INTERRUPT_DISABLE;htim_PWM.compareOutputMode = TIMER_A_OUTPUTMODE_RESET_SET;htim_PWM.compareRegister = TIMER_A_CAPTURECOMPARE_REGISTER_1;htim_PWM.compareValue = (int)(TIMER_PERIOD * 0.2);//Initialize compare mode to generate PWM1Timer_A_initCompareMode(TIMER_A0_BASE, &htim_PWM);htim_PWM.compareRegister = TIMER_A_CAPTURECOMPARE_REGISTER_2;htim_PWM.compareValue = (int)(TIMER_PERIOD * 0.4);//Initialize compare mode to generate PWM2Timer_A_initCompareMode(TIMER_A0_BASE, &htim_PWM);htim_PWM.compareRegister = TIMER_A_CAPTURECOMPARE_REGISTER_3;htim_PWM.compareValue = (int)(TIMER_PERIOD * 0.6);//Initialize compare mode to generate PWM3Timer_A_initCompareMode(TIMER_A0_BASE, &htim_PWM);htim_PWM.compareRegister = TIMER_A_CAPTURECOMPARE_REGISTER_4;htim_PWM.compareValue = (int)(TIMER_PERIOD * 0.8);//Initialize compare mode to generate PWM4Timer_A_initCompareMode(TIMER_A0_BASE, &htim_PWM);}依次將TA0.1、TA0.2、TA0.3、TA0.4初始化為占空比20%、40%、60%、80%,
時鐘源為SMCLK = 25MHz
分頻系數為40
裝載值為12500 - 1
故所得PWM頻率為25MHz/40/12500=50Hz
實驗結果
3.對稱PWM信號的產生
初始化程序
將上一個程稍作修改,即可產生對稱PWM信號
其中compareOutputMode值的效果參考下圖
時鐘源為SMCLK = 25MHz
分頻系數為40
裝載值為12500 - 1
因采用增\減計數模式
故所得PWM頻率為25MHz/40/12500/2=25Hz
實驗結果
總結
以上是生活随笔為你收集整理的MSP430F5529 DriverLib 库函数学习笔记(六)定时器A产生PWM波的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: snap7读写西门子plc1200步骤(
- 下一篇: Elman神经网络原理