“线程”中讨论的其它部件: LAUNHXL-F28379D, SN74LS14, AMC1200
大家好,
我希望使用 TMS320F28379D 的 cmpss 和 ECAP 模块来测量网格频率,但准确度存在一些问题。
首先,我用一台函数发生器开始工作。 我注意到,如果输入信号为方波(50Hz),则测量工作正常(误差约为±3MHz),如果将其更改为正弦波信号,则误差会增加很多(形式为±20至±50 MHz)。 我也尝试测量网格频率(可能是与函数发生器的连接不稳定),结果几乎相同。 我还尝试更改滤波器和滞后参数,但我没有找到解决方案。
我认为我做了一些错误的事情,因为周边地区的速度非常快,我必须测量的频率也不是很高,所以我正在寻找一些帮助。 或者可能需要一些外部筛选器或其他东西(我认为不是这样)?
下面是代码的简要描述:
输入信号到达 ADCA4引脚,用作 CMPSSS (CMPSS2 Hight),滞后和数字滤波器均已配置。 对于 DAC,它配置了一个与0不同的值,以避免接近零 的振荡。
void initCMPSS(void) { CMPSS_enableModule(CMPSS2_BASE); CMPSS_configHighComparator(CMPSS2_BASE, CMPSS_INSRC_DAC); CMPSS_configDAC(CMPSS2_BASE, CMPSS_DACREF_VDDA | CMPSS_DACVAL_SYSCLK | CMPSS_DACSRC_SHDW); CMPSS_setDACValueHigh(CMPSS2_BASE, 2365); CMPSS_setHysteresis(CMPSS2_BASE,4); CMPSS_configFilterHigh(CMPSS2_BASE, 0x3FF, 32, 31); CMPSS_initFilterHigh(CMPSS2_BASE); CMPSS_configOutputsHigh(CMPSS2_BASE, CMPSS_TRIP_FILTER | CMPSS_TRIPOUT_FILTER); XBAR_setOutputMuxConfig(XBAR_OUTPUT3, XBAR_OUT_MUX02_CMPSS2_CTRIPOUTH); XBAR_enableOutputMux(XBAR_OUTPUT3, XBAR_MUX02); }
从 CMPSSS 输出到 xbar3,其中连接了 GPIO (14),并通过此接口传递给 ECAP。 通过 GPIO 14 I,我还可以监控 ECAP 的输出方波(在正弦波的情况下,这似乎有点“干扰”)。
ECAP 配置为一个注射模式并捕获2个事件(一个下降边缘和一个上升边缘),ISR 连接到第二个事件。 每次 ISR 呼叫时,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)); ECAP_disableTimeStampCapture(ECAP1_BASE); ECAP_stopCounter(ECAP1_BASE); ECAP_enableCaptureMode(ECAP1_BASE); ECAP_setEventPrescaler(ECAP1_BASE,0); ECAP_setCaptureMode(ECAP1_BASE, ECAP_ONE_SHOT_CAPTURE_MODE, ECAP_EVENT_2); ECAP_setEventPolarity(ECAP1_BASE, ECAP_EVENT_1, ECAP_EVNT_FALLING_EDGE); ECAP_setEventPolarity(ECAP1_BASE, ECAP_EVENT_2, ECAP_EVNT_RISING_EDGE); ECAP_enableCounterResetOnEvent(ECAP1_BASE, ECAP_EVENT_2); XBAR_setInputPin(XBAR_INPUT7, 14); 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_2); }
__interrupt void ecap1ISR(void) { cap1Count = ECAP_getEventTimeStamp(ECAP1_BASE, ECAP_EVENT_1); cap2Count = ECAP_getEventTimeStamp(ECAP1_BASE, ECAP_EVENT_2); ECAP_clearInterrupt(ECAP1_BASE,ECAP_ISR_SOURCE_CAPTURE_EVENT_2); ECAP_clearGlobalInterrupt(ECAP1_BASE); ECAP_reArm(ECAP1_BASE); Interrupt_clearACKGroup(INTERRUPT_ACK_GROUP4); }
在 ISR 之后,我通过将时钟(200MHz)除以 cap2Count 值来计算频率。 我在调试模式下检查了是否可能是计算错误,但 ECAP 计数器与预期值有太大的区别(对于 cap2Count,我期望值为4000000,但它与 ±4000不同,因为错误 值为±50MHz)。
提前感谢你,盖塔诺。
PS。 这是我的第一个帖子,我希望我没有犯错。