Quantcast
Channel: MSP 低功耗微控制器论坛 - 最近的话题
Viewing all articles
Browse latest Browse all 3634

F5529产生SPWM周期性产生一个错值

$
0
0

我用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];
	}
}


Viewing all articles
Browse latest Browse all 3634

Trending Articles