主题中讨论的其他器件:C2000WARE
您好、
我的客户在机器中使用 F28075、最近他们想添加一个新功能、该功能使用 ECAP 来捕获方波。
波形为20Hz、它们处理500ms 周期计时器 ISR 中的捕捉值、因此两次进入 ISR 之间有10个波形。
它们使用绝对模式和单次触发模式、根据我的理解、它将在 u32TEST 中存储4个递增的数字(它们使用 u32test 0-3 以存储捕捉值1-4)、并在下一个 ISR 中重新 ARM。 但结果不符合我的预期。

这是 eCAP 的初始化代码。 我认为这可能是由 ECAP 的 SYNC 引起的、因此请禁用它、但没有效果。
void InitECapGpio()
{
GPIO_SetupPinMux(29, GPIO_MUX_CPU1, 0);
GPIO_SetupPinOptions(29, GPIO_INPUT, GPIO_PULLUP | GPIO_ASYNC);
XBAR_setInputPin(XBAR_INPUT7, 29); // Xbar7-eCAP1
}
/*
* Function: InitECap
* Parameter: None
* Return: None
* Description: Ecap初始化
* ____ ____ ____
* | | | | | |
* ____| |____| |____| |____
* ↑ ↓ ↑ ↓
* A B C D
*/
void InitECap(void)
{
InitECapGpio();
EALLOW;
SyncSocRegs.SYNCSELECT.bit.ECAP1SYNCIN = 6; // EXTSYNCIN2
EDIS;
XBAR_setInputPin(XBAR_INPUT6, 0XFF); // Xbar6 EXTSYNCIN2
//ECAP_setEventPrescaler(ECAP1_BASE,0x5);// 10分频
//
// Disable ,clear all capture flags and interrupts
//
// 关中断
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));
//
// Disable CAP1-CAP4 register loads
//
ECAP_disableTimeStampCapture(ECAP1_BASE);
//
// Configure eCAP
// Enable capture mode.
// One shot mode, stop capture at event 4.
// Set polarity of the events to rising, falling, rising, falling edge.
// //Set capture in time difference mode.绝对时间
// Select input from XBAR7.
// Enable eCAP module.
// Enable interrupt.
//
ECAP_stopCounter(ECAP1_BASE);
ECAP_enableCaptureMode(ECAP1_BASE); // 使能CAP模式
ECAP_setCaptureMode(ECAP1_BASE, ECAP_ONE_SHOT_CAPTURE_MODE, ECAP_EVENT_4);// 事件4后产生停止信号
// 捕捉沿选择
ECAP_setEventPolarity(ECAP1_BASE, ECAP_EVENT_1, ECAP_EVNT_RISING_EDGE);
ECAP_setEventPolarity(ECAP1_BASE, ECAP_EVENT_2, ECAP_EVNT_FALLING_EDGE);
ECAP_setEventPolarity(ECAP1_BASE, ECAP_EVENT_3, ECAP_EVNT_RISING_EDGE);
ECAP_setEventPolarity(ECAP1_BASE, ECAP_EVENT_4, ECAP_EVNT_FALLING_EDGE);
// 重置计数器
// ECAP_enableCounterResetOnEvent(ECAP1_BASE, ECAP_EVENT_1);// 事件1重置计数器
// ECAP_enableCounterResetOnEvent(ECAP1_BASE, ECAP_EVENT_2);
// ECAP_enableCounterResetOnEvent(ECAP1_BASE, ECAP_EVENT_3);
// ECAP_enableCounterResetOnEvent(ECAP1_BASE, ECAP_EVENT_4);
ECAP_disableLoadCounter(ECAP1_BASE);
ECAP_setSyncOutMode(ECAP1_BASE, ECAP_SYNC_OUT_SYNCI);
EALLOW;
CpuSysRegs.PCLKCR3.bit.ECAP1 = 1;
EDIS;
ECAP_startCounter(ECAP1_BASE); // TSCTR开始计数
ECAP_enableTimeStampCapture(ECAP1_BASE);// 启用在捕获事件上加载CAP1-4寄存器
ECAP_reArm(ECAP1_BASE); // Mod4重新装载
}
这是2Hz 计时器 ISR 中的运行时代码。
float32 CPLDVersionCheck(void)
{
Uint32 u32cap1Count = 0;
Uint32 u32cap2Count = 0;
Uint32 u32cap3Count = 0;
Uint32 u32cap4Count = 0;
float32 f32Period = 0.0f;
float32 f32PeriodHigh = 0.0f;
static float32 f32DutySave = 0.0f;
static float32 f32DutySave1 = 0.0f;
u32cap1Count = ECAP_getEventTimeStamp(ECAP1_BASE, ECAP_EVENT_1);
u32cap2Count = ECAP_getEventTimeStamp(ECAP1_BASE, ECAP_EVENT_2);
u32cap3Count = ECAP_getEventTimeStamp(ECAP1_BASE, ECAP_EVENT_3);
u32cap4Count = ECAP_getEventTimeStamp(ECAP1_BASE, ECAP_EVENT_4);
if((u32cap4Count > u32cap3Count) && (u32cap3Count > u32cap2Count) && (u32cap2Count > u32cap1Count))
{
f32PeriodHigh = (float32)(u32cap2Count-u32cap1Count); // 高电平时间
f32Period = (float32)(u32cap3Count-u32cap1Count); // 周期时间
// // 计算占空比
f32DutySave = f32PeriodHigh / f32Period;
}
ECap1Regs.TSCTR = 0; //时钟清零
ECAP_enableTimeStampCapture(ECAP1_BASE);// Enables time stamp capture
ECAP_reArm(ECAP1_BASE); // Mod4重新装载
ECAP_startCounter(ECAP1_BASE); // TSCTR开始计数
return f32DutySave;
}
由于我没有控制卡也没有 EVM 测试、但我确认这是软件问题、您能指出为什么会发生这种情况以及如何更改它吗?
Br
爱玛



