This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

MSP430F5529定时器输出SPWM

在用MSP420F5529LP产生SPWM时周期性出现错误波形,具体波形及代码如下图所示,

#include <msp430.h>

unsigned char nCount=0;
unsigned int Sintable[] =
		{25,50,75,100,125,150,175,200,225,
		250,275,299,324,349,373,397,422,446,470,
		494,518,541,565,588,612,635,658,681,703,
		726,748,770,792,814,835,857,878,899,920,
		940,960,980,1000,1019,1039,1058,1076,1095,1113,
		1131,1149,1166,1183,1200,1216,1232,1248,1264,1279,
		1294,1309,1323,1337,1350,1364,1377,1389,1402,1414,
		1425,1436,1447,1458,1468,1478,1487,1496,1505,1513,
		1521,1529,1536,1543,1549,1555,1561,1566,1571,1576,
		1580,1584,1587,1590,1592,1595,1596,1598,1599,1599,
		1600,1599,1599,1598,1596,1595,1592,1590,1587,1584,
		1580,1576,1571,1566,1561,1555,1549,1543,1536,1529,
		1521,1513,1505,1496,1487,1478,1468,1458,1447,1436,
		1425,1414,1402,1389,1377,1364,1350,1337,1323,1309,
		1294,1279,1264,1248,1232,1216,1200,1183,1166,1149,
		1131,1113,1095,1076,1058,1039,1019,1000,980,960,
		940,920,899,878,857,835,814,792,770,748,
		726,703,681,658,635,612,588,565,541,518,
		494,470,446,422,397,373,349,324,299,275,
		250,225,200,175,150,125,100,75,50,25};


void Init_CLK(void)
{
    P1DIR |= BIT0;
    P1SEL |= BIT0;              //可以看ACLK的频率
    P2DIR |= BIT2;
    P2SEL |= BIT2;             //SMCLK
    P7DIR |= BIT7;
    P7SEL |= BIT7;             //MCLK

    P5SEL |= BIT2+BIT3;
    UCSCTL6 &= ~XT2OFF;          //打开XT2

   /*********************寄存器配置部分******************************/

    __bis_SR_register(SCG0);
    UCSCTL0 = DCO0+DCO1+DCO2+DCO3+DCO4;
    UCSCTL1 = DCORSEL_4;       //DCO频率范围在28.2MHZ以下
    UCSCTL2 = FLLD_4 + 1;       //D=16,N=1
    UCSCTL3 = SELREF_5 + FLLREFDIV_3;    //n=8,FLLREFCLK时钟源为XT2CLK;DCOCLK=D*(N+1)*(FLLREFCLK/n);DCOCLKDIV=(N+1)*(FLLREFCLK/n);
    UCSCTL4 = SELA_4 + SELS_3 +SELM_3;    //ACLK的时钟源为DCOCLKDIV,MCLK\SMCLK的时钟源为DCOCLK
    UCSCTL5 = DIVA_5;      //ACLK由DCOCLKDIV的32分频得到,SMCLK由DCOCLK的2分频得到
                //最终MCLK:16MHZ,SMCLK:8MHZ,ACLK:32KHZ

    __bic_SR_register(SCG0);                   //Enable the FLL control loop

   /**********************************************************************/

    __delay_cycles(8192);
    do
    {
     UCSCTL7 &= ~(XT2OFFG + XT1LFOFFG + DCOFFG); //Clear XT2,XT1,DCO fault flags
     SFRIFG1 &= ~OFIFG;       //Clear fault flags
    }while (SFRIFG1&OFIFG);
}


void Timer_A0_Init(void)
{
	P1DIR |= BIT2;
	P1SEL |= BIT2;

	TA0CCR0 = (1600 - 1);
	TA0CCTL0 = CCIE;
	TA0CCR1 = Sintable[0];
	TA0CCTL1 = OUTMOD_7;
	TA0CTL = TASSEL_2 + MC_1 + TACLR;
}

void main()
{
	WDTCTL = WDTPW + WDTHOLD;                 // Stop WDT

	Init_CLK();
	Timer_A0_Init();

	_EINT();
	while(1);
}

//#pragma vector=TIMER1_A0_VECTOR
//__interrupt void TIMER1_A0_ISR(void)
#pragma vector=TIMER0_A0_VECTOR
__interrupt void TIMER0_A0_ISR(void)
{
	nCount++;
	if(nCount >= 200)
		nCount = 0;
	TA0CCR1 = Sintable[nCount];
}

  • 附件是我们的参考设计的SPWM模块代码,您可以参考一下

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    #include "msp430g2553.h"
    #include "delay.h"
    const unsigned int spwm[] = {
    250, 327, 396, 452, 487, 499, 487, 452, 396, 327,
    250, 172, 103, 47, 12, 0, 12, 47, 103, 172,
    };
    unsigned int n=0;
    /*
    *
    */
    void TimerA_Init()
    {
    P1DIR |= BIT2;
    P1SEL |= BIT2; // p1.2
    TACCR0 = 500; // Init TACCR0 w/ sample prd=CCR0+1
    TACCR1= spwm[n];
    TACCTL1 = OUTMOD_7; // Set/reset
    TACCTL0 = CCIE;
    TACTL = TACLR + MC_1 + TASSEL_2 +ID_3; // clear TAR, up mode*/
    }
    void ini_sys(void)
    {
    WDTCTL=WDTPW+WDTHOLD; //STOP W D T
    if (CALBC1_8MHZ ==0xFF || CALDCO_8MHZ == 0xFF)
    {
    while(1); // If calibration constants erased
    // do not load, trap CPU!!
    }
    //1Mhz ~1008000
    BCSCTL1 = CALBC1_16MHZ; // Set range
    DCOCTL = CALDCO_16MHZ; // Set DCO step + modulation */
    delay_ms(10);
    }
    /*
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

  • 您好,你给我的例程代码和我写的除了时钟配置部分完全一样, 你手头有没有5529,想麻烦您帮忙看一下
  • 波形哪里有问题?