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.

[参考译文] TMS320F280025C:在 TMS320f280025C 上配置 CMPSS 时出现问题

Guru**** 1957125 points
Other Parts Discussed in Thread: LAUNCHXL-F280025C, SYSCONFIG
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1031871/tms320f280025c-problem-to-configure-cmpss-on-tms320f280025c

器件型号:TMS320F280025C
主题中讨论的其他器件:LAUNCHXL-F280025CSysConfig

您好!

抱歉我的英语水平。

首先、我致力于开发 LAUNCHXL-F280025C、以开发电子电源解决方案的数字调节。 我开发了 PWM 功能、包括占空比、相位设置等...

现在浏览论坛几天后、我一直在关注 CMPSS 设计。 我想触发 CMPSS 并关闭所有 ePWM (用于保护 OCP/ OVP 等)。

当我只使用两个 ADCIN 时,它就能正常工作:只能与 XBAR_MUX00和 XBAR_MUX02配合使用,但不能与另一个配合使用。

为什么? 可以告诉我吗?

我加入我的代码。  

#include
#include "driverlib.h"
#include "utils.h"
#include "device.h"
#include "board.h"
#include "config.h"

float init_ePWM();
void init_cmpss();

void main (void)

//初始化设备时钟和外设
device_init();
//禁用引脚锁定并启用内部上拉。
DEVICE_initGPIO();
//初始化 PIE 并清除 PIE 寄存器。 禁用 CPU 中断。
interrupt_initModule();
//使用指向 shell 中断服务例程(ISR)的指针初始化 PIE 矢量表。
interrupt_initVectorTable();
// board.c 和 board.h 由 SysConfig 生成
Board_init();

//禁用 PWM 的同步和时钟
SYSCTL_DisablePeripheral (SYSCTL_Periph_CLK_TBCLKSYNC);
//配置 COMP1H
init_cmpss (CMPSS1_base);
init_cmpss (CMPSS2_base);
// initEPWM1 -配置 ePWM1
浮点 TBCLK = INIT_ePWM (myEPWM1_BASE);
// initEPWM2 -配置 ePWM2
TBCLK = init_ePWM (myEPWM2_base);
//在 PWM1和 PWM2之间配置相位。 PWM1配置为主器件、ePWM2配置为从器件。
ePWM_DisablePhaseShiftLoad (myEPWM1_base);
ePWM_setPhaseShift (myEPWM1_base、0U);
//在 CTR=0时生成 ePWM1 SYNCO
ePWM_enableSyncOutPulseSource (myEPWM1_base、ePWM_SYNC_OUT_PULSE_ON_CNTR_ZERO);

//为 EPWM2 & 3配置相移
SET_PHASE (myEPWM2_base、PHI);
ePWM_setSyncInPulseSource (myEPWM2_base、ePWM_SYNC_IN_PULSE_SRC_SYNCOUT_EPWM1);
ePWM_enablePhaseShiftLoad (myEPWM2_base);

//计算延迟
GET_DELAY_FED_RED (myEPWM1_BASE、TBCLK);
GET_DELAY_FED_RED (myEPWM2_base、TBCLK);

//启用到 PWM 的同步和时钟
SYSCTL_enablePeripheral (SYSCTL_Periph_CLK_TBCLKSYNC);

//启用全局中断(INTM)和实时中断(DBGM)
EINT;
ERTM;

while (1)

当 CTRIP 信号被置位时、//跳闸标志被置位
if ((ePWM_getTripZoneFlagStatus (myEPWM1_base)& ePWM_TZ_FLAG_OST)!= 0U &&(ePWM_getTripZoneFlagStatus (myEPWM2_base)& ePWM_TZ_FLAG_OST)!= 0U)

//等待比较器 CTrip 取消置位
while ((CMPSS_getStatus (CMPSS1_base)& CMPSS_STS_HI_FILTOUT)!= 0U &&(CMPSS_getStatus (CMPSS2_base)& CMPSS_STS_HI_FILTOUT)!= 0U)


//清除跳闸标志
ePWM_clearTripZoneFlag (myEPWM1_base、ePWM_TZ_INTERRUPT | ePWM_TZ_FLAG_OST);
ePWM_clearTripZoneFlag (myEPWM2_base、ePWM_TZ_INTERRUPT | ePWM_TZ_FLAG_OST);


float init_ePWM (base)

浮点 PWM_TBPRD;
浮点 PWM_CMPA;
ePWM_ClockDivider PWM_PARAM_PRESCALER;
ePWM_HSClockDivider PWM_PARAM_HIGHSPEEDPRESCALER;
悬空 TBCLK;

get_pwm_clock_fin_freq (&wm_TBPRD、&wm_CMPA、&wm_Param_prescaler、&wm_Param_HIGESPEEDPRESCALER、&TBCLK);

//参数
ePWM_setTimeBasePeriod (base、(uint16_t) PWM_TBPRD);
ePWM_setCounterCompareValue (base、ePWM_COUNTER_COMPARE_A、(uint16_t) PWM_CMPA);
ePWM_setPhaseShift (base、0U);
ePWM_setTimeBaseCounter (base、0U);
ePWM_setTimeBaseCounterMode (base、ePWM_COUNTER_MODE_UP_DOWN);
ePWM_DisablePhaseShiftLoad (base);
ePWM_setClockPrescaler (base、PWM_PARAM_PREScaler、PWM_PAMP_HIGHSPEEDPRESCALER);

//设置隐藏
ePWM_setCounterCompareShadowImage LoadMode (base、ePWM_COUNTER_COMPARE_A、ePWM_COMP_LOAD_ON_CNTR_ZERO);

//设置操作
ePWM_setActionQualifierAction (base、ePWM_AQ_output_a、ePWM_AQ_output_high、ePWM_AQ_output_on_timebase_up_CMPA);
ePWM_setActionQualifierAction (base、ePWM_AQ_output_a、ePWM_AQ_output_low、ePWM_AQ_output_on_timebase_down_CMPA);
ePWM_setActionQualifierAction (base、ePWM_AQ_output_B、ePWM_AQ_output_high、ePWM_AQ_output_on_timebase_up_CMPA);
ePWM_setActionQualifierAction (base、ePWM_AQ_output_B、ePWM_AQ_output_low、ePWM_AQ_output_on_timebase_down_CMPA);

//跳匣区域
//将 ePWM1x 配置为在 TZx 跳变时输出低电平
ePWM_setTripZoneAction (base、ePWM_TZ_ACT_EVENT_TZA、ePWM_TZ_ACT_LOW);
ePWM_setTripZoneAction (base、ePWM_TZ_ACT_EVENT_TSB、ePWM_TZ_ACT_LOW);
// DCBH 为高电平时触发事件
ePWM_setTripZoneDigitalCompareEventCondition (base、ePWM_TZ_DC_OUTPUT B1、ePWM_TZ_EVENT_DCXH_HIGH);
//配置 DCBH 以使用 TRIP4作为输入
ePWM_enableDigitalCompareTripCombinationInput (base、ePWM_DC_combinational_TRIPIN4、ePWM_DC_TYPE_DCBH);
//将 DCB 启用为 OST
ePWM_enableTripZoneSignals (base、ePWM_TZ_SIGNEL_DCBEVT1);
//将 DCB 路径配置为未过滤和异步
ePWM_setDigitalCompareEventSource (base、ePWM_DC_MODULE_B、ePWM_DC_EVENT_1、ePWM_DC_EVENT_SOURC_ORIG_SIGN);
//使用 ePWM X-BAR 将 TRIP4配置为 CTRIP1H
Xbar_setEPWMMuxConfig (XBAR_TRIP4、XBAR_EPWM_MUX00_CMPSS1_CTRIPH);
Xbar_setEPWMMuxConfig (XBAR_TRIP4、XBAR_EPWM_MUX02_CMPSS2_CTRIPH);
Xbar_setEPWMMuxConfig (XBAR_TRIP4、XBAR_EPWM_MUX06_CMPSS4_CTRIPH);
//请参阅 ePWM X-BAR Mux 配置表
Xbar_enableEPWMMUX (XBAR_TRIP4、XBAR_MUX00、XBAR_MUX02 | XBAR_MUX06);
//清除跳闸标志
ePWM_clearTripZoneFlag (base、ePWM_TZ_interrupt | ePWM_TZ_FLAG_OST);
返回 TBCLK;


//设置上升沿延迟输入信号。
ePWM_setFallingEdgeDeadBandDelayInput (base、ePWM_DB_INPUT_EPWMA);
//设置下降沿延迟输入信号。
ePWM_setRisingEdgeDeadBandDelayInput (base、ePWM_DB_INPUT_EPWMA);
//此函数设置馈入计数值,此值应小于16384。
ePWM_setFallingEdgeDelayCount (base、DBFED);
//此函数设置红色计数值,此值应小于16384。
ePWM_setRisingEdgeDelayCount (base、DBRED);
//此函数设置极性:ePWM_DB_POLARY_ACTIVE_HIGH =>极性未反转,而 ePWM_DB_POLARY_ACTIVE_LOW =>极性反转。
ePWM_setDeadBandDelayPolarity (base、ePWM_DB_RED、ePWM_DB_Polarity、ACTIVE_HIGH);
ePWM_setDeadBandDelayPolarity (base、ePWM_DB_FED、ePWM_DB_Polarity、ACTIVE_HIGH);
//此函数设置死区延迟模式。 enableDelayMode 决定是否应应用死区延迟。
ePWM_setDeadBandDelayMode (base、ePWM_DB_RED、true);
ePWM_setDeadBandDelayMode (base、ePWM_DB_FED、true);
//ePWM_setDeadBandOutputSwapMode (myEPWM2_base、ePWM_DB_OUTPUT A、false);
ePWM_setDeadBandOutputSwapMode (base、ePWM_DB_output_B、false);

void SET_DELUEURS(uint32_t base、uint16_t DBFED、uint16_t DBRED)

void init_cmpss (base)

//启用 CMPSS 并将负输入信号配置为来自 DAC
CMPSS_enableModule (base);
CMPSS_CONFIGHighComparator (base、CMPSS_INSRC_DAC);
//使用 VDDA 作为 DAC 的基准,并将 DAC 值设置为中点以供任意基准。
CMPSS CONFIGDAC (base、CMPSS DACREF_VDDA | CMPSS DACVAL_SYSCLK | CMPSS DACSRC_Shdw);
CMPSS_setDACValueHigh (base、1024);
//配置输出信号。 CTRIPH 和 CTRIPOUTH 都将由异步比较器输出供电。
CMPSS_CONFIGOutputsHigh (base、CMPSS_TRIP_TRIP_ASYNC_COMP | CMPSS_TRIPOUT_ASYNC_COMP);

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

    尊敬的 Damien:

    欢迎来到 e2e 论坛。 很高兴能帮助您解决问题。 下面我不太理解您的问题。 您能再解释一下什么不起作用吗?

    [引用 userid="489604" URL"~/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1031871/tms320f280025c-problem-to-configure-cmpss-on-tms320f280025c ]]当我仅使用两个 ADCIN 时,它可以正常工作:仅与 XBAR_MUX00和 XBAR_MUX02配合使用,但不与另一个 ADCIN 配合使用。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Franck:

    我使用连接到 CMP1_HP 信号的 ADC 输入、例如、我将 DAC 设置为特定阈值、并使用适合仿真 ADC 输入的外部电源。  当然、目标是将 OCP/OVP 反馈连接到这些输入。 我使用引脚分配表将 ADC 条目链接到有问题的 CMPSS。 如果我理解正确,我可以将多个 CMPSS 分配给跳闸区域的同一信号(XBAR_TRIP4)吗? 我能否将多个多路复用器连接到同一跳闸区域切断信号(XBAR_TRIP4)?

    当我使用此配置时,它工作正常(关闭正常):

    Xbar_setEPWMMuxConfig (XBAR_TRIP4、XBAR_EPWM_MUX00_CMPSS1_CTRIPH);
    Xbar_setEPWMMuxConfig (XBAR_TRIP4、XBAR_EPWM_MUX02_CMPSS2_CTRIPH);

    Xbar_enableEPWMMUX (XBAR_TRIP4、XBAR_MUX00、XBAR_MUX02);

    但是,当我想在 ADC 条目中添加另一个 CMPSS 时,它不起作用? 使用相同的跳闸区域或安托尔。 例如、此代码不适用于 MUX06:

    Xbar_setEPWMMuxConfig (XBAR_TRIP4、XBAR_EPWM_MUX00_CMPSS1_CTRIPH);
    Xbar_setEPWMMuxConfig (XBAR_TRIP4、XBAR_EPWM_MUX02_CMPSS2_CTRIPH);
    Xbar_setEPWMMuxConfig (XBAR_TRIP4、XBAR_EPWM_MUX06_CMPSS4_CTRIPH);

    Xbar_enableEPWMMUX (XBAR_TRIP4、XBAR_MUX00 | XBAR_MUX02 | XBAR_MUX06);

    我将查看是否是 microcontrolleur 的配置问题、在相关引脚上、我可能不适合 CMPSS、而是另一个函数(请参阅表引脚属性)

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

    您好!

    我想问题是 CMPSS 配置:CMPx_HPx 与模拟输入输出的关系否?

    我的配置如下:  

    float init_ePWM (base)

    浮点 PWM_TBPRD;
    浮点 PWM_CMPA;
    ePWM_ClockDivider PWM_PARAM_PRESCALER;
    ePWM_HSClockDivider PWM_PARAM_HIGHSPEEDPRESCALER;
    悬空 TBCLK;

    get_pwm_clock_fin_freq (&wm_TBPRD、&wm_CMPA、&wm_Param_prescaler、&wm_Param_HIGESPEEDPRESCALER、&TBCLK);

    //参数
    ePWM_setTimeBasePeriod (base、(uint16_t) PWM_TBPRD);
    ePWM_setCounterCompareValue (base、ePWM_COUNTER_COMPARE_A、(uint16_t) PWM_CMPA);
    ePWM_setPhaseShift (base、0U);
    ePWM_setTimeBaseCounter (base、0U);
    ePWM_setTimeBaseCounterMode (base、ePWM_COUNTER_MODE_UP_DOWN);
    ePWM_DisablePhaseShiftLoad (base);
    ePWM_setClockPrescaler (base、PWM_PARAM_PREScaler、PWM_PAMP_HIGHSPEEDPRESCALER);

    //设置隐藏
    ePWM_setCounterCompareShadowImage LoadMode (base、ePWM_COUNTER_COMPARE_A、ePWM_COMP_LOAD_ON_CNTR_ZERO);

    //设置操作
    ePWM_setActionQualifierAction (base、ePWM_AQ_output_a、ePWM_AQ_output_high、ePWM_AQ_output_on_timebase_up_CMPA);
    ePWM_setActionQualifierAction (base、ePWM_AQ_output_a、ePWM_AQ_output_low、ePWM_AQ_output_on_timebase_down_CMPA);
    ePWM_setActionQualifierAction (base、ePWM_AQ_output_B、ePWM_AQ_output_high、ePWM_AQ_output_on_timebase_up_CMPA);
    ePWM_setActionQualifierAction (base、ePWM_AQ_output_B、ePWM_AQ_output_low、ePWM_AQ_output_on_timebase_down_CMPA);

    //跳匣区域
    //将 ePWM1x 配置为在 TZx 跳变时输出低电平
    ePWM_setTripZoneAction (base、ePWM_TZ_ACT_EVENT_TZA、ePWM_TZ_ACT_LOW);
    ePWM_setTripZoneAction (base、ePWM_TZ_ACT_EVENT_TSB、ePWM_TZ_ACT_LOW);
    // DCBH 为高电平时触发事件
    ePWM_setTripZoneDigitalCompareEventCondition (base、ePWM_TZ_DC_OUTPUT B1、ePWM_TZ_EVENT_DCXH_HIGH);
    //配置 DCBH 以使用 TRIP4作为输入
    ePWM_enableDigitalCompareTripCombinationInput (base、ePWM_DC_combinational_TRIPIN4、ePWM_DC_TYPE_DCBH);
    //将 DCB 启用为 OST
    ePWM_enableTripZoneSignals (base、ePWM_TZ_SIGNEL_DCBEVT1);
    //将 DCB 路径配置为未过滤和异步
    ePWM_setDigitalCompareEventSource (base、ePWM_DC_MODULE_B、ePWM_DC_EVENT_1、ePWM_DC_EVENT_SOURC_ORIG_SIGN);

    //AIO224 -> myAIO0 Pinmux
    GPIO_setPinConfig (GPIO_224_GPIO224);
    GPIO_setAnalogMode (224、GPIO_ANALOG_ENABLED);
    //AIO230 -> myAIO1 Pinmux
    GPIO_setPinConfig (GPIO_230_GPIO230);
    GPIO_setAnalogMode (230、GPIO_ANALOG_ENABLED);
    //AIO226 -> myAIO2 Pinmux
    GPIO_setPinConfig (GPIO_2226_GPIO226);
    GPIO_setAnalogMode (226、GPIO_ANALOG_ENABLED);
    //使用 CMP1_HP0
    ASysCtl_selectCMPHPMUX (ASYSCTL_CMPHPMUX_SELECT_1、0);
    //使用 CMP2_HP3
    ASysCtl_selectCMPHPMUX (ASYSCTL_CMPHPMUX_SELECT_2、3);
    //使用 CM3_HP0
    ASysCtl_selectCMPHPMUX (ASYSCTL_CMPHPMUX_SELECT_3、0);

    //使用 ePWM X-BAR 将 TRIP4配置为 CTRIP1H
    Xbar_setEPWMMuxConfig (XBAR_TRIP4、XBAR_EPWM_MUX00_CMPSS1_CTRIPH);
    Xbar_setEPWMMuxConfig (XBAR_TRIP4、XBAR_EPWM_MUX02_CMPSS2_CTRIPH);
    Xbar_setEPWMMuxConfig (XBAR_TRIP4、XBAR_EPWM_MUX04_CMPSS3_CTRIPH);

    //请参阅 ePWM X-BAR Mux 配置表
    Xbar_enableEPWMMUX (XBAR_TRIP4、XBAR_MUX00 | XBAR_MUX02 | XBAR_MUX04);
    //清除跳闸标志
    ePWM_clearTripZoneFlag (base、ePWM_TZ_interrupt | ePWM_TZ_FLAG_OST);
    返回 TBCLK;

    可以帮帮我吗?

    谢谢

    此致

    Damien

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

    您好!

    我将带有 AIO224的 CMP1_HP1与引脚13 (µC I ² C 的80QFP)搭配使用

          带有 AIO230的 CMP2_HP3连接到引脚29 (用于 I µC ² C 的80QFP)

         带 AIO226的 CM3_HP0至引脚11 (我的 μ µC 为80QFP)

    当我在引脚(13和29)上使用电源施加1V (参考 DAC = 1024) 时、ePWM 会正确关闭、但当我在引脚编号11上施加电压时、它不起作用。 为什么? 可以告诉我吗?

    谢谢  

    Damien

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

    尊敬的 Damien:

    您的 CMPSS 配置看起来正确。 要排除这一问题、您能否查看下面寄存器的内容?

    Fullscreen
    1
    AnalogSubsysRegs.CMPHPMXSEL
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    顺便说一下、在将来发布代码时、请使用代码插入工具。 这使得代码更易于阅读。

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

    您好、Frank、

    我发现了这个问题,这是一个愚蠢的错误:我忘记了设置 CMPSS 3 DAC 配置。

    感谢您的帮助!

    Damien

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

    尊敬的 Damien:

    很高兴听到您解决了问题! 如果再出现、请告知我们。

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

    您好、Frank、

    当我使用 CMPxLP 输入作为 CTRIPxL 输出时、我对 ePWM 输出有一个新问题。

    当我使用 CMPxHP 输入来关闭 ePWM 时、一切工作正常。 (仅具有 CMPxHP 输入和 DAC 基准)

    这是我们之前的交换中使用的配置。 我现在尝试通过也使用 CMP_LP 输入来完整使用 CMPSS、但在本例中、ePWM 是异步的。 我不明白为什么? 我加入以下代码和 有关 ePWM 的内容。

    和代码:

    Fullscreen
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    #include <f28002x_device.h>
    #include "driverlib.h"
    #include "utils.h"
    #include "device.h"
    #include "board.h"
    #include "config.h"
    float init_EPWM();
    void init_cmpss();
    void main(void)
    {
    // Initialize device clock and peripherals
    Device_init();
    // Disable pin locks and enable internal pullups.
    Device_initGPIO();
    // Initialize PIE and clear PIE registers. Disables CPU interrupts.
    Interrupt_initModule();
    // Initialize the PIE vector table with pointers to the shell Interrupt Service Routines (ISR).
    Interrupt_initVectorTable();
    // board.c and board.h generate by sysconfig
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    此函数的作用是 什么:CMPSS_configOutputsLow (base、CMPSS_TRIP_SYNC_COMP)?

    可以帮帮我吗?

    谢谢

    Damien

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

    尊敬的 Damien:

    查看您的配置代码以了解 COMPH 和 compl 之间的差异、我发现您没有为 compl 配置 DACVAL。

    Fullscreen
    1
    CMPSS_setDACValueHigh(base, 1024);
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    尝试将 DACValueLow 也设置为1024、看看它是否起作用。 明天我将会是 OOO、如果上述建议不起作用、我将在下周早些时候查看您的回复。

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

    你(们)好、Frank

    我在论坛上写了一封信后发现了错误、很抱歉、是的、就是这样。 我下次会考虑一些好处。 再次抱歉!

    谢谢

    Damien

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

    没问题。 如果您遇到更多问题、请告知我们。

x 出现错误。请重试或与管理员联系。