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.

[参考译文] TMS320F28P550SJ:需要在同一引脚上使用比较器和 ADC 的示例代码。

Guru**** 2874030 points

Other Parts Discussed in Thread: TMS320F28P550SJ, C2000WARE

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1633138/tms320f28p550sj-need-an-example-code-using-comparator-and-adc-at-same-pin

器件型号: TMS320F28P550SJ
主题: C2000WARE 中讨论的其他器件

您好团队、  

我将 TMS320F28P550 MCU 用于太阳能应用。这是 80 引脚封装。 我希望同时使用 ADC 和比较器:我使用 ADC A4 测量交流电压。 请分享使用 ADC 与 COMP 进行频率测量的示例代码。

 

此致、

Atul Kaushik

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

    您好、Atul、

    对假日周末的延迟回复表示歉意

    我需要有关您在此处所需内容的更多信息。 只需使用 ADC 或 CMPSS 即可实现频率测量。  我们为 ADC 和 CMPSS 外设提供了示例代码、以展示特定用例或外设特性。 F28P550x 器件的模拟通道通过这种方式实现、引脚上的模拟信号始终通过硬接线连接到该引脚上也可用的所有相关模拟外设。 这只是相关模拟外设是否配置为将相关模拟引脚用作它们使用的源这一问题而已。

    期待在获得更多详细信息后为您提供进一步帮助。

    此致、

    Zackary Fleenor

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

    嗨、Atul、

    刚办理登机手续、您是否有任何来自您的其他更新?

    此致、

    Zackary Fleenor

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

    尊敬的 Fleenor:

    感谢您的意见。

    电网交流信号连接在 A4 ADC 引脚上。 RMS 电压测量中使用的信号相同。 现在、我需要测量连接在 A4 处的电网信号的频率。 为此 、我想使用内部比较器来生成 ZCD。 现在我有几个问题  

    1.是否可以从内部比较器生成 ZCD ?

    2.可以在比较器和 ECAP 之间进行内部连接吗? 如果是、请分享如何实现这一点、因为我知道如何使用 GPIO 进行连接、但它不适用于我的用例。  

    因此、我的用例就是这样

    A4 ADC===>>CMPSS====>>ECAP。

    所有连接均为内部连接、无需外部连接。

    此致、

    Atul Kaushik

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

    尊敬的 Atul:

    是的、您所需的信号路径 A4→CMPSS→ECAP(全部内部使用) TMS320F28P550SJ 可实现的瞬态响应。 以下是每个作品的工作原理:

    A4 引脚→ADC + CMPSS 同时

    A4 上的模拟信号为 硬接线到 ADC 和 CMPSS 输入 —无需配置即可“共享“引脚[1][2]。 您可以使用 ADC 对 A4 进行采样以进行 RMS 电压测量、同时使用 CMPSS 进行过零检测。 具体来说、根据 TRM 中的表 14-4、 CMPSS-2 HP 输入多路复用器 (HPMXSEL0) 选择通道 A4 [1]。

    2.用于过零检测 (ZCD) 的 CMPSS

    是、内部比较器可以生成 ZCD。 按如下方式配置 CMPSS-2:

    • 设置 正输入多路复用器 选择 A4(网格信号)
    • 配置 内部 12 位 DAC 设置为过零阈值(已缩放交流信号的直流偏置点)作为负基准
    • 启用 滤波器 对过零附近的噪声进行去抖[3][4]
    • 比较器输出 CTRIPOUTH/CTRIPOUTL 在每次过零时切换的信号

    内部 CMPSS→ECAP 通过 X-BAR 布线

    这是避免外部 GPIO 连接的关键。 TMS320F28P55x 包含 X-BAR(交叉开关)互连系统 用于在内部将 CMPSS 输出路由到包括 eCAP 在内的其他外设[5]:

    • CMPSS 输出 (CTRIPOUTH、CTRIPOUTL、CTRIPH、CTRIPL) 作为输入源馈入 X-BAR [5]
    • 输入 X-BAR 可以将这些信号路由到 eCAP 输入、无需通过物理 GPIO 引脚

    配置流程:

    1. 将 CMPSS-2 配置为 A4 作为输入、将 DAC 配置为过零阈值
    2. 使用XBAR_setInputPin()或等效输入 X-BAR 寄存器将 CMPSS-2 跳闸输出连接到 eCAP 输入
    3. 将 eCAP 配置为捕获模式以测量连续过零之间的周期→这将提供电网频率

    示例代码起点

    我们不会为此具体用例提供单个组合 ADC+CMPSS+ECAP 示例、但 C2000Ware 包含相关的构建块[3][4]:

    • cmpss_ex1_asynch.c—演示使用内部 DAC 作为基准的 CMPSS 配置、并将 CTRIPOUTH 路由至输出 X-BAR [3]
    • cmpss_ex2_digital_filter.c—显示了比较器输出上用于抑制噪声的数字滤波器配置[4]

    您需要通过以下方式调整这些设置:

    • 更改 CMPSS 输入多路复用器以选择 A4
    • 将 CMPSS 输出路由至 输入 X-BAR eCAP 模块、而不是输出 X-BAR/GPIO
    • 配置 eCAP 以捕获周期测量的上升沿/下降沿

    此外、 Power_MEAS_SINE_ANALYZER C2000Ware DigitalPower SDK 中的库提供了一种基于软件的电网频率测量方法、使用具有基于阈值的过零检测功能的 ADC 样本、可用作互补或替代方法[6]。


    为了帮助完善这项建议、了解以下信息会有所帮助:

    • 您计划使用哪些特定输入 X-BAR 实例和 eCAP 模块(这决定了确切的寄存器配置)
    • 无论您是需要高侧比较器 (CTRIPH) 还是低侧 (CTRIPL) 来实现过零、这取决于交流信号是上升还是下降超过 DAC 阈值
    • 您的网格频率 (50Hz 或 60Hz)—这会影响推荐的数字滤波器设置
    • 调整后的栅格信号在 A4 处的直流偏置和振幅、以正确设置 DAC 阈值

    资源:

    1. TMS320F28P559SJ-Q1:模拟子系统连接配置 (E2E)
    2. TMS320F28P55x 技术参考手册 — 模拟子系统方框图
    3. TMS320F28P55x TRM - CMPSS 异步跳闸示例
    4. TMS320F28P55x TRM - CMPSS 数字滤波器示例
    5. TMS320F28P55x TRM - X-BAR 输入源
    6. POWER_MEAS_SINE_ANALYZER 库文档

    此致、

    Zackary Fleenor

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

    尊敬的 Fleenor:

    感谢您的意见。

    我能够做到这一点。

    此致、

    Atul Kaushik

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

    尊敬的 Fleenor:

    很抱歉重新打开此主题。

    现在、我有以下配置  

    A4 >> CMPSS2>>ECAP1

    ADC 引脚 A4 连接到 CMPSS2。 CMPSS2 的输出到 ECAP1 的输入。 我遵循 CMPSS 和 ECAP 的代码。 我不使用 OUTXBAR 和 INPUTXBAR。 我面临的问题是  

    1.我持续接收 ECAP 上的中断、而不在 A4 引脚上发出信号。

    请检查下面的 ECAP 和 CMPSS 配置并建议。

    也检查我的回答你的查询. 请帮助我们如何能够将 CMPSS 输出与输入 XBar 连接

    为了帮助完善这项建议、了解以下信息会有所帮助:

    • 您计划使用哪些特定的输入 X-BAR 实例和 eCAP 模块(这决定了确切的寄存器配置) :  

           输入 xbar 7、ECAP 1

    • 无论您是需要高侧比较器 (CTRIPH) 还是低侧 (CTRIPL) 来实现过零、这取决于交流信号是上升还是下降超过 DAC 阈值

                CTRIPH

    • 您的网格频率 (50Hz 或 60Hz)—这会影响推荐的数字滤波器设置             50Hz
    • 调整后的栅格信号在 A4 处的直流偏置和振幅、以正确设置 DAC 阈值

     

    void myECAP0_init (){

    //
    //禁用、清除所有捕获标志和中断
    //
    eCAP_disableInterrupt (myECAP0_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 (myECAP0_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 (myECAP0_BASE);
    //
    //停止时间戳计数器。
    //
    ECAP_STOPCounter (myECAP0_BASE);
    //
    //将 eCAP 设置为捕获模式。
    //
    ECAP_enableCaptureMode (myECAP0_BASE);
    //
    //设置捕获模式。
    //
    eCAP_setCaptureMode (myECAP0_BASE、eCAP_ONE_SHATE_CAPTURE_MODE、eCAP_EVENT_4);
    //
    //设置捕获事件预分频器。
    //
    eCAP_setEventPrescaler (myECAP0_BASE、0U);
    //
    //设置捕获事件极性。
    //
    eCAP_setEventPolarity (myECAP0_BASE、eCAP_EVENT_1、eCAP_Evnt_falling_edge);
    eCAP_setEventPolarity (myECAP0_BASE、eCAP_EVENT_2、eCAP_Evnt_rising edge);
    eCAP_setEventPolarity (myECAP0_BASE、eCAP_EVENT_3、eCAP_Evnt_falling_edge);
    eCAP_setEventPolarity (myECAP0_BASE、eCAP_EVENT_4、eCAP_Evnt_rising edge);
    //
    //在发生事件时配置计数器复位
    //
    eCAP_enableCounterResetOnEvent (myECAP0_BASE、eCA_EVENT_1);
    eCAP_enableCounterResetOnEvent (myECAP0_BASE、eCA_EVENT_2);
    eCAP_enableCounterResetOnEvent (myECAP0_BASE、eCA_EVENT_3);
    eCAP_enableCounterResetOnEvent (myECAP0_BASE、eCA_EVENT_4);
    //
    //选择 eCAP 输入。
    //
    eCAP_selectECAPInput (myECAP0_BASE、eCAP_INPUT_OUTPUTXBAR3);//eCAP_INPUT_CMPSS2_CTRIP_HIGH);
    //
    //设置相移值计数。
    //
    eCAP_setPhaseShiftCount (myECAP0_BASE、0U);
    //
    //启用使用相移值进行计数器加载。
    //
    eCAP_enableLoadCounter (myECAP0_BASE);
    //
    //配置同步输出信号模式。
    //
    eCAP_setSyncOutMode (myECAP0_BASE、eCAP_SYNC_OUT_SYNCI);
    //
    //配置仿真模式。
    //
    eCAP_setEmulationMode (myECAP0_BASE、eCAP_emulation_stop);
    //
    //设置同步输入脉冲源。
    //
    eCAP_setSyncInPulseSource (myECAP0_BASE、eCAP_SYNC_IN_PULSE_SRC_DISABLE);
    //
    //开始 myECAP0 的时间戳计数器。
    //
    eCAP_startCounter (myECAP0_BASE);
    //
    //为 myECAP0 启用时间戳捕获。
    //
    eCAP_enableTimeStampCapture (myECAP0_BASE);
    //
    //将 Re 配置为 myECAP0 的 eCAP 模块。
    //
    eCAP_rearm (myECAP0_BASE);
    //
    //为 myECAP0 启用中断源。
    //
    eCAP_enableInterrupt (myECAP0_BASE、(eCAP_ISR_SOURCE_CAPTURE_EVENT_4));

    void myECAP0_init (){

    //
    //禁用、清除所有捕获标志和中断
    //
    eCAP_disableInterrupt (myECAP0_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 (myECAP0_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 (myECAP0_BASE);
    //
    //停止时间戳计数器。
    //
    ECAP_STOPCounter (myECAP0_BASE);
    //
    //将 eCAP 设置为捕获模式。
    //
    ECAP_enableCaptureMode (myECAP0_BASE);
    //
    //设置捕获模式。
    //
    eCAP_setCaptureMode (myECAP0_BASE、eCAP_ONE_SHATE_CAPTURE_MODE、eCAP_EVENT_4);
    //
    //设置捕获事件预分频器。
    //
    eCAP_setEventPrescaler (myECAP0_BASE、0U);
    //
    //设置捕获事件极性。
    //
    eCAP_setEventPolarity (myECAP0_BASE、eCAP_EVENT_1、eCAP_Evnt_falling_edge);
    eCAP_setEventPolarity (myECAP0_BASE、eCAP_EVENT_2、eCAP_Evnt_rising edge);
    eCAP_setEventPolarity (myECAP0_BASE、eCAP_EVENT_3、eCAP_Evnt_falling_edge);
    eCAP_setEventPolarity (myECAP0_BASE、eCAP_EVENT_4、eCAP_Evnt_rising edge);
    //
    //在发生事件时配置计数器复位
    //
    eCAP_enableCounterResetOnEvent (myECAP0_BASE、eCA_EVENT_1);
    eCAP_enableCounterResetOnEvent (myECAP0_BASE、eCA_EVENT_2);
    eCAP_enableCounterResetOnEvent (myECAP0_BASE、eCA_EVENT_3);
    eCAP_enableCounterResetOnEvent (myECAP0_BASE、eCA_EVENT_4);
    //
    //选择 eCAP 输入。
    //
    eCAP_selectECAPInput (myECAP0_BASE、eCAP_INPUT_OUTPUTXBAR3);//eCAP_INPUT_CMPSS2_CTRIP_HIGH);
    //
    //设置相移值计数。
    //
    eCAP_setPhaseShiftCount (myECAP0_BASE、0U);
    //
    //启用使用相移值进行计数器加载。
    //
    eCAP_enableLoadCounter (myECAP0_BASE);
    //
    //配置同步输出信号模式。
    //
    eCAP_setSyncOutMode (myECAP0_BASE、eCAP_SYNC_OUT_SYNCI);
    //
    //配置仿真模式。
    //
    eCAP_setEmulationMode (myECAP0_BASE、eCAP_emulation_stop);
    //
    //设置同步输入脉冲源。
    //
    eCAP_setSyncInPulseSource (myECAP0_BASE、eCAP_SYNC_IN_PULSE_SRC_DISABLE);
    //
    //开始 myECAP0 的时间戳计数器。
    //
    eCAP_startCounter (myECAP0_BASE);
    //
    //为 myECAP0 启用时间戳捕获。
    //
    eCAP_enableTimeStampCapture (myECAP0_BASE);
    //
    //将 Re 配置为 myECAP0 的 eCAP 模块。
    //
    eCAP_rearm (myECAP0_BASE);
    //
    //为 myECAP0 启用中断源。
    //
    eCAP_enableInterrupt (myECAP0_BASE、(eCAP_ISR_SOURCE_CAPTURE_EVENT_4));

    }

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

    尊敬的  Fleenor:

    我无法 在我的 xp.h 中找到 XBAR_IN_MUX_CMPSS2_CTRLIPH

    我的 SDK ,我有以下选项,请建议我必须使用哪一个  

    XAP_EPWM_MUX02_CMPSS2_CTRLBh = 0x0400、//!EPWM MUX02 CMPSS2 CTRIPH

     XBAR_INPUT_FLG_CMPSS2_CTRLIH  = 0x0003、

    XBar _CLB_MUX02_CMPSS2_CTRL.h = 0x0400、//!CLB MUX02 CMPSS2 CTRIPH

    请建议在 SDK 中使用它的十六进制值。 以及您使用的 SDK。

    此致、

    阿图尔  

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

    尊敬的 Atul:

    您应该使用此处的 INPUTXBAR 选择 (XBAR_INPUT_FLG_CMPSS2_CTRL.h)。 对先前错误的命名规则表示歉意。

    供参考:  

    XBar = EPWM_MUX02_CMPSS2_CTRLBh = PWMXBAR 选择

    XBar _CLB_MUX02_CMPSS2_CTRL.h = CLB INPUTXBAR 选择

    此致、

    Zackary Fleenor