我用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 pins P2SEL |= BIT2; P7DIR |= BIT7; // MCLK set out to pins P7SEL |= BIT7; P5SEL |= BIT2+BIT3; // Port select XT2 UCSCTL6 &= ~XT2OFF; // Enable XT2 UCSCTL3 |= SELREF_2; // FLLref = REFO // Since LFXT1 is not used, // sourcing FLL with LFXT1 can cause // XT1OFFG flag to set UCSCTL4 |= SELA_2; // ACLK=REFO,SMCLK=DCO,MCLK=DCO // Loop until XT1,XT2 & DCO stabilizes - in this case loop until XT2 settles do { UCSCTL7 &= ~(XT2OFFG + XT1LFOFFG + DCOFFG); // Clear XT2,XT1,DCO fault flags SFRIFG1 &= ~OFIFG; // Clear fault flags }while (SFRIFG1&OFIFG); // Test oscillator fault flag UCSCTL6 &= ~XT2DRIVE0; // Decrease XT2 Drive according to // expected frequency UCSCTL4 |= 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 WDT Init_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]; } }