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.

CCS/TMS320F280049C: Absolute Time-Stamp Operation Rising and Falling Edge Trigger using ECAP

Part Number: TMS320F280049C

Tool/software: Code Composer Studio

Dear TI Hello,

I am using an ecap to measure a duty cycle,

I am using this code c for ecap configuration:

    //
    // Disable ,clear all capture flags and interrupts
    // Necessary???
    ECAP_disableInterrupt(ECAP3_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(ECAP3_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));

    //
    // Disable CAP1-CAP4 register loads
    //
    ECAP_disableTimeStampCapture(ECAP3_BASE);

    //
    // Configure eCAP
    //    Enable capture mode.
    //    Continuous mode, wrap capture at event 4
    //    Set polarity of the events to rising, falling ,  rising and falling.
    //    Set capture in time difference mode.
    //    Enable eCAP module.
    //

    ECAP_stopCounter(ECAP3_BASE);
    ECAP_enableCaptureMode(ECAP3_BASE);

    /* Continuous and capture mode, wrap around after event 3 */
    ECAP_setCaptureMode(ECAP3_BASE, ECAP_CONTINUOUS_CAPTURE_MODE, ECAP_EVENT_3);

    /* Connect SPEED1 GPIO to ECAP3 */
    ECAP_selectECAPInput(ECAP3_BASE,ECAP_INPUT_INPUTXBAR4);

    /* Set polarity for events*/
    ECAP_setEventPolarity(ECAP3_BASE, ECAP_EVENT_1, ECAP_EVNT_FALLING_EDGE);
    ECAP_setEventPolarity(ECAP3_BASE, ECAP_EVENT_2, ECAP_EVNT_RISING_EDGE);
    ECAP_setEventPolarity(ECAP3_BASE, ECAP_EVENT_3, ECAP_EVNT_FALLING_EDGE);
    ECAP_setEventPolarity(ECAP3_BASE, ECAP_EVENT_4, ECAP_EVNT_RISING_EDGE);

    /* Don't reset counter on capture events */
    ECAP_disableCounterResetOnEvent(ECAP3_BASE, ECAP_EVENT_1);
    ECAP_disableCounterResetOnEvent(ECAP3_BASE, ECAP_EVENT_2);
    ECAP_disableCounterResetOnEvent(ECAP3_BASE, ECAP_EVENT_3);


    EALLOW;
    //ECap1Regs.ECCTL1.bit.CAPLDEN = 0x1;
    EDIS;

    /* Enable Loading of CAP1-4 registers on a capture event */
    ECAP_enableLoadCounter(ECAP3_BASE);

    /* Disable sync out signal */
    ECAP_setSyncOutMode(ECAP3_BASE, ECAP_SYNC_OUT_SYNCI);

    /* */
    ECAP_startCounter(ECAP3_BASE);

    /* */
    ECAP_enableTimeStampCapture(ECAP3_BASE);

    /* restart ECAP3 */
    ECAP_reArm(ECAP3_BASE);

in the mu main loop, (66 us) i am reading the ecap1,2,3 and i compute the duty;

    /* store ecap1 reg if an event occurs */
    if (1 == ECap3Regs.ECFLG.bit.CEVT1)
    {
        /* Get counter at event1*/
        s_u32Tst1 = ECap3Regs.CAP1;

        /* Clear event */
        ECap3Regs.ECCLR.bit.CEVT1 = 1;
    }

    /* store ecap2 reg if an event occurs */
    if (1 == ECap3Regs.ECFLG.bit.CEVT2)
    {
        /* Get counter at event2 */
        s_u32Tst2 = ECap3Regs.CAP2;

        /* Clear event */
        ECap3Regs.ECCLR.bit.CEVT2 = 1;
    }

    /* store ecap3 reg if an event occurs */
    if (1 == ECap3Regs.ECFLG.bit.CEVT3)
    {
        /* Get counter at event3 */
        s_u32Tst3 = ECap3Regs.CAP3;

        /* Clear event */
        ECap3Regs.ECCLR.bit.CEVT3 = 1;
    }

    /* compute period */
    u32_Periode = s_u32Tst3 - s_u32Tst1;

    /* duty On */
    s_u32DutyOntime = s_u32Tst1 - s_u32Tst2;

    /* duty off */
 //   l_rDutyOfftime = ((float32)(s_u32Tst3 - s_u32Tst2)) * 100.0;



    if (0 != u32_Periode)
    {

        s_uDutyOfftime = (s_u32DutyOntime/u32_Periode)*100;

   //     l_rDutyOfftime = l_rDutyOfftime/u32_Periode;
    }

    if (100u > s_uDutyOfftime && 0u < s_uDutyOfftime )
    {

        /* duty on */
        *p_prDutyOn = s_uDutyOfftime;

    }


    /* duty off*/
    *p_prDutyOff = 0;

the input signal frequency is 200Hz,

I cant calculate the duty and i am asking if something wrong with my code?

thank you in advance,

S.tarik,