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.

[参考译文] TMS320F28377S:ECAP 时间戳采集值会发生变化

Guru**** 2468460 points


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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1418902/tms320f28377s-ecap-time-stamp-capture-values-are-varying

器件型号:TMS320F28377S

工具与软件:

你(们)好  

我在这里配置了 ECAP1来测量 EPWM9的周期值、这是我用于应用的示例代码的修改版本。

void initEPWM()

//
//禁用 SYNC (还冻结了 PWM 的时钟)
//
SYSCTL_disablePeripheral (SYSCTL_PERIPH_CLK_TBCLKSYNC);

//
//配置 ePWM
//计数器以递增计数模式运行。
//动作限定器将在周期匹配时切换输出
//
EPWM_setTimeBaseCounterMode (EPWM9_BASE、EPWM_COUNTER_MODE_UP);
EPWM_setTimeBasePeriod (EPWM9_BASE、1000);
EPWM_setPhaseShift (EPWM9_BASE、0U);
/**
*设置阴影
*/
EPWM_setCounterCompareShadowLoadMode (EPWM9_BASE、
epwm_counter_compare_A、
EPWM_COMP_LOAD_ON_CNTR_ZERO);
/**
*设置比较值
*/
// 1.667us 时钟脉冲宽度
EPWM_setCounterCompareValue (EPWM9_BASE、
epwm_counter_compare_A、
400);
EPWM_setActionQualifierAction (EPWM9_BASE、
EPWM_AQ_OUTPUT_A、
EPWM_AQ_OUTPUT_HIGH、
EPWM_AQ_OUTPUT_ON_TIMEBASE_UP_CMPA);
EPWM_setActionQualifierAction (EPWM9_BASE、
EPWM_AQ_OUTPUT_A、
EPWM_AQ_OUTPUT_LOW、
EPWM_AQ_OUTPUT_ON_TIMEBASE_ZERO);
EPWM_setClockPrescaler (EPWM9_BASE、
epwm_clock_divider_1、
EPWM_HSCLOCK_DIVIDER_1);

//epwm3TimerDirection = ePWM_TIMER_UP;

//
//启用 SYNC 和时钟到 PWM
//
SYSCTL_enablePeripheral (SYSCTL_PERIPH_CLK_TBCLKSYNC);
}

//
// initECAP -配置 eCAP
//
void initECAP()

//
//禁用、清除所有捕获标志和中断
//
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);

//
//禁用 CAP1-CAP4寄存器加载
//
ECAP_disableTimeStampCapture (ECAP1_BASE);

//
//配置 eCAP
//启用捕获模式。
//单次触发模式、在事件4时停止捕捉。
//将事件的极性设置为上升沿、下降沿、上升沿、下降沿。
//在时间差模式下设置捕获。
//从 XBAR7选择输入。
//启用 eCAP 模块。
//启用中断。
//
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_FALLING_EDGE);
ECAP_setEventPolarity (ECAP1_BASE、ECAP_EVENT_2、ECAP_EVNT_RISING_EDGE);
ECAP_setEventPolarity (ECAP1_BASE、ECAP_EVENT_3、ECAP_EVNT_FALLING_EDGE);
ECAP_setEventPolarity (ECAP1_BASE、ECAP_EVENT_4、ECAP_EVNT_RISING_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);

XBAR_setInputPin (XBAR_INPUT7、74);

ECAP_enableLoadCounter (ECAP1_BASE);
ECAP_setSyncOutMode (ECAP1_BASE、ECAP_SYNC_OUT_SYNCI);
ECAP_startCounter (ECAP1_BASE);
ECAP_enableTimeStampCapture (ECAP1_BASE);
ecap_rearm (ECAP1_BASE);

ECAP_enableInterrupt (ECAP1_BASE、ECAP_ISR_SOURCE_CAPTURE_EVENT_4);
}

//
// eCAP 1 ISR
//
_interrupt void ecap1ISR (void)

//
//获取捕获计数。 每次捕获应是 ePWM 计数的4倍
//因为 ePWM 时钟分频器。
//
cap1Count = ECAP_getEventTimeStamp (ECAP1_BASE、ECAP_EVENT_1);
cap2Count = ECAP_getEventTimeStamp (ECAP1_BASE、ECAP_EVENT_2);
cap3Count = ECAP_getEventTimeStamp (ECAP1_BASE、ECAP_EVENT_3);
cap4Count = ECAP_getEventTimeStamp (ECAP1_BASE、ECAP_EVENT_4);

//
//将周期值与捕获的计数进行比较
//
epwm3PeriodCount = ePWM_getTimeBasePeriod (EPWM9_BASE);

if (cap2Count >((epwm3PeriodCount * 4)+ 4)||
Cap2Count <((epwm3PeriodCount * 4)- 4))

error();
}

否则 if (cap3Count >(epwm3PeriodCount * 4)+ 4)||
cap3Count <((epwm3PeriodCount * 4)- 4))

error();
}

否则 if (cap4Count >((epwm3PeriodCount * 4)+ 4)||
cap4Count <((epwm3PeriodCount * 4)- 4))

error();
}
设计

标志= 0;
}

ecap1IntCount++;

时间戳捕获值读数正常。

在使用我的实际代码实现 ECAP1时我遇到了问题、ECAP1还有其他 ePWM 配置(epwm1、2、3)  

我使用 SyncOut SEL 模式来保持这些同步、因为它们需要进行一定的相移。

 时间戳的  值是不同的。

我想知道 SyncOut SEL 会影响通过 SYSCLK 计时的 ECAP TSCTR。

仅当我从 epwm1禁用 SyncOut SEL 配置时、才会获得正确的时间戳值。

我在参考手册中发现了这一点、我的理解是 ECAP 同步仅适用于其他 ECAP 模块、那么 SyncOut SEL 为何影响 ECAP

谢谢、此致

Rupa

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

    您好、Rupa、

    SYNCOUT 选择不影响 eCAP 的 TSCTR、因为 eCAP 处于捕捉模式。  

    此致!

    Ryan Ma

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

    您好、Ryan、

    是的、它不应影响 ECAP 的 TSCTR、但我的观察结果是:

    由于我使用的 ePWM 1会干扰 eCAP 时间戳捕获值、因此无法提供准确的捕获值。

    我禁用 EPWM1配置时、ECAP 时间戳捕获值读取正常。
    在这种情况下、问题可能是什么?

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

    您好、Rupa、  

    您能否仔细检查 eCAP 配置中的 ECCTL2.SYNCI_EN 寄存器值? 它是0吗? 这将禁用该 eCAP 的同步输入选项。 让我回顾一下我先前提到的内容。 如果您已禁用同步输入选项、SYNCOUT 选择不应影响 eCAP TSCTR。  如果您仍然看到相同的行为、可以尝试设置 SYNCSELECT。 ECAP1SYNCIN 来自不生成任何 SYNCOUT 的 PWM?

    此致!

    Ryan Ma

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

    由于我使用 driverlib 函数进行配置、我没有找到 SYNCI_EN、那么我是否 只需要使用 ECCTL2.SYNCI_EN 寄存器。  

    我曾尝试使用  SYNCSELECT。 ECAP1SYNCIN 则来自不同的采购源。 但当时我没有检查  ECCTL2.SYNCI_EN 寄存器配置。

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

    为了确保 eCAP TSCTR 不受 ePWM SyncOut 的影响、我要验证是否设置了寄存器 ECCT2.SYNCI_EN。 如果该位为0、则 ePWM 的 SyncOut 不应影响它。 但请验证这一点。

    此致!

    Ryan Ma