工具与软件:
你(们)好
我在这里配置了 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

