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.

CCS/TMS320F2808: Sine wave generated on TMS320F2808 badly displayed in graph tool

Part Number: TMS320F2808

Tool/software: Code Composer Studio

Hello,

I have been developing sine wave modulator for three phase voltage source inverter

on TMS320F2808 DSP. I have been using CCS v6 for debugging (especially the Graph

tool). I have developed the code which is intended for desired sine wave generation (please

see the attachment). My problem is that the sine wave produced by this code is OK only

at some frequencies (I watch the output sine wave in Graph tool). Now I don't know whether

the problem is in my code or in graph in CCS. Please can anybody look at my code and evaluate

whether it is alright? Below are the graphs for:

1. 50 Hz ~ 32767
2. 49 Hz ~ 32200
3. 45 Hz ~ 30000
4. 25 Hz ~ 16384

Thanks in advance. 

// index, 16 bits, 0-65535
static unsigned short index1 = 0;
static unsigned short index2 = 0;
// desired output frequency, 50 Hz ~ 32767
static unsigned short frequency = 32767;
// temporary variable
static short temp = 0;


// table with sine values in Q1.15
// table covers full period <0, 2*pi> with 129 values (due to linear interpolation)
// angle step in table (2*pi)/128 ~ 2.8 °
// normalized angle step (2*pi)/128*1/(2*pi)*65536 = 512 
static short sine_table[] = {
	     0,   1608,   3212,   4808,
	  6393,   7962,   9512,  11039,
	 12539,  14010,  15446,  16846,
	 18204,  19519,  20787,  22005,
	 23170,  24279,  25329,  26319,
	 27245,  28105,  28898,  29621,
	 30273,  30852,  31356,  31785,
	 32137,  32412,  32609,  32728,
	 32767,  32728,  32609,  32412,
	 32137,  31785,  31356,  30852,
	 30273,  29621,  28898,  28105,
	 27245,  26319,  25329,  24279,
	 23170,  22005,  20787,  19519,
	 18204,  16846,  15446,  14010,
	 12539,  11039,   9512,   7962,
	  6393,   4808,   3212,   1608,
	     0,  -1608,  -3212,  -4808,
	 -6393,  -7962,  -9512, -11039,
	-12539, -14010, -15446, -16846,
	-18204, -19519, -20787, -22005,
	-23170, -24279, -25329, -26319,
	-27245, -28105, -28898, -29621,
	-30273, -30852, -31356, -31785,
	-32137, -32412, -32609, -32728,
	-32767, -32728, -32609, -32412,
	-32137, -31785, -31356, -30852,
	-30273, -29621, -28898, -28105,
	-27245, -26319, -25329, -24279,
	-23170, -22005, -20787, -19519,
	-18204, -16846, -15446, -14010,
	-12539, -11039,  -9512,  -7962,
	 -6393,  -4808,  -3212,  -1608,
	 0
};

// angle step for desire output frequency
static unsigned short delta_phase = 0;
// phase accumulator
static unsigned short phase = 0;
// output sine wave
static short sine_wave = 0;


// angle step for desired output frequency which is set by frequency variable
// for one interrupt with frequency fs the angle step in radians is 2*pi*f/fs
// so the normalized angle step is f/fs*65536 
// for desired 50 Hz and fs=12000 Hz: 50/12000*65536 = 273
// 50 Hz is set as 32 767
delta_phase = ((((unsigned long)frequency)*273) >> 15);


// increment phase accumulator with angle step
phase += delta_phase;


// "low" index
// phase to index conversion 
// 128 values in table so only 7 highest bits set the index 
// phase accumulator is 16 bit so >> 9
index1 = phase >> 9;
// "high" index
index2 = index1 + 1;

// retrieve the sine value from the table
// linear interpolation in the sine values table
temp = (*(sine_table + index2) - *(sine_table + index1));
// low 9 bits of the phase accumulator are "fractional" so & 0x1FF
// "full" angle step in table is 512 so >> 9
temp = (short)(((long)temp)*((phase & 0x1FF) >> 9));
temp += *(sine_table + index1);
// voltage to frequency ratio
sine_wave = (((long)frequency*temp) >> 15);


  • Hi,

    The testcase looks incomplete as it does not contain the loop you are using to populate the sine_wave variable from the sine_table. Can you send a more complete testcase so I can try to evaluate the differences between the outputs?

    Also, the parameters on the graph may influence how it is displayed. How are you setting up the graph?

    Regards,
    Rafael
  • Hi Rafael,

    I have placed the code into isr connected to

    Timer. This isr is invoked with 12 kHz frequency.

    I have found that the following code

    temp = (short)(((long)temp)*((phase & 0x1FF) >> 9));
    

    should be probably replaced by this one

    temp = (((long)temp)*((phase & 0x1FF) << 6)) >> 15;

    because the fractional part of the phase is otherwise lost.

    I have tested this but the result is same. I have been using

    following code for Graph tool

    #define BUFFER_SIZE	480
    
    short buffer[BUFFER_SIZE];
    short *pBuffer = buffer;
    
    *pBuffer = sine_wave;
    pBuffer++;
    if(pBuffer > (buffer + BUFFER_SIZE - 1)) pBuffer = buffer;
    

    This code is also placed in the isr. The Graph tool is configured

    in following manner