我们使用 eCAP 模块来测量电网电压的频率。 使用具有迟滞功能的比较器将电网电压转换为方波。 在初始测试中、我们将从函数发生器提供干净的方波。 方波的频率为50Hz、即时间周期为20000 μ s。 由于控制器以100MHz 频率运行、带有20MHz 外部晶振、因此我们假设 eCAP 分辨率为10nsec。 因此、eCAP 计数器测量值应该大约为2000000。 但是实际读数大约为20000230。 这是大约2.3 u 秒的大误差。 请指导我了解此错误的可能原因以及如何改进。 在进行编码时、我参考了 C2000 ware 中的示例项目。
eCAP 模块的配置代码如下:
void eCAP_init()
{
//
// 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);
ECAP_stopCounter(ECAP1_BASE); //Counter is stopped
ECAP_enableCaptureMode(ECAP1_BASE); //Capture mode enabled
ECAP_setCaptureMode(ECAP1_BASE, ECAP_CONTINUOUS_CAPTURE_MODE, ECAP_EVENT_1);
ECAP_setEventPolarity(ECAP1_BASE, ECAP_EVENT_1, ECAP_EVNT_RISING_EDGE);
ECAP_enableCounterResetOnEvent(ECAP1_BASE, ECAP_EVENT_1);
ECAP_selectECAPInput(ECAP1_BASE,ECAP_INPUT_INPUTXBAR4);
ECAP_enableLoadCounter(ECAP1_BASE);
ECAP_setSyncOutMode(ECAP1_BASE, ECAP_SYNC_OUT_DISABLED);
ECAP_startCounter(ECAP1_BASE);
ECAP_enableTimeStampCapture(ECAP1_BASE);
ECAP_reArm(ECAP1_BASE);
ECAP_enableInterrupt(ECAP1_BASE, ECAP_ISR_SOURCE_CAPTURE_EVENT_1);
}
在捕获事件1 ISR 中测量计数器值、如下所示:
__interrupt void
ecap1ISR(void)
{
GPIO_togglePin(6);
Freq_Count = ECAP_getEventTimeStamp(ECAP1_BASE, ECAP_EVENT_1); //Counter value at next falling edge
//
// Clear interrupt flags for more interrupts.
//
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));
ECAP_clearGlobalInterrupt(ECAP1_BASE);
// Start eCAP
ECAP_reArm(ECAP1_BASE); //CHECK IF RE-ARMING IS REQUIRED
// Acknowledge the group interrupt for more interrupts.
Interrupt_clearACKGroup(INTERRUPT_ACK_GROUP4);
}
GPIO 配置如下:
GPIO_setDirectionMode (JEM_FREQ_Measure、GPIO_DIR_MODE_IN);
GPIO_setPadConfig (JEM_FREQ_Measure、GPIO_PIN_TYPE_PULLUP);
GPIO_setQualificationMode (JEM_FREQ_Measure、GPIO_QUAL_6SAMPLE);
如果需要更多信息来诊断问题、请告诉我。