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.

LAUNCHXL-F28379D: eCap Delta Timing

Part Number: LAUNCHXL-F28379D

I'd like to use the eCap in delta mode to capture time stamps with rising and falling edge detection as described in http://www.ti.com/lit/ug/sprug79/sprug79.pdf

   //
    // Disable ,clear all capture flags and interrupts
    //
    ECAP_disableInterrupt(ECAP1_BASE,
                          (ECAP_ISR_SOURCE_CAPTURE_EVENT_1  |
                           ECAP_ISR_SOURCE_CAPTURE_EVENT_2  |
                           ECAP_ISR_SOURCE_CAPTURE_EVENT_3  |
                           ECAP_ISR_SOURCE_CAPTURE_EVENT_4  |
                           ECAP_ISR_SOURCE_COUNTER_OVERFLOW |
                           ECAP_ISR_SOURCE_COUNTER_PERIOD   |
                           ECAP_ISR_SOURCE_COUNTER_COMPARE));
    ECAP_clearInterrupt(ECAP1_BASE,
                        (ECAP_ISR_SOURCE_CAPTURE_EVENT_1  |
                         ECAP_ISR_SOURCE_CAPTURE_EVENT_2  |
                         ECAP_ISR_SOURCE_CAPTURE_EVENT_3  |
                         ECAP_ISR_SOURCE_CAPTURE_EVENT_4  |
                         ECAP_ISR_SOURCE_COUNTER_OVERFLOW |
                         ECAP_ISR_SOURCE_COUNTER_PERIOD   |
                         ECAP_ISR_SOURCE_COUNTER_COMPARE));


//    ECap1Regs.ECCTL1.bit.CAP1POL = ECAP_EVNT_RISING_EDGE;
//    ECap1Regs.ECCTL1.bit.CAP2POL = ECAP_EVNT_RISING_EDGE;
//    ECap1Regs.ECCTL1.bit.CAP3POL = ECAP_EVNT_RISING_EDGE;
//    ECap1Regs.ECCTL1.bit.CAP4POL = ECAP_EVNT_RISING_EDGE;

    ECAP_setEventPolarity(ECAP1_BASE, ECAP_EVENT_1, ECAP_EVNT_RISING_EDGE);
    ECAP_setEventPolarity(ECAP1_BASE, ECAP_EVENT_2, ECAP_EVNT_FALLING_EDGE);
    ECAP_setEventPolarity(ECAP1_BASE, ECAP_EVENT_3, ECAP_EVNT_RISING_EDGE);
    ECAP_setEventPolarity(ECAP1_BASE, ECAP_EVENT_4, ECAP_EVNT_FALLING_EDGE);

//    ECap1Regs.ECCTL1.bit.CTRRST1 = 1; // Difference mode
//    ECap1Regs.ECCTL1.bit.CTRRST2 = 1; // Difference mode
//    ECap1Regs.ECCTL1.bit.CTRRST3 = 1; // Difference mode
//    ECap1Regs.ECCTL1.bit.CTRRST4 = 1; // Difference mode
    ECAP_disableCounterResetOnEvent(ECAP1_BASE, ECAP_EVENT_1);
    ECAP_disableCounterResetOnEvent(ECAP1_BASE, ECAP_EVENT_2);
    ECAP_disableCounterResetOnEvent(ECAP1_BASE, ECAP_EVENT_3);
    ECAP_disableCounterResetOnEvent(ECAP1_BASE, ECAP_EVENT_4);

//    ECap1Regs.ECCTL1.bit.CAPLDEN = 1;
    ECAP_enableTimeStampCapture(ECAP1_BASE);

//    ECap1Regs.ECCTL1.bit.PRESCALE = 0;
    ECAP_setEventPrescaler(ECAP1_BASE, 1);

//    ECap1Regs.ECCTL2.bit.CAP_APWM = 0;
    ECAP_enableCaptureMode(ECAP1_BASE);

//    ECap1Regs.ECCTL2.bit.CONT_ONESHT = 0;
    ECAP_setCaptureMode(ECAP1_BASE, ECAP_CONTINUOUS_CAPTURE_MODE, ECAP_EVENT_1);
    ECAP_setCaptureMode(ECAP1_BASE, ECAP_CONTINUOUS_CAPTURE_MODE, ECAP_EVENT_2);
    ECAP_setCaptureMode(ECAP1_BASE, ECAP_CONTINUOUS_CAPTURE_MODE, ECAP_EVENT_3);
    ECAP_setCaptureMode(ECAP1_BASE, ECAP_CONTINUOUS_CAPTURE_MODE, ECAP_EVENT_4);

//    ECap1Regs.ECCTL2.bit.SYNCO_SEL =  2;
    ECAP_setSyncOutMode(ECAP1_BASE, ECAP_SYNC_OUT_DISABLED);

//    ECap1Regs.ECCTL2.bit.SYNCI_EN =   0;
    ECAP_disableLoadCounter(ECAP1_BASE);

    XBAR_setInputPin(XBAR_INPUT7, 16);

//    ECap1Regs.ECCTL2.bit.TSCTRSTOP =  1;
    ECAP_startCounter(ECAP1_BASE);

    ECAP_enableInterrupt(ECAP1_BASE, ECAP_ISR_SOURCE_CAPTURE_EVENT_1);

//    cap4Count = ECap1Regs.CAP4;
//    cap1Count = ECap1Regs.CAP1;
//    cap2Count = ECap1Regs.CAP2;
//    cap3Count = ECap1Regs.CAP3;
    DutyOnTime1 = ECAP_getEventTimeStamp(ECAP1_BASE, ECAP_EVENT_2);
    DutyOffTime1 = ECAP_getEventTimeStamp(ECAP1_BASE, ECAP_EVENT_3);
    DutyOnTime2 = ECAP_getEventTimeStamp(ECAP1_BASE, ECAP_EVENT_4);
    DutyOffTime2 = ECAP_getEventTimeStamp(ECAP1_BASE, ECAP_EVENT_1);

    Period1 = DutyOnTime1 + DutyOffTime1;
    Period2 = DutyOnTime2 + DutyOffTime2;

    ecap1IntCount++;

    //
    // Clear interrupt flags for more interrupts.
    //
    ECAP_clearInterrupt(ECAP1_BASE,ECAP_ISR_SOURCE_CAPTURE_EVENT_1);
    ECAP_clearGlobalInterrupt(ECAP1_BASE);

    //
    // Acknowledge the group interrupt for more interrupts.
    //
    Interrupt_clearACKGroup(INTERRUPT_ACK_GROUP4);

Thanks!

  • I'm sorry. For some reason when composing the post, not all of the information from the post was actually posted. Stand by for a more complete post in the comments.
  • Here's the complete post:

    I'd like to use the eCap in delta mode to capture time stamps with rising and falling edge detection as described here on page 34.  The reference provides code snippets which I've adapted to the C2000 eCap library.  The values of the duty times continues to rise from 8,000,000 to the max for the 32 bit counter then returns to 8,000,000.

    What is incorrect in the adapted code compared with the example?  Once Period 1 and Period 2 are obtained, do those values represent timer ticks?  If so, in order to get a period in seconds, I'll divide that by the 200 MHz clock value.

    I've commented the reference code snippets above the adapted code.

    eCap Setup:

    //
        // Disable ,clear all capture flags and interrupts
        //
        ECAP_disableInterrupt(ECAP1_BASE,
                              (ECAP_ISR_SOURCE_CAPTURE_EVENT_1  |
                               ECAP_ISR_SOURCE_CAPTURE_EVENT_2  |
                               ECAP_ISR_SOURCE_CAPTURE_EVENT_3  |
                               ECAP_ISR_SOURCE_CAPTURE_EVENT_4  |
                               ECAP_ISR_SOURCE_COUNTER_OVERFLOW |
                               ECAP_ISR_SOURCE_COUNTER_PERIOD   |
                               ECAP_ISR_SOURCE_COUNTER_COMPARE));
        ECAP_clearInterrupt(ECAP1_BASE,
                            (ECAP_ISR_SOURCE_CAPTURE_EVENT_1  |
                             ECAP_ISR_SOURCE_CAPTURE_EVENT_2  |
                             ECAP_ISR_SOURCE_CAPTURE_EVENT_3  |
                             ECAP_ISR_SOURCE_CAPTURE_EVENT_4  |
                             ECAP_ISR_SOURCE_COUNTER_OVERFLOW |
                             ECAP_ISR_SOURCE_COUNTER_PERIOD   |
                             ECAP_ISR_SOURCE_COUNTER_COMPARE));
    
    
    //    ECap1Regs.ECCTL1.bit.CAP1POL = ECAP_EVNT_RISING_EDGE;
    //    ECap1Regs.ECCTL1.bit.CAP2POL = ECAP_EVNT_RISING_EDGE;
    //    ECap1Regs.ECCTL1.bit.CAP3POL = ECAP_EVNT_RISING_EDGE;
    //    ECap1Regs.ECCTL1.bit.CAP4POL = ECAP_EVNT_RISING_EDGE;
    
        ECAP_setEventPolarity(ECAP1_BASE, ECAP_EVENT_1, ECAP_EVNT_RISING_EDGE);
        ECAP_setEventPolarity(ECAP1_BASE, ECAP_EVENT_2, ECAP_EVNT_FALLING_EDGE);
        ECAP_setEventPolarity(ECAP1_BASE, ECAP_EVENT_3, ECAP_EVNT_RISING_EDGE);
        ECAP_setEventPolarity(ECAP1_BASE, ECAP_EVENT_4, ECAP_EVNT_FALLING_EDGE);
    
    //    ECap1Regs.ECCTL1.bit.CTRRST1 = 1; // Difference mode
    //    ECap1Regs.ECCTL1.bit.CTRRST2 = 1; // Difference mode
    //    ECap1Regs.ECCTL1.bit.CTRRST3 = 1; // Difference mode
    //    ECap1Regs.ECCTL1.bit.CTRRST4 = 1; // Difference mode
        ECAP_disableCounterResetOnEvent(ECAP1_BASE, ECAP_EVENT_1);
        ECAP_disableCounterResetOnEvent(ECAP1_BASE, ECAP_EVENT_2);
        ECAP_disableCounterResetOnEvent(ECAP1_BASE, ECAP_EVENT_3);
        ECAP_disableCounterResetOnEvent(ECAP1_BASE, ECAP_EVENT_4);
    
    //    ECap1Regs.ECCTL1.bit.CAPLDEN = 1;
        ECAP_enableTimeStampCapture(ECAP1_BASE);
    
    //    ECap1Regs.ECCTL1.bit.PRESCALE = 0;
        ECAP_setEventPrescaler(ECAP1_BASE, 1);
    
    //    ECap1Regs.ECCTL2.bit.CAP_APWM = 0;
        ECAP_enableCaptureMode(ECAP1_BASE);
    
    //    ECap1Regs.ECCTL2.bit.CONT_ONESHT = 0;
        ECAP_setCaptureMode(ECAP1_BASE, ECAP_CONTINUOUS_CAPTURE_MODE, ECAP_EVENT_1);
        ECAP_setCaptureMode(ECAP1_BASE, ECAP_CONTINUOUS_CAPTURE_MODE, ECAP_EVENT_2);
        ECAP_setCaptureMode(ECAP1_BASE, ECAP_CONTINUOUS_CAPTURE_MODE, ECAP_EVENT_3);
        ECAP_setCaptureMode(ECAP1_BASE, ECAP_CONTINUOUS_CAPTURE_MODE, ECAP_EVENT_4);
    
    //    ECap1Regs.ECCTL2.bit.SYNCO_SEL =  2;
        ECAP_setSyncOutMode(ECAP1_BASE, ECAP_SYNC_OUT_DISABLED);
    
    //    ECap1Regs.ECCTL2.bit.SYNCI_EN =   0;
        ECAP_disableLoadCounter(ECAP1_BASE);
    
        XBAR_setInputPin(XBAR_INPUT7, 16);
    
    //    ECap1Regs.ECCTL2.bit.TSCTRSTOP =  1;
        ECAP_startCounter(ECAP1_BASE);
    
        ECAP_enableInterrupt(ECAP1_BASE, ECAP_ISR_SOURCE_CAPTURE_EVENT_1);

    ISR triggered on CEVT1:

    //    cap4Count = ECap1Regs.CAP4;
    //    cap1Count = ECap1Regs.CAP1;
    //    cap2Count = ECap1Regs.CAP2;
    //    cap3Count = ECap1Regs.CAP3;
        DutyOnTime1 = ECAP_getEventTimeStamp(ECAP1_BASE, ECAP_EVENT_2);
        DutyOffTime1 = ECAP_getEventTimeStamp(ECAP1_BASE, ECAP_EVENT_3);
        DutyOnTime2 = ECAP_getEventTimeStamp(ECAP1_BASE, ECAP_EVENT_4);
        DutyOffTime2 = ECAP_getEventTimeStamp(ECAP1_BASE, ECAP_EVENT_1);
    
        Period1 = DutyOnTime1 + DutyOffTime1;
        Period2 = DutyOnTime2 + DutyOffTime2;
    
        ecap1IntCount++;
    
        //
        // Clear interrupt flags for more interrupts.
        //
        ECAP_clearInterrupt(ECAP1_BASE,ECAP_ISR_SOURCE_CAPTURE_EVENT_1);
        ECAP_clearGlobalInterrupt(ECAP1_BASE);
    
        //
        // Acknowledge the group interrupt for more interrupts.
        //
        Interrupt_clearACKGroup(INTERRUPT_ACK_GROUP4);

  • Hi Curtis,

    Looking at lines 36-39, your code is being setup to do absolute mode time capture instead of delta time. You need to use the function call "ECAP_enableCounterResetOnEvent". And yes, provided you aren't using prescale, you can obtain the time in seconds by dividing by the CPU frequency in Hz not MHz.