Tool/software: Code Composer Studio
I am trying to create a pulse train. The span of the pulse train is 1msec. The time period of a single pulse is 100usec. I am using timer0 to generate CMPA value of ePWM1. The code is as follows
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
#include "DSP280x_Device.h"
#include "DSP280x_Examples.h"
int i=0;
typedef struct
{
volatile struct EPWM_REGS *EPwmRegHandle;
}EPWM_INFO;
void InitEPwm1Example(void);
__interrupt void cpu_timer0_isr(void);
void main(void)
{
InitSysCtrl();
InitEPwm1Gpio();
DINT;
InitPieCtrl();
IER = 0x0000;
IFR = 0x0000;
InitPieVectTable();
EALLOW;
PieVectTable.TINT0 = &cpu_timer0_isr;
EDIS;
InitCpuTimers();
ConfigCpuTimer(&CpuTimer0, 100, 1000); \\ Clock Frequency 1kHz
CpuTimer0Regs.TCR.all = 0x4000;
EALLOW;
SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 0;
EDIS;
InitEPwm1Example();
EALLOW;
SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 1;
EDIS;
IER |= M_INT3;
IER |= M_INT1;
PieCtrlRegs.PIEIER1.bit.INTx7 = 1;
EINT;
ERTM;
for(;;)
{
__asm("NOP");
}
}
__interrupt void cpu_timer0_isr(void)
{
if(i<1)
{
EPwm1Regs.CMPA.half.CMPA = 2110;
}
else
{
EPwm1Regs.CMPA.half.CMPA = 0;
}
i=i+1;
if(i>19)
{
i=0;
}
PieCtrlRegs.PIEACK.all = PIEACK_GROUP1;
}
void InitEPwm1Example()
{
EPwm1Regs.TBPRD = 2500; \\ PWM frequency 10kHz
EPwm1Regs.TBPHS.half.TBPHS = 0x0000;
EPwm1Regs.TBCTR = 0x0000;
EPwm1Regs.CMPA.half.CMPA = 0;
EPwm1Regs.TBCTL.bit.CTRMODE = TB_COUNT_UPDOWN;
EPwm1Regs.TBCTL.bit.PHSEN = TB_DISABLE;
EPwm1Regs.TBCTL.bit.HSPCLKDIV = TB_DIV2;
EPwm1Regs.TBCTL.bit.CLKDIV = TB_DIV1;
EPwm1Regs.AQCTLA.bit.CAU = AQ_CLEAR;
EPwm1Regs.AQCTLA.bit.CAD = AQ_SET;
EPwm1Regs.CMPCTL.bit.SHDWAMODE = CC_SHADOW;
EPwm1Regs.CMPCTL.bit.LOADAMODE = CC_CTR_ZERO;
}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
A peculiar case happens. Since my pulse train span is 1msec and one pulse is 100usec I have a total of 10 pulses in 1msec. Since I have a constant CMPA value in this 1msec the pulse width should be same but the tenth pulse which is the last pulse has 100% duty ratio. I don't want a PWM interrupt to change the CMPA value I purposefully want a timer interrupt to change the CMPA value. Can anyone please help me fix this issue?