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