Part Number: TMS320F28075
Other Parts Discussed in Thread: C2000WARE
Hi expert,
My customer is using F28075 in a machine and recently they want to add a new function, which uses ECAP to capture the square waveform.
The waveform is 20Hz and they deal with the capture value in a 500ms period timer ISR, so there are 10 waveforms between two times of entering the ISR.
They use the absolute mode with one shot mode, so in my understanding, it will store 4 increasing numbers in u32TEST (They use u32test 0-3 to store capture value 1-4)and re-arm in next ISR. But the result is not under my expectation.

here is the init code for ECAP. I think it could be caused by sync for ECAP, so disable it but no effect.
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重新装载
}
here is the run time code in 2Hz timer 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;
}
Since I do not have a control card and did not do EVM test, but I confirm it is a software issue, could you kindly point out why will this happen and how to change it?
BR
Emma



