This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

F28M36H53C2: ePWM Continuous Software Force does not force ePWMxB

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?

  • Hello,

    After a quick review of your code, I see that in the 3rd snippet of code you shared, it is configuring the AQCSFRC register for EPWM1 but no code to configure EPWM2's AQCSFRC. Do you have code to do that in your project but just didn't post it here?

    Regards,
    Elizabeth
  • Hello Elizabeth,

    Just to clarify a bit more, pwms[i] is a pointer to the array of EPwmXRegs (where X goes from 1 to 12) I call the third snippet of code in a loop that covers ePWM1 and ePWM2.

    Infact I can see that ePWM1A and ePWM2A are low but ePWM1B and ePWM2B are high.

    I don't know if this can help but if I modify my code this way:

    pwms[i]->AQCSFRC.bit.CSFA= 2;
    pwms[i]->AQCSFRC.bit.CSFB= 2;
    pwms[i]->AQCSFRCM.bit.CSFA= 2;
    pwms[i]->AQCSFRCM.bit.CSFB= 2;
    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);

    Forcing alle the ePWMs to an high state I have that ePWM1A and ePWM2A are high but ePWM1B and ePWM2B are low.

    I did not write the original code of the ePWMs configuration but to me it looks like there is something somewhere that inverts the A and the B output. I had a look through the documentation but I could not find anything that could explain this scenario.

    Thanks for your help,

    Claudio

  • Hi Claudio,

    I see that the POLSEL bit of the DBCTL register in line 46 is set to active high complementary, which inverts the EPWMxB output.
    This bit can be set to active high mode in which neither A/B output is inverted.

    Regards,
    Elizabeth
  • Thank you very much for your help! This fixed my problem.