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.

TMS320F28379D: Error in CMPSS with sine and triangular wave

Part Number: TMS320F28379D
Other Parts Discussed in Thread: C2000WARE

Tool/software:

Hello.,

Facing issue in getting dutycycle using cmpss ,I wanted to compare sine wave and triangle wave and produce the duty cycle ,if sine wave > triangular wave pwm should be 50 percent else 0 using cmpss

This is the code ,sine wave and triangle wave is produced but  duty cycle is not produced  , can you let me know what wrong in this code 

#include "F28x_Project.h"
#include "driverlib.h"
#include "device.h"
#include <math.h>

#define NUM_SAMPLES 100
#define SINE_FREQUENCY 50
#define TRIANGULAR_FREQUENCY 25
#define SAMPLING_RATE 5000
#define DAC_MAX_VALUE 4095
#define PI 3.14159265358979323846

float sine_wave[NUM_SAMPLES];
float triangular_wave[NUM_SAMPLES];

void DAC_init();
void DAC_write_DACA(uint16_t value);
void DAC_write_DACB(uint16_t value);
void generate_sine_wave();
void generate_triangular_wave();
void initEPWM1(void);
void PinMux_init();
void CMPSS_init(void);

void main(void)
{
Device_init();
Device_initGPIO();
Interrupt_initModule();
Interrupt_initVectorTable();
PinMux_init();
SysCtl_disablePeripheral(SYSCTL_PERIPH_CLK_TBCLKSYNC);
initEPWM1();
CMPSS_init();
SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_TBCLKSYNC);
EINT;
ERTM;

DAC_init();
generate_sine_wave();
generate_triangular_wave();

while (1)
{
int j;
for (j = 0; j < NUM_SAMPLES; j++)
{
uint16_t digital_sine_value = (uint16_t)(sine_wave[j] * DAC_MAX_VALUE / 3.3);
uint16_t digital_triangular_value = (uint16_t)(triangular_wave[j] * DAC_MAX_VALUE / 3.3);

DAC_write_DACA(digital_sine_value);
DAC_write_DACB(digital_triangular_value);

if (Cmpss1Regs.COMPSTS.bit.COMPHSTS == 1) {
EPwm1Regs.CMPA.bit.CMPA = EPwm1Regs.TBPRD / 2; // Set 50% duty cycle
} else {
EPwm1Regs.CMPA.bit.CMPA = 0; // Set 0% duty cycle
}

DELAY_US(1000000 / SAMPLING_RATE);
}
}
}


void DAC_init()
{
EALLOW;
// Initialize DAC-A
DacaRegs.DACCTL.bit.DACREFSEL = 1; // Use internal reference
DacaRegs.DACCTL.bit.LOADMODE = 1; // Load DACVALS from DACVALS register
DacaRegs.DACOUTEN.bit.DACOUTEN = 1; // Enable DAC output

// Initialize DAC-B
DacbRegs.DACCTL.bit.DACREFSEL = 1; // Use internal reference
DacbRegs.DACCTL.bit.LOADMODE = 1; // Load DACVALS from DACVALS register
DacbRegs.DACOUTEN.bit.DACOUTEN = 1; // Enable DAC output
EDIS;
}

void DAC_write_DACA(uint16_t value)
{
DacaRegs.DACVALS.bit.DACVALS = value;
}

void DAC_write_DACB(uint16_t value)
{
DacbRegs.DACVALS.bit.DACVALS = value;
}

void generate_sine_wave()
{
int j;
float time_step = 1.0 / SAMPLING_RATE;

for (j = 0; j < NUM_SAMPLES; j++)
{
float time = j * time_step;
sine_wave[j] = 1.65 + 1.65 * sin(2 * PI * SINE_FREQUENCY * time);
}
}

void generate_triangular_wave()
{
int j;
float period = 1.0 / TRIANGULAR_FREQUENCY;
float time_step = period / NUM_SAMPLES;

for (j = 0; j < NUM_SAMPLES; j++)
{
float time = j * time_step;
float phase = fmod(time * TRIANGULAR_FREQUENCY, 1.0);
if (phase < 0.5)
{
triangular_wave[j] = 1.65 + 1.65 * (2 * phase); // Ascending part centered around 1.65V
}
else
{
triangular_wave[j] = 1.65 + 1.65 * (2 - 2 * phase); // Descending part centered around 1.65V
}
}
}

void initEPWM1()
{
EPwm1Regs.TBPRD = 4095;
EPwm1Regs.TBPHS.bit.TBPHS = 0x0000;
EPwm1Regs.TBCTR = 0x0000;

EPwm1Regs.CMPA.bit.CMPA = 2047;

EPwm1Regs.TBCTL.bit.CTRMODE = TB_COUNT_UPDOWN;
EPwm1Regs.TBCTL.bit.PHSEN = TB_DISABLE;
EPwm1Regs.TBCTL.bit.HSPCLKDIV = TB_DIV1;
EPwm1Regs.TBCTL.bit.CLKDIV = TB_DIV1;

EPwm1Regs.AQCTLA.bit.CAU = AQ_CLEAR;
EPwm1Regs.AQCTLA.bit.CAD = AQ_SET;

// Configure ePWM1 to use CMPSS for trip zone
EALLOW;
EPwm1Regs.TZSEL.bit.OSHT1 = 1; // One-shot trip 1
EPwm1Regs.TZCTL.bit.TZA = TZ_FORCE_HI; // Force high on trip A
EDIS;
}

void PinMux_init()
{
EALLOW;
GpioCtrlRegs.GPAMUX1.bit.GPIO0 = 0;
GpioCtrlRegs.GPAMUX1.bit.GPIO0=1;
GpioDataRegs.GPACLEAR.bit.GPIO0=1;
EDIS;
}

void CMPSS_init(void)
{
EALLOW;

// Enable CMPSS1 and set up DAC for negative input
Cmpss1Regs.COMPCTL.bit.COMPDACE = 1; // Enable the DAC

// Configure the comparator negative input (triangular wave)
Cmpss1Regs.COMPCTL.bit.COMPLSOURCE = 0; // Use DAC for comparator negative input
Cmpss1Regs.DACHVALS.bit.DACVAL = 2047; // Set midpoint (1.65V)

// Configure the comparator positive input (sine wave)
Cmpss1Regs.COMPCTL.bit.COMPHSOURCE = 1; // Use DAC for comparator positive input

// Configure output of the comparator
Cmpss1Regs.COMPCTL.bit.COMPHINV = 0; // Normal polarity
Cmpss1Regs.COMPCTL.bit.CTRIPHSEL = 1; // CTRIPH is CTRIPOUT (filtered)

// Configure digital filter settings (if needed)
Cmpss1Regs.COMPHYSCTL.bit.COMPHYS = 0; // No hysteresis

// Configure ePWM1 to use CMPSS for trip zone
EPwm1Regs.TZSEL.bit.OSHT1 = 1; // One-shot trip 1
EPwm1Regs.TZCTL.bit.TZA = TZ_FORCE_HI; // Force high on trip A

EDIS;
}