我用MSP430F5529LP的Timer_A1产生SPWM,会周期性出现一个错误值,求大佬指点一二,波形如下:
代码如下:
#include <msp430.h> /* * main.c */ int nSinTable[] = {255, 254, 246, 234, 219, 199, 177, 153, 128, 103, 79, 57, 37, 22, 10, 2, 1, 2, 10, 22, 37, 57, 79, 103, 128, 153, 177, 199, 219, 234, 246, 254}; int nCount; void Init_CLK(void) {P2DIR |= BIT2;// SMCLK set out to pinsP2SEL |= BIT2;P7DIR |= BIT7;// MCLK set out to pinsP7SEL |= BIT7;P5SEL |= BIT2+BIT3;// Port select XT2UCSCTL6 &= ~XT2OFF;// Enable XT2UCSCTL3 |= SELREF_2;// FLLref = REFO// Since LFXT1 is not used,// sourcing FLL with LFXT1 can cause// XT1OFFG flag to setUCSCTL4 |= SELA_2;// ACLK=REFO,SMCLK=DCO,MCLK=DCO// Loop until XT1,XT2 & DCO stabilizes - in this case loop until XT2 settlesdo{UCSCTL7 &= ~(XT2OFFG + XT1LFOFFG + DCOFFG);// Clear XT2,XT1,DCO fault flagsSFRIFG1 &= ~OFIFG;// Clear fault flags}while (SFRIFG1&OFIFG);// Test oscillator fault flagUCSCTL6 &= ~XT2DRIVE0;// Decrease XT2 Drive according to// expected frequencyUCSCTL4 |= SELS_5 + SELM_5;// SMCLK=MCLK=XT2 } void Init_TimerA(void) { P2DIR |= BIT0; P2SEL |= BIT0; nCount = 0; TA1CCTL1 |= OUTMOD_7; TA1CCTL0 = CCIE;// CCR0 interrupt enabled TA1CCR0 = (256- 1); TA1CTL |= TASSEL_2 + ID_1 + MC_1; TA1CCR1 = nSinTable[nCount]; TA1CTL |= TACLR; } int main(void) {WDTCTL = WDTPW + WDTHOLD;// Stop WDTInit_CLK();Init_TimerA(); // _EINT();__bis_SR_register(LPM0_bits + GIE);// Enter LPM0, enable interrupts__no_operation();// For debugger } // Timer0 A0 interrupt service routine #pragma vector=TIMER1_A0_VECTOR __interrupt void TIMER1_A0_ISR(void) { { nCount += 1; if(nCount >= 32) { nCount = 0; } TA1CCR1 = nSinTable[nCount]; } }
灰小子:
定位一下,看看出错时nCount是多少。
user4740510:
回复 灰小子:
用示波器抓波形之后发现nCount[14]=10和nCount[15]=2时的波形被那一段高电平取代了,那段错误的高低电平共用时两个TA1CCR0,占空比接近50%,那段错误的高低电平前后是nCount[13]=22和nCount[16]=1,波形正常。
还有一个问题想请教您,TA1CCR0计满之后再TAIV中对应哪个中断向量
user4740510:
回复 灰小子:
用示波器抓波形之后发现nCount[14]=10和nCount[15]=2时的波形被那一段高电平取代了,那段错误的高低电平共用时两个TA1CCR0,占空比接近50%,那段错误的高低电平前后是nCount[13]=22和nCount[16]=1,波形正常。
还有一个问题想请教您,TA1CCR0计满之后再TAIV中对应哪个中断向量
user4740510:
回复 灰小子:
又分析了一下波形,发现nCount[15]=2时的波形没有问题,只有nCount[14]=10时的波形有问题,错误的波形高电平加低电平共两个PWM周期(TA1CCR0=256),占空比将近50%
灰小子:
回复 user4740510:
你这个程序是CCR1计数到CCR0,是TAxCCR1 CCIFG