Tool/software: TI C/C++ Compiler
Hello,
i am attaching figure in which i have two modes 1. SPWM(d) and other is SPWMPOS(). before step change(point TO) SPWM(d) is running and after step change (To) immediately i am using SPWMPOS() mode. I have calculated the time for SPWMPOS() after this time SPWMPOS() switches off and again first mode SPWM(d) mode will start . 2nd mode occurs once when there is step change.In my code i used delay function to realise step change for GPIO3. i am writting my code please have a look and guide me how can i realize this changing modes. SPWM(d) is closed loop in which CMP is calculated from dual loop PI duty cycle and running in UPDOWN mode and its TBPRD is 1000 . SPWMPOS is open loop CMP is know and its running in UP count mode and its TBPRD is 11800.EALLOW;
GpioCtrlRegs.GPAPUD.bit.GPIO3 = 0;
GpioCtrlRegs.GPAMUX1.bit.GPIO3 = 0;
GpioCtrlRegs.GPADIR.bit.GPIO3 = 1;
EDIS;
GpioDataRegs.GPACLEAR.bit.GPIO3 = 1;
SPWM(d); // mode is running
DELAY_US(3333333); // step change
GpioDataRegs.GPASET.bit.GPIO3 = 1;
SPWMPOS(); // after step change second mode is running for calculated time
// How to change back to moade 1. SPWM(d)
????
//PWM1
void InitEPwm1Example()
{
EPwm1Regs.TBPRD = PERIOD ; // Set timer period
EPwm1Regs.TBPHS.bit.TBPHS = 0x0000; // Phase is 0
EPwm1Regs.TBCTR = 0x0000; // Clear counter
//
// Setup counter mode
//
EPwm1Regs.TBCTL.bit.CTRMODE = TB_COUNT_UPDOWN;
EPwm1Regs.TBCTL.bit.PHSEN = TB_DISABLE; // Disable phase loading
EPwm1Regs.TBCTL.bit.HSPCLKDIV = TB_DIV1; // Clock ratio to SYSCLKOUT
EPwm1Regs.TBCTL.bit.CLKDIV = TB_DIV1;
EPwm1Regs.TBCTL.bit.SYNCOSEL = TB_CTR_ZERO; // Sync output is equal to zero
//
//
// Setup compare
//
EPwm1Regs.CMPA.bit.CMPA = 0; //
// EPwm1Regs.CMPB.bit.CMPB = 0;
//
// Set actions
EPwm1Regs.AQCTLA.bit.CAU = AQ_CLEAR; // EPW1A
EPwm1Regs.AQCTLA.bit.CAD = AQ_SET; // EPW1A
EPwm1Regs.AQCTLB.bit.CAU = AQ_SET; // EPW1B
EPwm1Regs.AQCTLB.bit.CAD = AQ_CLEAR; // EPW1B
// Setup shadowing
//
EPwm1Regs.CMPCTL.bit.SHDWAMODE = CC_SHADOW;
EPwm1Regs.CMPCTL.bit.SHDWBMODE = CC_SHADOW;
EPwm1Regs.CMPCTL.bit.LOADAMODE = CC_CTR_ZERO; // Load on Zero
EPwm1Regs.CMPCTL.bit.LOADBMODE = CC_CTR_ZERO;
EPwm1Regs.ETSEL.bit.INTSEL = ET_CTR_ZERO; // Select INT on Zero event INTSEL= interrupt selection
EPwm1Regs.ETSEL.bit.INTEN = 1; // Enable INT
EPwm1Regs.ETPS.bit.INTPRD = ET_1ST; // Generate INT on 1st event
//Start Conversion of ADC
EPwm1Regs.ETSEL.bit.SOCAEN = 1; // Enable SOC on A group
EPwm1Regs.ETSEL.bit.SOCASEL = 2;
EPwm1Regs.ETPS.bit.SOCAPRD = 1; // Generate pulse on 1st event
// mode 1 SPWM(d)
void SPWM(float Ea )
{
float CMP;
CMP = PERIOD*((1+Ea)/2); // CMP is cal
EPwm1Regs.CMPA.bit.CMPA = (Uint16)CMP;
}
// Mode 2 SPWMPOS()
void SPWMPOS()
{
EPwm1Regs.TBPRD = 2000*5.9 ; // Set timer period
EPwm1Regs.TBCTL.bit.CTRMODE = TB_COUNT_UP;
EPwm1Regs.CMPA.bit.CMPA = 10340; //1025 for negative
EPwm1Regs.AQCTLA.bit.ZRO = AQ_SET; // Set PWM1A on Zero
EPwm1Regs.AQCTLA.bit.CAU = AQ_CLEAR; // Clear PWM1A on event A, up count
EPwm1Regs.AQCTLB.bit.ZRO = AQ_SET; // Set PWM1B on Zero
EPwm1Regs.AQCTLB.bit.CAU = AQ_CLEAR; // Clear PWM1B on event B, up count
// Setup shadowing
//
EPwm1Regs.CMPCTL.bit.SHDWAMODE = CC_SHADOW;
EPwm1Regs.CMPCTL.bit.SHDWBMODE = CC_SHADOW;
EPwm1Regs.CMPCTL.bit.LOADAMODE = CC_CTR_PRD; // Load on Zero
EPwm1Regs.CMPCTL.bit.LOADBMODE = CC_CTR_PRD;}
![]()