Part Number: F28M36H53C2
Hello,
I am facing some configuration issue with ePWM module and software force status:
My ePWM1 and ePWM2 are configured as follow:
pwms[i]->TBCTR = 0;
pwms[i]->TBPRDM2.half.TBPRD = period;
pwms[i]->TBPHS.all = 0;
pwms[i]->TBCTL.bit.FREE_SOFT = 0;
pwms[i]->TBCTL.bit.PHSDIR = 0;
pwms[i]->TBCTL.bit.CLKDIV = TB_DIV1;
pwms[i]->TBCTL.bit.HSPCLKDIV = TB_DIV1;
pwms[i]->TBCTL.bit.SYNCOSEL = TB_SYNC_DISABLE;
pwms[i]->TBCTL.bit.PRDLD = TB_SHADOW;
pwms[i]->TBCTL.bit.PHSEN = TB_DISABLE;
pwms[i]->TBCTL.bit.CTRMODE = TB_COUNT_UP;
//counter compare
pwms[i]->CMPCTL.bit.SHDWBMODE = CC_SHADOW;
pwms[i]->CMPCTL.bit.SHDWAMODE = CC_SHADOW;
pwms[i]->CMPCTL.bit.LOADBMODE = CC_CTR_PRD;
pwms[i]->CMPCTL.bit.LOADAMODE = CC_CTR_PRD;
pwms[i]->CMPAM2.half.CMPA = 0;
pwms[i]->CMPBM.half.CMPB = 0;
pwms[i]->AQCTLR.bit.SHDWAQAMODE = 0x1; //SHADOW
pwms[i]->AQCTLR.bit.SHDWAQBMODE = 0x1; //SHADOW
pwms[i]->AQCTLR.bit.LDAQASYNC = 0x00;
pwms[i]->AQCTLR.bit.LDAQBSYNC = 0x00;
pwms[i]->AQCTLR.bit.LDAQAMODE = CC_CTR_PRD;
pwms[i]->AQCTLR.bit.LDAQBMODE = CC_CTR_PRD;
//event trigger
pwms[i]->ETSEL.bit.SOCAEN = 1; // Enable SOC on A group
pwms[i]->ETSEL.bit.SOCBEN = 0; // Disable SOC on B group
pwms[i]->ETSEL.bit.SOCASEL = ET_CTRU_CMPA; // Select SOC from CMPA/CMPC on up count
pwms[i]->ETSEL.bit.SOCASELCMP = 0x0; // CMPA
pwms[i]->ETPS.bit.SOCAPRD = ET_1ST; // Generate SOCA pulse on every event
pwms[i]->TZSEL.bit.CBC1 = 1;
pwms[i]->TZCTL.bit.TZA = TZ_FORCE_LO;
pwms[i]->TZCTL.bit.TZB = TZ_FORCE_LO;
pwms[i]->TZCLR.bit.CBCPULSE = 1; // clear on CBC interrupt on PRD
pwms[i]->TZEINT.bit.CBC = 1;
//pwms[i]->DCTRIPSEL.bit.DCAHCOMPSEL = DC_TRIPIN7;
//pwms[i]->DCTRIPSEL.bit.DCBHCOMPSEL = DC_TRIPIN7;
//dead band
pwms[i]->DBCTL.bit.OUT_MODE= DB_FULL_ENABLE;
pwms[i]->DBCTL.bit.POLSEL= DB_ACTV_HIC;
pwms[i]->DBFED= 100;
pwms[i]->DBRED= 100;
pwms[i]->AQSFRC.bit.RLDCSF= 3;
I have ePWM1 and ePWM2 linked in this way:
EPwm2Regs.EPWMXLINK.bit.CMPALINK = PWM_LINK_EPWM1; //synch writes of PWM1 to PWM2
EPwm2Regs.EPWMXLINK.bit.CMPBLINK = PWM_LINK_EPWM1; //synch writes of PWM1 to PWM2
EPwm2Regs.EPWMXLINK.bit.TBPRDLINK = PWM_LINK_EPWM1;
and every 10 ms I modifiy the Action Qualifier registers this way:
if (pos)
/*ePWM reg 1 */
pwms[i]->AQCTLA.all = AQ_SET | (AQ_NO_ACTION << 2) | (AQ_CLEAR << 4) | (AQ_NO_ACTION <<6) | (AQ_NO_ACTION <<8) | (AQ_NO_ACTION <<10);
pwms[i]->AQCTLB.all = AQ_CLEAR | (AQ_NO_ACTION << 2) | (AQ_SET << 4) | (AQ_NO_ACTION <<6) | (AQ_NO_ACTION <<8) | (AQ_NO_ACTION <<10);
/*ePWM reg 2 */
pwms[i+1]->AQCTLA.all = AQ_CLEAR | (AQ_NO_ACTION << 2) | (AQ_NO_ACTION << 4) | (AQ_NO_ACTION <<6) | (AQ_NO_ACTION <<8) | (AQ_NO_ACTION <<10);
pwms[i+1]->AQCTLB.all = AQ_SET | (AQ_NO_ACTION << 2) | (AQ_NO_ACTION << 4) | (AQ_NO_ACTION <<6) | (AQ_NO_ACTION <<8) | (AQ_NO_ACTION <<10);
}
else
{
pwms[i]->AQCTLA.all = AQ_CLEAR | (AQ_NO_ACTION << 2) | (AQ_NO_ACTION << 4) | (AQ_NO_ACTION <<6) | (AQ_NO_ACTION <<8) | (AQ_NO_ACTION <<10);
pwms[i]->AQCTLB.all = AQ_SET | (AQ_NO_ACTION << 2) | (AQ_NO_ACTION << 4) | (AQ_NO_ACTION <<6) | (AQ_NO_ACTION <<8) | (AQ_NO_ACTION <<10);
pwms[i+1]->AQCTLA.all = AQ_SET | (AQ_NO_ACTION << 2) | (AQ_CLEAR << 4) | (AQ_NO_ACTION <<6) | (AQ_NO_ACTION <<8) | (AQ_NO_ACTION <<10);
pwms[i+1]->AQCTLB.all = AQ_CLEAR | (AQ_NO_ACTION << 2) | (AQ_SET << 4) | (AQ_NO_ACTION <<6) | (AQ_NO_ACTION <<8) | (AQ_NO_ACTION <<10);
}
Now under certain circumstances I need to perform a software force to force it low, I can not use hw force because it is already dedicated to a different logic.
So what I do is to call a function that is doing:
pwms[i]->AQCSFRC.bit.CSFA= 1;
pwms[i]->AQCSFRC.bit.CSFB= 1;
pwms[i]->AQCSFRCM.bit.CSFA= 1;
pwms[i]->AQCSFRCM.bit.CSFB= 1;
pwms[i]->AQCTLA.all = AQ_CLEAR | (AQ_NO_ACTION << 2) | (AQ_NO_ACTION << 4) | (AQ_NO_ACTION <<6) | (AQ_NO_ACTION <<8) | (AQ_NO_ACTION <<10);
pwms[i]->AQCTLB.all = AQ_CLEAR | (AQ_NO_ACTION << 2) | (AQ_NO_ACTION << 4) | (AQ_NO_ACTION <<6) | (AQ_NO_ACTION <<8) | (AQ_NO_ACTION <<10);
pwms[i]->AQCTLAM.all = AQ_CLEAR | (AQ_NO_ACTION << 2) | (AQ_NO_ACTION << 4) | (AQ_NO_ACTION <<6) | (AQ_NO_ACTION <<8) | (AQ_NO_ACTION <<10);
pwms[i]->AQCTLBM.all = AQ_CLEAR | (AQ_NO_ACTION << 2) | (AQ_NO_ACTION << 4) | (AQ_NO_ACTION <<6) | (AQ_NO_ACTION <<8) | (AQ_NO_ACTION <<10);
On ePWM1 and on ePWM2
Now the issue is that I get ePWM1A and ePWM2A low but ePWM1B and ePWM2B are high.
Am I missing something?