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.

TMS320F280025C: TMS320F280025C

Part Number: TMS320F280025C

We have two below questions;

  1. While capturing PWM of one controller with ECAP module on another controller with same clock (100 MHZ), we are getting around 100 HZ difference in actual value of PWM frequency and captured one with ECAP.

We are using ECAP in delta with triggers on rising and falling edge to capture PWM Frequency and Duty Cycle.

 

Can you please help us to know the reason, why we are getting frequency value with 100Hz difference on ECAP?

 

  1. We want to capture the time difference between PWM generation on one controller and the ECAP ISR on another controller. Do you suggest any quick solution to measure time difference between the events on two different controllers except using GPIO pins?
  • Hi Yogini,

    What frequency are you measuring and is the eCAP outputting a higher or lower frequency from your target?

  • Hello Frank,

    Thank you for your response. We want to configure PWM in the range from 30Khz to 200Khz. Currently, for testing , we have kept frequency of PWM to 81KHz. Actual calculated freq for PWM is 81037 , and we are able to observe the same on CRO when measured.

    But with ECAP, it is capturing value as 81168 , for same PWM.

    We have two controllers, we are generating PWM on one controller and capturing the same on ECAP of another controller.

    sysclock = 100MHz,

    ECAP is in continuous delta mode with interrupt at event 1. (even by setting interrupt on event 3 and event 4 it is giving same error.)

  • Hi Yogini,

    Since you are measuring frequency and duty cycle, you must be capturing 3 events (Rise->Fall->Rise or Fall->Rise->Fall) and interrupting on the 3rd event. Can you confirm? Better yet, please provide your ECAP configuration code so I can see if it's fine. 

  • Hello Frank,

    below is the ecap configuration we are using;

    // 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));


    // Disable CAP1-CAP4 register loads

    ECAP_disableTimeStampCapture(ECAP1_BASE);


    // Configure eCAP
    // Enable capture mode.
    // Continuous mode, stop capture at event 4.
    // Set polarity of the events to rising edge.
    // Set capture in time difference mode.
    // Select input from XBAR7.(TBC)
    // Enable eCAP module.
    // Enable interrupt.

    ECAP_stopCounter(ECAP1_BASE);
    ECAP_enableCaptureMode(ECAP1_BASE);

    ECAP_setCaptureMode(ECAP1_BASE, ECAP_CONTINUOUS_CAPTURE_MODE, ECAP_EVENT_4);

    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);

    ECAP_enableCounterResetOnEvent(ECAP1_BASE, ECAP_EVENT_1);
    ECAP_enableCounterResetOnEvent(ECAP1_BASE, ECAP_EVENT_2);
    ECAP_enableCounterResetOnEvent(ECAP1_BASE, ECAP_EVENT_3);
    ECAP_enableCounterResetOnEvent(ECAP1_BASE, ECAP_EVENT_4);

    //GPIO16 for ecap
    XBAR_setInputPin(INPUTXBAR_BASE, XBAR_INPUT7, 16);

    ECAP_enableLoadCounter(ECAP1_BASE);
    //ECAP_setSyncOutMode(ECAP1_BASE, ECAP_SYNC_OUT_SYNCI);

    ECAP_setSyncOutMode(ECAP1_BASE, ECAP_SYNC_OUT_DISABLED);
    ECAP_setSyncInPulseSource(ECAP1_BASE, ECAP_SYNC_IN_PULSE_SRC_DISABLE);

    ECAP_startCounter(ECAP1_BASE);
    ECAP_enableTimeStampCapture(ECAP1_BASE);
    //ECAP_reArm(ECAP1_BASE); //won't be needed in continuous capture mode

    ECAP_enableInterrupt(ECAP1_BASE, ECAP_ISR_SOURCE_CAPTURE_EVENT_1);

    // Configure GPIO 16 as eCAP input //

    XBAR_setInputPin(INPUTXBAR_BASE,XBAR_INPUT7, 16);
    GPIO_setPinConfig(GPIO_16_GPIO16);
    GPIO_setDirectionMode(16, GPIO_DIR_MODE_IN);
    GPIO_setQualificationMode(16, GPIO_QUAL_ASYNC);

    Also, We are referring the document ,SPRU807B 

    Page number: 34; 7.4: Example 4

  • Hello Frank,

    below is the ecap configuration we are using;

    // 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));


    // Disable CAP1-CAP4 register loads

    ECAP_disableTimeStampCapture(ECAP1_BASE);


    // Configure eCAP
    // Enable capture mode.
    // Continuous mode, stop capture at event 4.
    // Set polarity of the events to rising edge.
    // Set capture in time difference mode.
    // Select input from XBAR7.(TBC)
    // Enable eCAP module.
    // Enable interrupt.

    ECAP_stopCounter(ECAP1_BASE);
    ECAP_enableCaptureMode(ECAP1_BASE);

    ECAP_setCaptureMode(ECAP1_BASE, ECAP_CONTINUOUS_CAPTURE_MODE, ECAP_EVENT_4);

    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);

    ECAP_enableCounterResetOnEvent(ECAP1_BASE, ECAP_EVENT_1);
    ECAP_enableCounterResetOnEvent(ECAP1_BASE, ECAP_EVENT_2);
    ECAP_enableCounterResetOnEvent(ECAP1_BASE, ECAP_EVENT_3);
    ECAP_enableCounterResetOnEvent(ECAP1_BASE, ECAP_EVENT_4);

    //GPIO16 for ecap
    XBAR_setInputPin(INPUTXBAR_BASE, XBAR_INPUT7, 16);

    ECAP_enableLoadCounter(ECAP1_BASE);
    //ECAP_setSyncOutMode(ECAP1_BASE, ECAP_SYNC_OUT_SYNCI);

    ECAP_setSyncOutMode(ECAP1_BASE, ECAP_SYNC_OUT_DISABLED);
    ECAP_setSyncInPulseSource(ECAP1_BASE, ECAP_SYNC_IN_PULSE_SRC_DISABLE);

    ECAP_startCounter(ECAP1_BASE);
    ECAP_enableTimeStampCapture(ECAP1_BASE);
    //ECAP_reArm(ECAP1_BASE); //won't be needed in continuous capture mode

    ECAP_enableInterrupt(ECAP1_BASE, ECAP_ISR_SOURCE_CAPTURE_EVENT_1);

    // Configure GPIO 16 as eCAP input //

    XBAR_setInputPin(INPUTXBAR_BASE,XBAR_INPUT7, 16);
    GPIO_setPinConfig(GPIO_16_GPIO16);
    GPIO_setDirectionMode(16, GPIO_DIR_MODE_IN);
    GPIO_setQualificationMode(16, GPIO_QUAL_ASYNC);

    Also, We are referring the document ,SPRU807B 

    Page number: 34; 7.4: Example 4

  • Hi Yogini,

    Thanks for providing the code. I see you are capturing 4 events. Instead of generating the interrupt on EVENT1, please generate on EVENT4 and report back the contents of CAP1-4. Also for the purposes of debug, please change the code to do one-shot mode. You can re-arm in the ISR to keep it going.