Part Number: TMS320F28069
Other Parts Discussed in Thread: C2000WARE
Tool/software: Code Composer Studio
Hello everyone, i'm doing a current programmed mode for my SEPIC converter control. I'd like to know how to do it using the ramp generator and the comparator block of the target.
I tried doing the next code but the signal in the oscilloscope is 100 kHz 99% duty cycle. I'd like to get a 50% duty cycle signal. Thanks for your time
#include "DSP28x_Project.h" // Device Headerfile and Examples Include File
#include <stdint.h>
#include <stdbool.h>
//f deseada en kHz
float f=100;
float period=90000/100;
float Toff;
float h;
float vo;
float io;
float ip;
float vp;
float VP=0;
float IO=0;
float IP=0;
float VO=0;
int contador=0;
float Kp=0.2990;
float Ki=676.7921;
float Tm=1/100000;
float Vref=0;
float SalPI[2];
float EntPI[2];
float ACW;
// Prototype statements for functions found within this file.
void Adc_Config(void);
void InitEPwm2(void);
void InitEPwm2Gpio(void);
main()
{
InitSysCtrl();
InitEPwm2Gpio();
DINT;
InitPieCtrl();
IER = 0x0000;
IFR = 0x0000;
InitPieVectTable();
EALLOW; // This is needed to write to EALLOW protected register
EDIS; // This is needed to disable write to EALLOW protected registers
InitAdc(); // For this example, init the ADC
AdcOffsetSelfCal();
IER |= M_INT14;
PieCtrlRegs.PIEIER1.bit.INTx7 = 1;
EINT; // Enable Global interrupt INTM
ERTM; // Enable Global realtime interrupt DBGM
// Configure GPIO
EALLOW;
GpioCtrlRegs.GPAPUD.bit.GPIO0 = 1; // Disable pull-up on GPIO0 (EPWM1A)
GpioCtrlRegs.GPAPUD.bit.GPIO1 = 1; // Disable pull-up on GPIO1 (EPWM1B)
GpioCtrlRegs.GPAMUX1.bit.GPIO0 = 1; // Configure GPIO0 as EPWM1A
GpioCtrlRegs.GPAMUX1.bit.GPIO1 = 1; // Configure GPIO1 as EPWM1B
GpioCtrlRegs.GPAPUD.bit.GPIO2 = 1; // Disable pull-up on GPIO2 (EPWM2A)
GpioCtrlRegs.GPAPUD.bit.GPIO3 = 1; // Disable pull-up on GPIO3 (EPWM2B)
GpioCtrlRegs.GPAMUX1.bit.GPIO2 = 1; // Configure GPIO2 as EPWM2A
GpioCtrlRegs.GPAMUX1.bit.GPIO3 = 1; // Configure GPIO3 as EPWM2B
GpioCtrlRegs.GPAPUD.bit.GPIO4 = 1; // Disable pull-up on GPIO4 (EPWM3A)
GpioCtrlRegs.GPAPUD.bit.GPIO5 = 1; // Disable pull-up on GPIO5 (EPWM3B)
GpioCtrlRegs.GPAMUX1.bit.GPIO4 = 0; // Configure GPIO4 as EPWM3A
GpioCtrlRegs.GPAMUX1.bit.GPIO5 = 0; // Configure GPIO5 as EPWM3B
GpioCtrlRegs.GPADIR.bit.GPIO4 = 1;
GpioCtrlRegs.GPADIR.bit.GPIO5 = 1;
GpioCtrlRegs.GPAPUD.bit.GPIO8 = 1; // Disable pull-up on GPIO8 (EPWM5A)
GpioCtrlRegs.GPAMUX1.bit.GPIO8 = 1; // Configure GPIO1 as EPWM5A
GpioCtrlRegs.GPBPUD.bit.GPIO32 = 0;
GpioCtrlRegs.GPBMUX1.bit.GPIO32 = 2;
// Configure GPIO31 as a GPIO output pin (Evalkit Blue LED)
GpioCtrlRegs.GPAMUX2.bit.GPIO31 = 0;
GpioCtrlRegs.GPADIR.bit.GPIO31 = 1;
// RED OCP LED
GpioCtrlRegs.GPBMUX1.bit.GPIO34 = 0;
GpioCtrlRegs.GPBDIR.bit.GPIO34 = 1;
// GPIO 10 as input (ENABLE SWITCH)
GpioCtrlRegs.GPAPUD.bit.GPIO10 = 1; // Disable pullup on GPIO10
GpioCtrlRegs.GPAMUX1.bit.GPIO10 = 0; // GPIO10 = GPIO10
GpioCtrlRegs.GPADIR.bit.GPIO10 = 0; // GPIO10 = input
GpioCtrlRegs.GPACTRL.bit.QUALPRD1=10; // Qual period = SYSCLKOUT/10
GpioCtrlRegs.GPAQSEL1.bit.GPIO10=2; // 6 samples
AdcRegs.ADCCTL1.bit.ADCBGPWD = 1; // Power ADC BandGap
AdcRegs.ADCCTL1.bit.ADCREFPWD = 1; // Power reference
AdcRegs.ADCCTL1.bit.ADCPWDN = 1; // Power ADC
AdcRegs.ADCCTL1.bit.ADCENABLE = 1; // Enable ADC
AdcRegs.ADCCTL1.bit.ADCREFSEL = 0; // Select internal BandGap
EDIS;
InitEPwm2();
PieCtrlRegs.PIEIER1.bit.INTx7 = 1;
// Enable EPWM INTn in the PIE: Group 2 interrupt 1
PieCtrlRegs.PIEIER2.bit.INTx1 = 1;
// Enable EPWM1_INT in the PIE: Group 3 interrupt 1
PieCtrlRegs.PIEIER3.bit.INTx1 = 1;
// Enable EPWM2_INT in the PIE: Group 3 interrupt 2
PieCtrlRegs.PIEIER3.bit.INTx2 = 1;
// Enable EPWM4_INT in the PIE: Group 3 interrupt 4
PieCtrlRegs.PIEIER3.bit.INTx4 = 1;
//Enable ADC in the PIE: Group 1
PieCtrlRegs.PIEIER1.bit.INTx1 = 1; // Enable INT 1.1 in the PIE
// Enable global Interrupts and higher priority real-time debug events:
PieCtrlRegs.PIEACK.all = 0xFFFF;
// Wait for ADC interrupt
}
void InitEPwm2Gpio(void)
{
EALLOW;
/* Disable internal pull-up for the selected output pins
for reduced power consumption */
// Pull-ups can be enabled or disabled by the user.
// This will enable the pullups for the specified pins.
// Comment out other unwanted lines.
GpioCtrlRegs.GPAPUD.bit.GPIO2 = 1; // Disable pull-up on GPIO2 (EPWM2A)
GpioCtrlRegs.GPAPUD.bit.GPIO3 = 1; // Disable pull-up on GPIO3 (EPWM2B)
/* Configure EPwm-2 pins using GPIO regs*/
// This specifies which of the possible GPIO pins will be EPWM2 functional pins.
// Comment out other unwanted lines.
GpioCtrlRegs.GPAMUX1.bit.GPIO2 = 1; // Configure GPIO2 as EPWM2A
GpioCtrlRegs.GPAMUX1.bit.GPIO3 = 1; // Configure GPIO3 as EPWM2B
EDIS;
}
void InitEPwm2()
{
EALLOW;
//Fórmula 40Mhz/50kHz=800period in TBCLK counts
EPwm1Regs.TBPRD = period;
//EPwm1Regs.TBPHS.half.TBPHS = 0;
//EPwm1Regs.TBPHS = 0x0000; // Set Phase register to zero
EPwm1Regs.TBPHS.half.TBPHS = 0; // Set Phase register to zero
EPwm1Regs.TBCTR = 0; // clear TB counter
EPwm1Regs.TBCTL.bit.CTRMODE = TB_COUNT_UP;
EPwm1Regs.TBCTL.bit.PHSEN = TB_DISABLE; // Phase loading disabled
EPwm1Regs.TBCTL.bit.SYNCOSEL = TB_SYNC_DISABLE;
EPwm1Regs.TBCTL.bit.PRDLD = TB_SHADOW;
EPwm1Regs.TBCTL.bit.HSPCLKDIV = TB_DIV1; // TBCLK = SYSCLK
EPwm1Regs.TBCTL.bit.CLKDIV = TB_DIV1;
EPwm1Regs.CMPCTL.bit.SHDWAMODE = CC_SHADOW;
EPwm1Regs.CMPCTL.bit.SHDWBMODE = CC_SHADOW;
EPwm1Regs.CMPCTL.bit.LOADAMODE = CC_CTR_ZERO; // load on CTR = Zero
EPwm1Regs.CMPCTL.bit.LOADBMODE = CC_CTR_ZERO; // load on CTR = Zero
EPwm1Regs.AQCTLA.bit.ZRO = AQ_SET;
EPwm1Regs.AQCTLA.bit.CAU = AQ_CLEAR;
EPwm1Regs.AQCTLB.bit.ZRO = AQ_SET;
EPwm1Regs.AQCTLB.bit.CBU = AQ_CLEAR;
EPwm1Regs.AQCTLA.bit.PRD = AQ_CLEAR;
EPwm1Regs.AQCTLA.bit.CAU = AQ_SET;
//
// Run Time
// = = = = = = = = = = = = = = = = = = = = = = = =
//EPwm1Regs.CMPA.half.CMPA = 0.5; // adjust duty for output EPWM1A
Comp1Regs.COMPCTL.bit.COMPDACEN = 1;
Comp1Regs.COMPCTL.bit.SYNCSEL = 1;
Comp1Regs.COMPCTL.bit.CMPINV = DC_BLANK_NOTINV;
Comp1Regs.COMPCTL.bit.COMPSOURCE = 0;
Comp1Regs.COMPCTL.bit.QUALSEL = 0;
Comp1Regs.DACCTL.bit.RAMPSOURCE = 0;
Comp1Regs.DACCTL.bit.DACSOURCE = 1;
Comp1Regs.DACCTL.bit.FREE_SOFT = 0;
Comp1Regs.DACVAL.all = 1024;
Comp1Regs.RAMPDECVAL_SHDW = 20000;
Comp1Regs.RAMPMAXREF_SHDW = 49000;
Comp1Regs.DACVAL.bit.DACVAL=310;
EPwm1Regs.DCTRIPSEL.bit.DCAHCOMPSEL=0; // DCAH = Comparator output
EPwm1Regs.DCTRIPSEL.bit.DCALCOMPSEL=8;
EPwm1Regs.TZDCSEL.bit.DCAEVT2 = TZ_DCAH_HI; // DCAEVT2 = (will become active as Comparator output goes high)
EPwm1Regs.DCACTL.bit.EVT2SRCSEL = 1;//DC_EVT2; // DCAEVT2 = DCAEVT2 (not filtered)
EPwm1Regs.DCACTL.bit.EVT2FRCSYNCSEL = 1; // Take sync path
EPwm1Regs.TZSEL.bit.DCAEVT2 = 1;
EPwm1Regs.TZCTL.bit.TZA = TZ_FORCE_HI; // EPWM1A will go low
EPwm1Regs.TZCTL.bit.TZB = TZ_FORCE_LO; // EPWM1A will go low
EPwm1Regs.TZEINT.bit.DCAEVT2 = 1;
EPwm1Regs.DCFCTL.bit.PULSESEL = 0; // Time-base counter equal to zero (TBCTR = 0x0000) - start blank timer
EPwm1Regs.DCFCTL.bit.BLANKINV=0;
EPwm1Regs.DCFCTL.bit.BLANKE=1;
EPwm1Regs.DCFCTL.bit.SRCSEL = 3; // Source Is DCAEVT2 Signal
EPwm1Regs.DCFOFFSET = 0; // no offset
EPwm1Regs.DCFWINDOW = 255; // Blanking window
EDIS;
}