主题中讨论的其他器件: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
爱玛