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**** 2382480 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 配置看起来正确。 要排除这一问题、您能否查看下面寄存器的内容?

    AnalogSubsysRegs.CMPHPMXSEL

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

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

    您好、Frank、

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

    感谢您的帮助!

    Damien

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

    尊敬的 Damien:

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

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

    您好、Frank、

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

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

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

    和代码:

    #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
        Board_init();
    
        // Disable sync and clock to PWM
        SysCtl_disablePeripheral(SYSCTL_PERIPH_CLK_TBCLKSYNC);
        // Configure COMP1H
        init_cmpss(CMPSS1_BASE);
        init_cmpss(CMPSS2_BASE);
        init_cmpss(CMPSS3_BASE);
        // initEPWM1 - Configure ePWM1
        float tbclk = init_EPWM(myEPWM1_BASE);
        // initEPWM2 - Configure ePWM2
        tbclk = init_EPWM(myEPWM2_BASE);
        // Configure phase between PWM1 & PWM2. PWM1 is configure as master and ePWM2 as slaves.
        EPWM_disablePhaseShiftLoad(myEPWM1_BASE);
        EPWM_setPhaseShift(myEPWM1_BASE, 0U);
        // ePWM1 SYNCO is generated on CTR=0
        EPWM_enableSyncOutPulseSource(myEPWM1_BASE, EPWM_SYNC_OUT_PULSE_ON_CNTR_ZERO);
    
        // Configure phase shift for EPWM2 & 3
        set_phase(myEPWM2_BASE, PHI);
        EPWM_setSyncInPulseSource(myEPWM2_BASE, EPWM_SYNC_IN_PULSE_SRC_SYNCOUT_EPWM1);
        EPWM_enablePhaseShiftLoad(myEPWM2_BASE);
    
        // Calculate delays
        get_delays_FED_RED(myEPWM1_BASE, tbclk);
        get_delays_FED_RED(myEPWM2_BASE, tbclk);
    
        // Enable sync and clock to PWM
        SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_TBCLKSYNC);
    
        // Enable Global Interrupt (INTM) and realtime interrupt (DBGM)
        EINT;
        ERTM;
    
        while(1)
        {
            // Trip flag is set when CTRIP signal is asserted
            if((EPWM_getTripZoneFlagStatus(myEPWM1_BASE) & EPWM_TZ_FLAG_OST) != 0U && (EPWM_getTripZoneFlagStatus(myEPWM2_BASE) & EPWM_TZ_FLAG_OST) != 0U)
            {
                // Wait for comparator CTRIP to de-assert
                while((CMPSS_getStatus(CMPSS1_BASE) & CMPSS_STS_HI_FILTOUT) != 0U && (CMPSS_getStatus(CMPSS2_BASE) & CMPSS_STS_HI_FILTOUT) != 0U)
                {
                }
                // Clear trip flags
                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)
    {
        float PWM_TBPRD;
        float PWM_CMPA;
        EPWM_ClockDivider PWM_PARAM_PRESCALER;
        EPWM_HSClockDivider PWM_PARAM_HIGHSPEEDPRESCALER;
        float TBCLK;
    
        get_pwm_clock_from_freq(&PWM_TBPRD , &PWM_CMPA , &PWM_PARAM_PRESCALER , &PWM_PARAM_HIGHSPEEDPRESCALER, &TBCLK);
    
        // Parameters
        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_PARAM_HIGHSPEEDPRESCALER);
    
        // Set up shadowing
        EPWM_setCounterCompareShadowLoadMode(base, EPWM_COUNTER_COMPARE_A, EPWM_COMP_LOAD_ON_CNTR_ZERO);
    
        // Set actions
        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);
    
        // Trip zone
        // Configure ePWM1x to output low on TZx TRIP
        EPWM_setTripZoneAction(base, EPWM_TZ_ACTION_EVENT_TZA, EPWM_TZ_ACTION_LOW);
        EPWM_setTripZoneAction(base, EPWM_TZ_ACTION_EVENT_TZB, EPWM_TZ_ACTION_LOW);
        // Trigger event when DCBH is high
        EPWM_setTripZoneDigitalCompareEventCondition(base, EPWM_TZ_DC_OUTPUT_B1, EPWM_TZ_EVENT_DCXH_HIGH);
        // Configure DCBH to use TRIP4 as an input
        EPWM_enableDigitalCompareTripCombinationInput(base, EPWM_DC_COMBINATIONAL_TRIPIN4, EPWM_DC_TYPE_DCBH);
        // Enable DCB as OST
        EPWM_enableTripZoneSignals(base, EPWM_TZ_SIGNAL_DCBEVT1);
        // Configure the DCB path to be unfiltered and asynchronous
        EPWM_setDigitalCompareEventSource(base, EPWM_DC_MODULE_B, EPWM_DC_EVENT_1, EPWM_DC_EVENT_SOURCE_ORIG_SIGNAL);
    
        // To use CMPx_LP
        //AIO224 -> myAIO0 Pinmux
        GPIO_setPinConfig(GPIO_226_GPIO226);
        //AIO237 -> myAIO0 Pinmux
        GPIO_setPinConfig(GPIO_237_GPIO237);
        //AIO226 -> myAIO2 Pinmux
        GPIO_setPinConfig(GPIO_230_GPIO230);
        // To use CMP1_HP0
        ASysCtl_selectCMPLPMux(ASYSCTL_CMPLPMUX_SELECT_1, 1);
        // To use CMP2_HN1
        ASysCtl_selectCMPLPMux(ASYSCTL_CMPLPMUX_SELECT_2, 3);
        // To use CMP3_HP0
        ASysCtl_selectCMPLPMux(ASYSCTL_CMPLPMUX_SELECT_3, 0);
    
        XBAR_setEPWMMuxConfig(XBAR_TRIP4, XBAR_EPWM_MUX01_CMPSS1_CTRIPL);
        XBAR_setEPWMMuxConfig(XBAR_TRIP4, XBAR_EPWM_MUX03_CMPSS2_CTRIPL);
        XBAR_setEPWMMuxConfig(XBAR_TRIP4, XBAR_EPWM_MUX05_CMPSS3_CTRIPL);
    
        XBAR_enableEPWMMux(XBAR_TRIP4, XBAR_MUX01 | XBAR_MUX03 | XBAR_MUX05);
    
        // Clear trip flags
        EPWM_clearTripZoneFlag(base, EPWM_TZ_INTERRUPT | EPWM_TZ_FLAG_OST);
        return TBCLK;
    }
    
    void set_delays(uint32_t base, uint16_t DBFED, uint16_t DBRED)
    {
        // Sets up the rising edge delay input signal.
        EPWM_setFallingEdgeDeadBandDelayInput(base, EPWM_DB_INPUT_EPWMA);
        // Sets up the falling edge delay input signal.
        EPWM_setRisingEdgeDeadBandDelayInput(base, EPWM_DB_INPUT_EPWMA);
        // This function sets the FED count value, this one should be less than 16384.
        EPWM_setFallingEdgeDelayCount(base, DBFED);
        // This function sets the RED count value, this one should be less than 16384.
        EPWM_setRisingEdgeDelayCount(base, DBRED);
        // This function sets up the polarity : EPWM_DB_POLARITY_ACTIVE_HIGH => polarity is not inverted and EPWM_DB_POLARITY_ACTIVE_LOW => polarity is inverted.
        EPWM_setDeadBandDelayPolarity(base, EPWM_DB_RED, EPWM_DB_POLARITY_ACTIVE_HIGH);
        EPWM_setDeadBandDelayPolarity(base, EPWM_DB_FED, EPWM_DB_POLARITY_ACTIVE_HIGH);
        // This function sets up the dead band delay mode. The enableDelayMode determines if a dead band delay should be applied.
        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 init_cmpss(base)
    {
        // Enable CMPSS and configure the negative input signal to come from the DAC
        CMPSS_enableModule(base);
        CMPSS_configHighComparator(base, CMPSS_INSRC_DAC);
        CMPSS_configLowComparator(base, CMPSS_INSRC_DAC);
        // Use VDDA as the reference for the DAC and set DAC value to midpoint for arbitrary reference.
        CMPSS_configDAC(base, CMPSS_DACREF_VDDA | CMPSS_DACVAL_SYSCLK | CMPSS_DACSRC_SHDW);
        CMPSS_setDACValueHigh(base, 1024);
        // Configure the output signals. Both CTRIPH will be fed by the synchronous comparator output.
        CMPSS_configOutputsHigh(base, CMPSS_TRIP_SYNC_COMP);
        CMPSS_configOutputsLow(base, CMPSS_TRIP_SYNC_COMP);
    }
    

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

    可以帮帮我吗?

    谢谢

    Damien

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

    尊敬的 Damien:

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

        CMPSS_setDACValueHigh(base, 1024);

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

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

    你(们)好、Frank

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

    谢谢

    Damien

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

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