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.

[参考译文] LAUNCHXL-F28379D:ECAP Delta 时序

Guru**** 2032800 points
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/765994/launchxl-f28379d-ecap-delta-timing

器件型号:LAUNCHXL-F28379D

我想使用处于 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); 

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Curtis、

    查看第36-39行、您的代码正在设置为执行绝对模式时间捕获、而不是增量时间。 您需要使用函数调用"ecap_enableCounterResetOnEvent"。 是的、如果您不使用预分频、则可以通过除以以 Hz 而不是 MHz 的 CPU 频率来获得以秒为单位的时间。