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.

TMS320F28377S: Can't get CAD or CBD to work

Part Number: TMS320F28377S


I am trying to replicate the behavior of Figure 14-30 in the TRM (SPRUHX5F) using EPwm6A.

The up-count settings work as expected but the down-count settings don't work. 

EPwm6 register settings are as follows:

EPwm6Regs.TBCTL.bit.CTRMODE          = TB_COUNT_UPDOWN;

EPwm6Regs.CMPCTL.bit.LOADAMODE  = 0;   /* Load on CTR = 0 */
EPwm6Regs.CMPCTL.bit.LOADBMODE  = 0;   /* Load on CTR = 0 */
EPwm6Regs.CMPCTL.bit.SHDWAMODE = 0;   /* Shadow Enabled */
EPwm6Regs.CMPCTL.bit.SHDWBMODE = 0;   /* Shadow Enabled */
EPwm6Regs.CMPCTL.bit.LOADASYNC   = 0;   /* Use LOADAMODE */
EPwm6Regs.CMPCTL.bit.LOADBSYNC   = 0;   /* Use LOADBMODE */

EPwm6Regs.AQCTL.bit.LDAQAMODE       = 0; /* Load on CTR = 0 */
EPwm6Regs.AQCTL.bit.LDAQBMODE       = 0; /* Load on CTR = 0 */
EPwm6Regs.AQCTL.bit.SHDWAQAMODE = 1; /* Shadow enabled */
EPwm6Regs.AQCTL.bit.SHDWAQBMODE = 1; /* Shadow enabled */
EPwm6Regs.AQCTL.bit.LDAQASYNC        = 0; /* Use LDAQAMODE */
EPwm6Regs.AQCTL.bit.LDAQBSYNC        = 0; /* Use LDAQBMODE */

EPwm6Regs.TBPRD = 166;
EPwm6Regs.CMPA.bit.CMPA = 120;
EPwm6Regs.CMPB.bit.CMPB = (EPwm6Regs.TBPRD - EPwm6Regs.CMPA.bit.CMPA); /* CMPB = 46 */

EPwm6Regs.AQCTLA.bit.ZRO = AQ_CLEAR;
EPwm6Regs.AQCTLA.bit.PRD = AQ_NO_ACTION;
EPwm6Regs.AQCTLA.bit.CAU = AQ_SET;
EPwm6Regs.AQCTLA.bit.CAD = AQ_NO_ACTION;
EPwm6Regs.AQCTLA.bit.CBU = AQ_NO_ACTION;
EPwm6Regs.AQCTLA.bit.CBD = AQ_CLEAR;

 With these settings I am expecting the behavior as seen in Figure 14-30:

What I'm actually getting is shown in the scope plot below.  Channel 1 is EPwm2A (its rising edge corresponds to EPwm2.TBCNT = EPwm6.TBCNT = 0).  Ch2 = EPwm6A.  Deadband has been zero'd for clarity.

Note that EPwm6A goes high at TBCNT = CMPA on up-count, as expected.  It does NOT go low at TBCNT = CMPB on down-count but instead stays high until TBCNT = 0.

I have tried swapping the values for EPwm6Regs.CMPA.bit.CMPA and EPwm6Regs.CMPB.bit.CMPB (i.e. CMPA = 46, CMPB = 120) and the result is the same.  

I've also tried setting both EPwm6Regs.CMPCTL.bit.LOADAMODE and EPwm6Regs.CMPCTL.bit.LOADBMODE to 1 and 2 (PRD load and both ZRO and PRD load) also wiht no effect.  

Am I mis-setting a register, or possibly attempting something that can't be done?  Thanks in advance for any insight.  

  • 1. Try immediate mode, lets see if that changes anything.

    2. Check after the settings are done in the debugger to make sure the values you have set for your registers took effect.

    Nima

  • Nima,

    I changed AQCTL to load immediate as shown below and it didn't change the behavior.  

    Could you summarize the register settings necessary to implement the EPWMxA waveform in Figure 30.  I think if I can get that working I'll be able to resolve this issue.

    Thanks for your assistance.

    EPwm6Regs.AQCTL.bit.LDAQAMODE = 0;
    EPwm6Regs.AQCTL.bit.LDAQBMODE = 0;


    EPwm6Regs.AQCTL.bit.SHDWAQAMODE = 0;
    EPwm6Regs.AQCTL.bit.SHDWAQBMODE = 0;


    EPwm6Regs.AQCTL.bit.LDAQASYNC = 0;
    EPwm6Regs.AQCTL.bit.LDAQBSYNC = 0;

  • Sorry, I meant Figure 14-30, as shown above

  • I’ll send you a simple example for this.

  • Still working on this I will post it when it's ready!

  • void initEPWM(uint32_t base)
    {
        //
        // Set-up TBCLK
        //
        EPWM_setTimeBasePeriod(base, EPWM_TIMER_TBPRD);
        EPWM_setPhaseShift(base, 0U);
        EPWM_setTimeBaseCounter(base, 0U);
    
        //
        // Set Compare values
        //
        EPWM_setCounterCompareValue(base,
                                    EPWM_COUNTER_COMPARE_A,
                                    EPWM_TIMER_TBPRD/2);
        EPWM_setCounterCompareValue(base,
                                    EPWM_COUNTER_COMPARE_B,
                                    EPWM_TIMER_TBPRD/4*3);
    
        //
        // Set up counter mode
        //
        EPWM_setTimeBaseCounterMode(base, EPWM_COUNTER_MODE_UP_DOWN);
        EPWM_disablePhaseShiftLoad(base);
        EPWM_setClockPrescaler(base,
                               EPWM_CLOCK_DIVIDER_8,
                               EPWM_HSCLOCK_DIVIDER_1);
    
        //
        // Set up shadowing
        //
        EPWM_setCounterCompareShadowLoadMode(base,
                                             EPWM_COUNTER_COMPARE_A,
                                             EPWM_COMP_LOAD_ON_CNTR_ZERO);
        EPWM_setCounterCompareShadowLoadMode(base,
                                             EPWM_COUNTER_COMPARE_B,
                                             EPWM_COMP_LOAD_ON_CNTR_ZERO);
    
        //
        // Set actions
        //
    
        EPWM_setActionQualifierAction(base,
                                      EPWM_AQ_OUTPUT_A,
                                      EPWM_AQ_OUTPUT_LOW,
                                      EPWM_AQ_OUTPUT_ON_TIMEBASE_ZERO);
        EPWM_setActionQualifierAction(base,
                                      EPWM_AQ_OUTPUT_A,
                                      EPWM_AQ_OUTPUT_HIGH,
                                      EPWM_AQ_OUTPUT_ON_TIMEBASE_UP_CMPA);
        EPWM_setActionQualifierAction(base,
                                      EPWM_AQ_OUTPUT_A,
                                      EPWM_AQ_OUTPUT_NO_CHANGE,
                                      EPWM_AQ_OUTPUT_ON_TIMEBASE_PERIOD);
        EPWM_setActionQualifierAction(base,
                                      EPWM_AQ_OUTPUT_A,
                                      EPWM_AQ_OUTPUT_LOW,
                                      EPWM_AQ_OUTPUT_ON_TIMEBASE_DOWN_CMPB);
    
    
        EPWM_setActionQualifierAction(base,
                                      EPWM_AQ_OUTPUT_B,
                                      EPWM_AQ_OUTPUT_LOW,
                                      EPWM_AQ_OUTPUT_ON_TIMEBASE_ZERO);
        EPWM_setActionQualifierAction(base,
                                      EPWM_AQ_OUTPUT_B,
                                      EPWM_AQ_OUTPUT_NO_CHANGE,
                                      EPWM_AQ_OUTPUT_ON_TIMEBASE_UP_CMPA);
        EPWM_setActionQualifierAction(base,
                                      EPWM_AQ_OUTPUT_B,
                                      EPWM_AQ_OUTPUT_HIGH,
                                      EPWM_AQ_OUTPUT_ON_TIMEBASE_PERIOD);
        EPWM_setActionQualifierAction(base,
                                      EPWM_AQ_OUTPUT_B,
                                      EPWM_AQ_OUTPUT_NO_CHANGE,
                                      EPWM_AQ_OUTPUT_ON_TIMEBASE_DOWN_CMPB);
    
    
    
        //
        // Interrupt where we will change the Compare Values
        // Select INT on Time base counter zero event,
        // Enable INT, generate INT on 1rd event
        //
        EPWM_setInterruptSource(base, EPWM_INT_TBCTR_ZERO);
        EPWM_enableInterrupt(base);
        EPWM_setInterruptEventCount(base, 1U);
    }