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.
在用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模块代码,您可以参考一下
#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); } /* * main() */ void main() { ini_sys(); TimerA_Init(); _EINT(); //_BIS_SR(LPM0_bits + GIE); while(1); } /* * T0_A0 interrupt service */ #pragma vector=TIMER0_A0_VECTOR __interrupt void Timer0_A0(void) { //һ��������ȡ180���㣬����2�� TACCR1 = spwm[n++]; if(n == 20) { n=0; } }