Continue to Site

Welcome to EDAboard.com

Welcome to our site! EDAboard.com is an international Electronics Discussion Forum focused on EDA software, circuits, schematics, books, theory, papers, asic, pld, 8051, DSP, Network, RF, Analog Design, PCB, Service Manuals... and a whole lot more! To participate you need to register. Registration is free. Click here to register now.

Need help on MSP430 sinusodial pwm code

Status
Not open for further replies.

Tahsinhossain

Newbie level 5
Newbie level 5
Joined
Jan 16, 2015
Messages
10
Helped
0
Reputation
0
Reaction score
0
Trophy points
1
Visit site
Activity points
80
Hi All,

I am trying to generate 2 SPWM signals out of MSP430 pin 1.2 and 1.6 like the following figure:

msp430signals.png

I am trying to use same port (port 1) for generating the signals with the following code which is not working. Please suggest how to fix to code to get my desired output.

Code:
#include  <msp430g2553.h>


#define pwmPeriod 400				// carrier of 2.5kHz and reference of 50Hz. PWM period is 0.4 ms.

// Sinewave frequency is 50 Hz means 20 ms period. Halfcycle is 10 ms.
//const unsigned int sinewave[51] = {200, 223, 245, 266, 287, 306, 323, 339, 352, 363, 371, 377, 380, 380, 377, 371, 363, 352, 339, 323, 306, 287, 266, 245, 223, 200, 177, 155, 134, 113, 94, 77, 61, 48, 37, 29, 23, 20, 20, 23, 29, 37, 48, 61, 77, 94, 113, 134, 155, 177};
const unsigned int halfcycle[26] = {200, 223, 245, 266, 287, 306, 323, 339, 352, 363, 371, 377, 380, 380, 377, 371, 363, 352, 339, 323, 306, 287, 266, 245, 223};

int waveonepulsecounter = 0;
int wavetwopulsecounter = 0;

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

  //Calibrate DCO for 1MHz operation
  BCSCTL1 = CALBC1_1MHZ;
  DCOCTL = CALDCO_1MHZ;

  // PWM signals to BIT2 and BIT6 of PORT 1 using single ISR and 10ms delay between the two signals
  P1DIR |= BIT2 + BIT6;
  P1SEL |= BIT2 + BIT6;
  
  TACTL = TASSEL_2 +  MC_1 + TACLR;          	// SMCLK = 1 MHz, Upmode
  
  TACCR0 = pwmPeriod - 1;						// setting PWM period to 0.4 ms, 400-1 clock ticks of SMCLK
  TACCTL0 = CCIE;								// Enable Interrupt for CCR0
  
  TACCTL1 = OUTMOD_7;							// RESET/SET for CCR1
  __delay_cycles(10000);						// 10ms delay between interrupts
  TACCTL2 = OUTMOD_7;							// SET/RESET for CCR2
  
  _BIS_SR(LPM0_bits + GIE);                 // Enter LPM0 w/ interrupt
}

// Timer A0 interrupt service routine
#pragma vector=TIMER0_A0_VECTOR
__interrupt void Timer_A0 (void)
{
	while(P1IFG)
	{
		if(P1IFG & BIT2)
		{
			TACCR1 = halfcycle[waveonepulsecounter];
			waveonepulsecounter = waveonepulsecounter + 1;
			
			if (waveonepulsecounter == 25)
				waveonepulsecounter = 0;
							
		}	
		
		if(P1IFG & BIT6)
		{
			TACCR2 = halfcycle[wavetwopulsecounter];
			wavetwopulsecounter = wavetwopulsecounter + 1;
			
			if(wavetwopulsecounter == 25)
				wavetwopulsecounter = 0;
			
		}
	}
}
 

Hello!

You don't say what is your "desired output", so it's difficult to fix it for you.
Beside this, in the case you want to generate 2 PWMs at 180 degrees (like sin and -sin), why don't
you just invert one signal instead of bothering with 2 timers?

Another thing. Why this while loop in the interrupt function? You get interrupts at regular intervals
(which all depend on the preset CCR0 value). At every interrupt, you should simply set the duty ratio
and that's about it.

Just for your info, there are a few tutorials dealing with PWM here:
**broken link removed**

Dora
 

Status
Not open for further replies.

Similar threads

Part and Inventory Search

Welcome to EDABoard.com

Sponsor

Back
Top