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,