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,