This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] TMS320F280025:eCAP 的测量误差

Guru**** 2463330 points
Other Parts Discussed in Thread: TMS320F280025C

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1051358/tms320f280025-measurement-error-with-ecap

器件型号:TMS320F280025

我们使用 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);

如果需要更多信息来诊断问题、请告诉我。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Asad、

    您将需要捕获2个事件、而不是1个事件。 由于您只是希望测量频率、因此可以设置2个事件来捕获2个上升沿或2个下降沿。 使用 delta 模式、以便捕获第二个事件的频率。 请告诉我们这是否不清楚。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Frank:  

    我将尝试根据您的建议使用两个事件。 在 ECAP 配置中、我已将计数器值设置为在上升沿清零、因此我期望下一个上升沿包含最后一个周期的时间周期。 请告诉我这种方法不起作用的原因。

    请就频率测量的另一个方面提供建议:我正在更新每个 ECAP 上升事件的频率值。 如果突然断开连接、则不应再发生 ECAP 上升事件。 频率测量会冻结至最后一个测量值。 我是否应该寻找一些计数器溢出来使频率为零或任何更好的方法?  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Frank:

      我尝试使用两个事件、但结果保持不变。 我认为、由于计数器在上升事件中被复位、我的原始配置已经设置为差分测量。 我对两个外部信号进行了一些观察、如下所示:

    外部50Hz 信号上的读数:
    频率 计数器:2000219
    频率 计数器:2000219
    频率 计数器:2000219
    频率 计数器:2000219
    频率 计数器:2000220
    频率 计数器:2000219
    频率 计数器:2000219
    频率 计数器:2000219
    频率 计数器:2000219
    频率 计数器:2000219
    频率 柜台:1999791
    频率 计数器:2000219
    频率 计数器:2000219
    频率 计数器:2000219
    频率 计数器:2000219
    频率 柜台:1999791
    频率 计数器:2000219
    频率 计数器:2000219
    频率 计数器:2000219
    频率 计数器:2000219
    频率 计数器:2000219
    频率 计数器:2000219
    频率 计数器:2000219
    频率 计数器:2000219
    频率 计数器:2000219

    外部60Hz 信号的读数:
    频率 计数器:1666811
    频率 计数器:1666812
    频率 计数器:1666812
    频率 计数器:1666811
    频率 计数器:1666811
    频率 计数器:1666812
    频率 计数器:1666812
    频率 计数器:1666811
    频率 计数器:1666812
    频率 计数器:1666811
    频率 计数器:1666811
    频率 计数器:1666811
    频率 计数器:1666811
    频率 计数器:1666812
    频率 计数器:1666812
    频率 计数器:1666812
    频率 计数器:1666812
    频率 计数器:1666812
    频率 计数器:1666812
    频率 计数器:1666812
    频率 计数器:1666811
    频率 计数器:1666812
    频率 计数器:1666812
    频率 计数器:1666811
    频率 计数器:1666812
    频率 计数器:1666811
    频率 计数器:1666812
    频率 计数器:1666812
    频率 计数器:1666812
    频率 计数器:1666811
    频率 计数器:1666812

    因此、有一个来自两个外部测量的修复错误。 为了验证我的配置是否正确、我从控制器生成了一个20KHz 的波形并捕获了它的时间周期。  读数如下所示。

    自生成20KHz PWM 上的读数
    频率 柜台:4999
    频率 柜台:4999
    频率 柜台:4999
    频率 柜台:4999
    频率 柜台:4999
    频率 柜台:4999
    频率 柜台:4999
    频率 柜台:4999
    频率 柜台:4999
    频率 柜台:4999
    频率 柜台:4999
    频率 柜台:4999
    频率 柜台:4999
    频率 柜台:4999
    频率 柜台:4999
    频率 柜台:4999
    频率 柜台:4999
    频率 柜台:4999
    频率 柜台:4999
    频率 柜台:4999
    频率 柜台:4999
    频率 柜台:4999
    频率 柜台:4999
    频率 柜台:4999

    上述读数非常精确、即49.99 μ s、而无误差值为50.00 μ s。 外部方波发生器(Digilent 模拟发现模块修订版 C)或 TMS320F280025C LaunchPad 时钟出现错误。 请分享您对这一问题和未来发展方向的看法。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Asad、

    [引用 userid="488051" URL"~/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1051358/tms320f280025-measurement-error-with-ecap/3889814 #3889814"]请提供有关频率测量的另一个方面的建议:我正在更新每个 ECAP 上升事件的频率值。 如果突然断开连接、则不应再发生 ECAP 上升事件。 频率测量会冻结至最后一个测量值。 我是否应该寻找一些计数器溢出来使频率为零或任何更好的方法?  [/报价]

    是的、eCAP 有一个溢出标志、您可以使用它来检查这个。

    [引用 userid="488051" URL"~/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1051358/tms320f280025-measurement-error-with-ecap/3889955 #3889955">因此两个外部测量值中存在修复错误。 为了验证我的配置是否正确、我从控制器生成了一个20KHz 的波形并捕获了它的时间周期。  读数如下所示。

    您是否已使用其他器件验证了这些外部测量? 可能是频率计数器还是示波器?

    [引用 userid="488051" URL"~/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1051358/tms320f280025-measurement-error-with-ecap/3889955 #3889955"]上述读数非常准确、即49.99 uec、而无误差值为50.00 uec。 外部方波发生器(Digilent 模拟发现模块修订版 C)或 TMS320F280025C LaunchPad 时钟出现错误。 请分享您对这方面和未来发展方向的看法。[/引述]

    请独立验证2。 您的外部方波发生器可能未校准。 您应该使用示波器或频率计数器来验证它。 LaunchPad 使用晶体、频率不应存在如此大的变化、但您可以通过在 XCLKOUT 上输出系统时钟并进行测量来验证 LaunchPad 时钟。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Frank:

      我知道、当计数器达到2^32时、会发生溢出。 这是一个较大的延时2^32 * 10 nsec = 42.949秒。 我们要求在最多两个周期内检测电网损耗、即最大40毫秒@ 50Hz。 为了实现这一点、我使用了一个设置为在25毫秒时溢出的计时器。 在 ECAP ISR 中、我将清除计时器、以便不会发生溢出。 然而、在频率信号突然丢失的情况下、ECAP ISR 将不会发生、这样定时器就会溢出。 当计时器溢出时、我将频率设置为零。 如果使用 eCAP 溢出将是更有效的方法、请指导如何通过它实现40毫秒的时间限制。

    我已经就你的建议进行了研究,以便独立地比较两个来源。 我已经尝试使用外部示波器测量信号发生器的输出以及 Launchpad 的 PWM 时间周期。 两个信号似乎都是准确定时的。 让我也按照您的建议检查 XCLKOUT 信号。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [引用 userid="488051" URL"~/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1051358/tms320f280025-measurement-error-with-ecap/3890699 #3890699"]  我知道当计数器达到2^32时将发生溢出。 这是一个较大的延时2^32 * 10 nsec = 42.949秒。 我们要求在最多两个周期内检测电网损耗、即最大40毫秒@ 50Hz。 为了实现这一点、我使用了一个设置为在25毫秒时溢出的计时器。 在 ECAP ISR 中、我将清除计时器、以便不会发生溢出。 然而、在频率信号突然丢失的情况下、ECAP ISR 将不会发生、这样定时器就会溢出。 当计时器溢出时、我将频率设置为零。 如果使用 eCAP 溢出将是更有效的方法、并且如何通过它实现40毫秒的时间限制、请提供指导。

    我知道。 在这种情况下、您的解决方案很好。

    [引用 userid="488051" URL"~/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1051358/tms320f280025-measurement-error-with-ecap/3890699 #3890699"]我已经考虑过您的建议,可以独立比较两个源。 我已经尝试使用外部示波器测量信号发生器的输出以及 Launchpad 的 PWM 时间周期。 两个信号似乎都是准确定时的。 让我也按照您的建议检查 XCLKOUT 信号。[/QUERP]

    由于您已经验证了 PWM 频率、这间接验证了系统时钟、因此无需检查 XCLKOUT。 尝试一个实验:使用 PWM 生成50Hz 方波并将其馈送到 ECAP、以查看您是否获得正确的结果。