LAUNCHXL-F28379D: How to change Frequency of waves

Part Number: LAUNCHXL-F28379D
Other Parts Discussed in Thread: C2000WARE

Tool/software:

Hi.,

I wanted to change the frequency of a sine wave to 50 Hz and a triangular wave to 25 kHz. I've tried making these changes, but it's not working. Can you take a look and help me correct it?

#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;

}

Best Regards,

Arun

  • Hi,

    I wanted to change the frequency of a sine wave to 50 Hz and a triangular wave to 25 kHz. I've tried making these changes, but it's not working. Can you take a look and help me correct it?

    We will not be able to debug your code for you. We would be better able to help if you have specific questions about the device.

    Also I highly recommend that you use our examples included in C2000WARE. 

    Best Regards,

    Ben Collier