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


