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.
我想使用处于 delta 模式的 ECAP 来捕获具有上升沿和下降沿检测功能的时间戳、如 http://www.ti.com/lit/ug/sprug79/sprug79.pdf 中所述
// //禁用,清除所有捕获标志和中断 // ECAP_disableInterrupt (ECAP1_base、 (ECAP_ISR_SOURC_CAPTURE_EVENT_1 | ECAP_ISR_SOURC_CAPTURE_EVENT_2 | ECAP_ISR_SOURC_CAPTURE_EVENT_3 | ECAP_ISR_SOURC_CAPTURE_EVENT_4 | ECAP_ISR_SOURC_COUNTER_OVERflow | ECAP_ISR_SOURC_COUNTER_PERIOD | eCAP_ISR_SOURC_COUNTER_COMPARE); ECAP_clearInterrupt (ECAP1_base、 (ECAP_ISR_SOURC_CAPTURE_EVENT_1 | ECAP_ISR_SOURC_CAPTURE_EVENT_2 | ECAP_ISR_SOURC_CAPTURE_EVENT_3 | ECAP_ISR_SOURC_CAPTURE_EVENT_4 | ECAP_ISR_SOURC_COUNTER_OVERflow | ECAP_ISR_SOURC_COUNTER_PERIOD | ECAP_ISR_SOURCE COUNTER_COMPARTE); // ECAP1Regs.ECCTL1.bit.CAP1POL = ECAP_EVNT_RISING; // ECAP1Regs.ECCTL1.bit.CAP2POL = ECAP_EVNT_RISE_EDGE; // ECap1Regs.ECCTL1.bit.ECAP_ECC1POL = ECAP_LET.EACT_RISE_EDGE/ ECAP.LET.EACT_EDGEL = ECAP_EDGE/ ECAP_EACT_EACT_EDGEL = ECAP_EDGE_EDGE/ ECAP.EACT_EACT_EV ECAP_setEventPolarity (ECAP1_base、ECAP_EVENT_1、ECAP_EVNT_RISTING _EDGE); ECAP_setEventPolarity (ECAP1_base、ECAP_EVENT_2、ECAP_EVNT_FALLING_EDGE); ECAP_setEventPolarity (ECAP1_base、ECAP_EVENT_3、ECAP_EVNT_RISTING _EDGE); ECAP_setEventPolarity (ECAP1_base、ECAP_EVENT_4、ECAP_EVNT_FALLING_EDGE); // ECap1Regs.ECCTL1.bit.CTRRST1 = 1;//差分模式 // ECAP1Regs.ECCTL1.bit.CTRST2 = 1;//差分模式/ECAP1Regs.ECTR1.bit.ECCTL1 ;//差 分模式/ECTR1.EC1RCT1 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_CONTINUE_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++; // //清除更多中断的中断标志。 // ECAP_clearInterrupt (ECAP1_base、ECAP_ISR_SOURCE、CAPTURE_EVENT_1); ECAP_clearGlobalInterrupt (ECAP1_base); // //确认组中断以获得更多中断。 // INTERRUPT_clearACKGROUP (INTERRUPT_ACK_group4);
谢谢!
下面是完整的帖子:
我想使用处于 delta 模式的 ECAP 来捕获具有上升沿和下降沿检测 功能的时间戳、如第34页所述。 该参考提供了我已修改为 C2000 ECAP 库的代码片段。 占空比值继续从8、000、000增加到32位计数器的最大值、然后返回到8、000、000。
与该示例相比、调整后的代码中有哪些不正确之处? 一旦获得周期1和周期2、这些值是否代表计时器节拍? 如果是这样、为了获得以秒为单位的周期、我将把它除以200MHz 时钟值。
我在调整后的代码上方添加了参考代码片段。
ECAP 设置:
// //禁用,清除所有捕获标志和中断 // ECAP_disableInterrupt (ECAP1_base、 (ECAP_ISR_SOURC_CAPTURE_EVENT_1 | ECAP_ISR_SOURC_CAPTURE_EVENT_2 | ECAP_ISR_SOURC_CAPTURE_EVENT_3 | ECAP_ISR_SOURC_CAPTURE_EVENT_4 | ECAP_ISR_SOURC_COUNTER_OVERflow | ECAP_ISR_SOURC_COUNTER_PERIOD | eCAP_ISR_SOURC_COUNTER_COMPARE); ECAP_clearInterrupt (ECAP1_base、 (ECAP_ISR_SOURC_CAPTURE_EVENT_1 | ECAP_ISR_SOURC_CAPTURE_EVENT_2 | ECAP_ISR_SOURC_CAPTURE_EVENT_3 | ECAP_ISR_SOURC_CAPTURE_EVENT_4 | ECAP_ISR_SOURC_COUNTER_OVERflow | ECAP_ISR_SOURC_COUNTER_PERIOD | ECAP_ISR_SOURCE COUNTER_COMPARTE); // ECAP1Regs.ECCTL1.bit.CAP1POL = ECAP_EVNT_RISING; // ECAP1Regs.ECCTL1.bit.CAP2POL = ECAP_EVNT_RISE_EDGE; // ECap1Regs.ECCTL1.bit.ECAP_ECC1POL = ECAP_LET.EACT_RISE_EDGE/ ECAP.LET.EACT_EDGEL = ECAP_EDGE/ ECAP_EACT_EACT_EDGEL = ECAP_EDGE_EDGE/ ECAP.EACT_EACT_EV ECAP_setEventPolarity (ECAP1_base、ECAP_EVENT_1、ECAP_EVNT_RISTING _EDGE); ECAP_setEventPolarity (ECAP1_base、ECAP_EVENT_2、ECAP_EVNT_FALLING_EDGE); ECAP_setEventPolarity (ECAP1_base、ECAP_EVENT_3、ECAP_EVNT_RISTING _EDGE); ECAP_setEventPolarity (ECAP1_base、ECAP_EVENT_4、ECAP_EVNT_FALLING_EDGE); // ECap1Regs.ECCTL1.bit.CTRRST1 = 1;//差分模式 // ECAP1Regs.ECCTL1.bit.CTRST2 = 1;//差分模式/ECAP1Regs.ECTR1.bit.ECCTL1 ;//差 分模式/ECTR1.EC1RCT1 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_CONTINUE_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);
CEVT1上触发的 ISR:
// 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++; // //清除更多中断的中断标志。 // ECAP_clearInterrupt (ECAP1_base、ECAP_ISR_SOURCE、CAPTURE_EVENT_1); ECAP_clearGlobalInterrupt (ECAP1_base); // //确认组中断以获得更多中断。 // INTERRUPT_clearACKGROUP (INTERRUPT_ACK_group4);