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:配置模拟比较器(CMPSS)信号触发器的问题

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1081590/tms320f280025c-issue-to-configure-analog-comparator-cmpss-signals-trigger

部件号:TMS320F280025C
“线程:C2000WARE”中讨论的其它部件

您好,专家,

我向大家提出了我的问题,我已经使用 DAC 的阈值配置了多个比较器。 我想知道哪个比较器触发了我的问题。 请帮帮我。

我还有三个其他信号通过 TZ1|,TZ2|和 TZ3|连接到 Tripzone。
我想在触发 TZ 和/或 CMSS 信号时关闭 ePWM。 关闭操作正确。 因此,我按如下方式配置了 CMPSSS (请参见代码中的 cmps_init 和 cmps_actions 函数)。 我在不同的 TRIPIN 信号和 ePWM_TZ_SIGNAL_DCBEVT1事件上链接了每个 CMPSSS。 通过查看数字比较子模块的文档,我认为我可以在 XbarRegs.XBARFLG1.bit 寄存器中读取此触发器信息。
这是正确的吗?
初始化时,比较器寄存器的位数为1是否正常?

如果我只使用函数 XBAR_clearInputFlag (XBAR_INPUM_FLG_CMSSx)将它们设置为0。 它似乎在我的代码中起作用(在某些情况下,我有一个在初始化时保持较高的输出)。

我也无法解释这一点吗?

另一方面,当我触发 CMPSS1时,我无法在无限循环中重置它,为什么?

寄存器 XbarRegs.XBARFLG1.bit 中的位仍为1。 我使用函数 XBAR_getInputFlagStatus(x)来知道触发了哪个比较器。

在初始化时,我想通过  XBAR_ClearInputFlag 重置 CMPSSS 输出,但我遇到一个问题,即在重置功能后,一个或两个输出处于较高水平(请参阅屏幕截图)。

感谢你的帮助

达米恩

void cmpss_init()
{
    // Enable CMPSS and configure the negative input signal to come from the DAC
    CMPSS_enableModule(CMPSS1_BASE);
    CMPSS_enableModule(CMPSS2_BASE);
    CMPSS_enableModule(CMPSS3_BASE);
    CMPSS_enableModule(CMPSS4_BASE);

    // Use VDDA as the reference for the DAC and set DAC value to midpoint for arbitrary reference.
    CMPSS_configDAC(CMPSS1_BASE, CMPSS_DACREF_VDDA);
    CMPSS_configDAC(CMPSS2_BASE, CMPSS_DACREF_VDDA);
    CMPSS_configDAC(CMPSS3_BASE, CMPSS_DACREF_VDDA);
    CMPSS_configDAC(CMPSS4_BASE, CMPSS_DACREF_VDDA);

    // To use CMP1_HP2 pin A6 for MU_TRAC_BATT_PCH
    ASysCtl_selectCMPHPMux(ASYSCTL_CMPHPMUX_SELECT_1, 2);
    // To use CMP1_LP3 pin A15/C7 for MU_FUEL_CELL_PCH
    ASysCtl_selectCMPLPMux(ASYSCTL_CMPLPMUX_SELECT_1, 3);
    // To use CMP3_HP1 pin A5/C2 for MI_L_W
    ASysCtl_selectCMPHPMux(ASYSCTL_CMPHPMUX_SELECT_3, 1);
    // To use CMP2_HP1 pin A12/C1 for MI_L_U
    ASysCtl_selectCMPHPMux(ASYSCTL_CMPHPMUX_SELECT_2, 1);
    // To use CMP2_LP4 pin A8/C11 for MI_L_V
    ASysCtl_selectCMPLPMux(ASYSCTL_CMPLPMUX_SELECT_2, 4);
    // To use CMP4_HP1 pin A7/C3 for MI_TRAC_BATT
    ASysCtl_selectCMPHPMux(ASYSCTL_CMPHPMUX_SELECT_4, 1);

    // Configure the output signals. Both CTRIPH will be fed by the asynchronous comparator output.
    //1
    THRESHOLD_MU_TRAC_BATT_PCH_DIGITAL = (THRESHOLD_MU_TRAC_BATT_PCH * 8.2 * 0.000332 * ADC_RESOLUTION) / FULL_SCALE;
    CMPSS_configHighComparator(CMPSS1_BASE, CMPSS_INSRC_DAC);                   // Threshold drive by GPIO or input DAC
    CMPSS_setDACValueHigh(CMPSS1_BASE, THRESHOLD_MU_TRAC_BATT_PCH_DIGITAL);     // Define threshold associated
    CMPSS_configOutputsHigh(CMPSS1_BASE, CMPSS_TRIP_SYNC_COMP);                 // Set output comparator (synchronous or asynchronous)
    //2
    THRESHOLD_MU_FUEL_CELL_PCH_DIGITAL = (THRESHOLD_MU_FUEL_CELL_PCH * 8.2 * 0.000332 * ADC_RESOLUTION) / FULL_SCALE;
    CMPSS_configLowComparator(CMPSS1_BASE, CMPSS_INSRC_DAC);                    // Threshold drive by GPIO or input DAC
    CMPSS_setDACValueLow(CMPSS1_BASE, THRESHOLD_MU_FUEL_CELL_PCH_DIGITAL);      // Define threshold associated
    CMPSS_configOutputsLow(CMPSS1_BASE, CMPSS_TRIP_SYNC_COMP);                  // Set output comparator (synchronous or asynchronous)

    // Configure the output signals. Both CTRIPH will be fed by the asynchronous comparator output.
    //1
    THRESHOLD_MI_L_U_DIGITAL = (((THRESHOLD_MI_L_U * 0.625 / 200) + REF_MI_H_2V5) * ADC_RESOLUTION) / FULL_SCALE;
    CMPSS_configHighComparator(CMPSS2_BASE, CMPSS_INSRC_DAC);                   // Threshold drive by GPIO or input DAC
    CMPSS_setDACValueHigh(CMPSS2_BASE, THRESHOLD_MI_L_U_DIGITAL);               // Define threshold associated
    CMPSS_configOutputsHigh(CMPSS2_BASE, CMPSS_TRIP_SYNC_COMP);                 // Set output comparator (synchronous or asynchronous)

    //2
    THRESHOLD_MI_L_V_DIGITAL = (((THRESHOLD_MI_L_V * 0.625 / 200) + REF_MI_H_2V5) * ADC_RESOLUTION) / FULL_SCALE;
    CMPSS_configLowComparator(CMPSS2_BASE, CMPSS_INSRC_DAC);                    // Threshold drive by GPIO or input DAC
    CMPSS_setDACValueLow(CMPSS2_BASE, THRESHOLD_MI_L_V_DIGITAL);                // Define threshold associated
    CMPSS_configOutputsLow(CMPSS2_BASE, CMPSS_TRIP_SYNC_COMP);                  // Set output comparator (synchronous or asynchronous)

    // Configure the output signals. Both CTRIPH will be fed by the asynchronous comparator output.
    //1
    THRESHOLD_MI_L_W_DIGITAL = (((THRESHOLD_MI_L_W * 0.625 / 200) + REF_MI_H_2V5) * ADC_RESOLUTION) / FULL_SCALE;
    CMPSS_configHighComparator(CMPSS3_BASE, CMPSS_INSRC_DAC);                   // Threshold drive by GPIO or input DAC
    CMPSS_setDACValueHigh(CMPSS3_BASE, THRESHOLD_MI_L_W_DIGITAL);               // Define threshold associated
    CMPSS_configOutputsHigh(CMPSS3_BASE, CMPSS_TRIP_SYNC_COMP);                 // Set output comparator (synchronous or asynchronous)

    // Configure the output signals. Both CTRIPH will be fed by the asynchronous comparator output.
    //1
    THRESHOLD_MI_TRAC_BATT_DIGITAL = ((((THRESHOLD_MI_TRAC_BATT * 2 * 301) / 100000) + REF_MI_BT_1V5) * ADC_RESOLUTION) / FULL_SCALE;
    CMPSS_configHighComparator(CMPSS4_BASE, CMPSS_INSRC_DAC);                   // Threshold drive by GPIO or input DAC
    CMPSS_setDACValueHigh(CMPSS4_BASE, THRESHOLD_MI_TRAC_BATT_DIGITAL);         // Define threshold associated
    CMPSS_configOutputsHigh(CMPSS4_BASE, CMPSS_TRIP_SYNC_COMP);                 // Set output comparator (synchronous or asynchronous)

    // Configure TRIP4 to be CTRIP1H using the ePWM X-BAR. Attach CMPSS output to TRIPINx via EPWMXBAR module
    XBAR_setEPWMMuxConfig(XBAR_TRIP4, XBAR_EPWM_MUX00_CMPSS1_CTRIPH);
    XBAR_setEPWMMuxConfig(XBAR_TRIP5, XBAR_EPWM_MUX01_CMPSS1_CTRIPL);
    XBAR_setEPWMMuxConfig(XBAR_TRIP7, XBAR_EPWM_MUX04_CMPSS3_CTRIPH);
    XBAR_setEPWMMuxConfig(XBAR_TRIP8, XBAR_EPWM_MUX02_CMPSS2_CTRIPH);
    XBAR_setEPWMMuxConfig(XBAR_TRIP9, XBAR_EPWM_MUX03_CMPSS2_CTRIPL);
    XBAR_setEPWMMuxConfig(XBAR_TRIP10, XBAR_EPWM_MUX06_CMPSS4_CTRIPH);

    // See the ePWM X-BAR Mux configuration table, see Crossbar(X-BAR) doc for more informations
    XBAR_enableEPWMMux(XBAR_TRIP4, XBAR_MUX00);
    XBAR_enableEPWMMux(XBAR_TRIP5, XBAR_MUX01);
    XBAR_enableEPWMMux(XBAR_TRIP7, XBAR_MUX04);
    XBAR_enableEPWMMux(XBAR_TRIP8, XBAR_MUX02);
    XBAR_enableEPWMMux(XBAR_TRIP9, XBAR_MUX03);
    XBAR_enableEPWMMux(XBAR_TRIP10, XBAR_MUX06);
}

void cmpss_actions(uint32_t base)
{
    // Configure ePWMx 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);
    EPWM_enableDigitalCompareTripCombinationInput(base, EPWM_DC_COMBINATIONAL_TRIPIN5, EPWM_DC_TYPE_DCBH);
    EPWM_enableDigitalCompareTripCombinationInput(base, EPWM_DC_COMBINATIONAL_TRIPIN7, EPWM_DC_TYPE_DCBH);
    EPWM_enableDigitalCompareTripCombinationInput(base, EPWM_DC_COMBINATIONAL_TRIPIN8, EPWM_DC_TYPE_DCBH);
    EPWM_enableDigitalCompareTripCombinationInput(base, EPWM_DC_COMBINATIONAL_TRIPIN9, EPWM_DC_TYPE_DCBH);
    EPWM_enableDigitalCompareTripCombinationInput(base, EPWM_DC_COMBINATIONAL_TRIPIN10, EPWM_DC_TYPE_DCBH);

    // Enable DCB as OST
    EPWM_enableTripZoneSignals(base, EPWM_TZ_SIGNAL_DCBEVT1);

    // Clear trip flags
    EPWM_clearTripZoneFlag(base, EPWM_TZ_FLAG_DCBEVT1);
}
#include "cmpss_module.h"
#include "device.h"
#include "adc_module.h"
#include "epwm_module.h"
#include "tripzone_module.h"
#include "can_module.h"
#include "monitoring.h"
#include "sm_global.h"
#include "contactor.h"
#include "timer.h"

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();

    trip_zone_config();

    gpio_precharge_init();

    gpio_coldplate_init();

    can_init();

    // Initialization timer for ISR TX_CAN
    timer_cpu_init(CPUTIMER0_BASE);
    // Initialization timer for STEP_START_TIMER precharge
    timer_cpu_init(CPUTIMER1_BASE);
    // Initialization timer for monitoring parameters
    timer_cpu_init(CPUTIMER2_BASE);

    // Timer for CAN communication Interrupt all of (us) 10ms
    timer_cpu_config(CPUTIMER0_BASE, DEVICE_SYSCLK_FREQ, 10000);
    // Timer for STEP_START_TIMER precharge all of (us) PARAM_T_PL_US
    config_cpu_timer(CPUTIMER1_BASE);
    // Timer for CAN all of (us) 10ms
    config_cpu_timer(CPUTIMER2_BASE);

    Interrupt_register(INT_TIMER0, &isr_timer);
    CPUTimer_enableInterrupt(CPUTIMER0_BASE);
    Interrupt_enable(INT_TIMER0);
    // Start timer for interrupt CAN (to send frames)
    CPUTimer_startTimer(CPUTIMER0_BASE);
    // Start timer for precharge step (to measure precharge voltage when timer is reached)
    CPUTimer_startTimer(CPUTIMER1_BASE);
    // Start timer for monitoring
    CPUTimer_startTimer(CPUTIMER2_BASE);

    // Disable sync and clock to PWM
    SysCtl_disablePeripheral(SYSCTL_PERIPH_CLK_TBCLKSYNC);

    EALLOW;
    //EPWM1
    GPIO_setPinConfig(GPIO_0_EPWM1_A);
    GPIO_setPinConfig(GPIO_1_EPWM1_B);
    //EPWM2
    GPIO_setPinConfig(GPIO_41_EPWM2_A);
    GPIO_setPinConfig(GPIO_40_EPWM2_B);
    //EPWM4
    GPIO_setPinConfig(GPIO_22_EPWM4_A);
    GPIO_setPinConfig(GPIO_7_EPWM4_B);
    EDIS;

    epwm_init(SPWM_U, 0);
    epwm_init(SPWM_V, EPWM_PHI);
    epwm_init(SPWM_W, EPWM_PHI << 1);

    // Configure and actions CMPSS
    cmpss_init();
    cmpss_actions(SPWM_U);
    cmpss_actions(SPWM_V);
    cmpss_actions(SPWM_W);
    // Clear XBARFLG1 register with CMPSS concerned (for detection => flag set 1 when comparator inputs is trigger)
    XBAR_clearInputFlag(XBAR_INPUT_FLG_CMPSS1_CTRIPH);
    XBAR_clearInputFlag(XBAR_INPUT_FLG_CMPSS1_CTRIPL);
    XBAR_clearInputFlag(XBAR_INPUT_FLG_CMPSS2_CTRIPH);
    XBAR_clearInputFlag(XBAR_INPUT_FLG_CMPSS2_CTRIPL);
    XBAR_clearInputFlag(XBAR_INPUT_FLG_CMPSS3_CTRIPH);
    XBAR_clearInputFlag(XBAR_INPUT_FLG_CMPSS4_CTRIPH);

    // Interrupts that are used (la fonction isr_adc sera appelée dans un contexte d'interruption). See PIE Channel Mapping in Peripheral Interrupts doc
    Interrupt_register(INT_EPWM1_TZ, &isr_trip_zone);
    Interrupt_enable(INT_EPWM1_TZ);

    // Set up the ADC / ePWM SOC and initialize the end of conversion
    Interrupt_register(INT_ADCC1, &isr_adc);
    adc_config(ADCA_BASE);
    adc_config(ADCC_BASE);
    adc_init_soc();
    // Enable interrupt
    Interrupt_enable(INT_ADCC1);

    Interrupt_register(INT_CANA0, &isr_can);
    CAN_enableInterrupt(CANA_BASE, CAN_INT_STATUS | CAN_INT_IE0 | CAN_INT_ERROR);
    Interrupt_enable(INT_CANA0);
    CAN_enableGlobalInterrupt(CANA_BASE, CAN_GLOBAL_INT_CANINT0);

    // Enable sync and clock to PWM
    SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_TBCLKSYNC);

    // Start CAN module operations
    CAN_startModule(CANA_BASE);

    // Enable Global Interrupt (INTM) and realtime interrupt (DBGM)
    EINT;
    ERTM;

    GPIO_setPinConfig(GPIO_14_GPIO14); // toggle pin for debug
    GPIO_setDirectionMode(14, GPIO_DIR_MODE_OUT);
    GPIO_setPadConfig(14, GPIO_PIN_TYPE_STD);
    GPIO_writePin(14, 0);

    GPIO_setPinConfig(GPIO_15_GPIO15); // toggle pin for debug
    GPIO_setDirectionMode(15, GPIO_DIR_MODE_OUT);
    GPIO_setPadConfig(15, GPIO_PIN_TYPE_STD);
    GPIO_writePin(15, 0);

    GPIO_setPinConfig(GPIO_16_GPIO16); // toggle pin for debug
    GPIO_setDirectionMode(16, GPIO_DIR_MODE_OUT);
    GPIO_setPadConfig(16, GPIO_PIN_TYPE_STD);
    GPIO_writePin(16, 0);

    GPIO_setPinConfig(GPIO_6_GPIO6); // toggle pin for debug
    GPIO_setDirectionMode(6, GPIO_DIR_MODE_OUT);
    GPIO_setPadConfig(6, GPIO_PIN_TYPE_STD);
    GPIO_writePin(6, 0);

    while(1)
    {
        monitoring_hysteresis(&mu_trac_batt_ovp, XBAR_INPUT_FLG_CMPSS1_CTRIPH, &MU_TRAC_BATT_PCH_FLT, &mu_trac_batt_state);
        //monitoring_hysteresis(&mu_fuel_cell_ovp, XBAR_INPUT_FLG_CMPSS1_CTRIPL, &MU_FUEL_CELL_PCH_FLT, &mu_fuel_cell_state);
        //monitoring_hysteresis(&mi_l_u_ocp, XBAR_INPUT_FLG_CMPSS2_CTRIPH, &MI_L_U_FLT, &mi_l_u_state);
        //monitoring_hysteresis(&mi_l_v_ocp, XBAR_INPUT_FLG_CMPSS2_CTRIPL, &MI_L_V_FLT, &mi_l_v_state);
        //monitoring_hysteresis(&mi_l_w_ocp, XBAR_INPUT_FLG_CMPSS3_CTRIPH, &MI_L_W_FLT, &mi_l_w_state);

        // Slow monitoring
        detection_coldplate(cold_plate_pin, &cold_plate_detect, &cold_plate_state_error);
        // First parameter is a structure input and the second is a global pointer to transmit to isr_timer (CAN)
        detection_contactor(&k_line_batt, &k_line_batt_state_error);
        detection_contactor(&k_line_fuel_cell, &k_line_fc_state_error);
        detection_contactor(&k_pl_batt, &k_pl_batt_state_error);
        detection_contactor(&k_pl_fuel_cell, &k_pl_fc_state_error);

        sm_main();

        // Wait while eWPM4 causes conversion and if trip zone is set shoot down ePWM
        // Trip flag is set when CTRIP signal is asserted
        if((EPWM_getTripZoneFlagStatus(SPWM_U) & EPWM_TZ_FLAG_DCBEVT1) != 0U || (EPWM_getTripZoneFlagStatus(SPWM_V) & EPWM_TZ_FLAG_DCBEVT1) != 0U || (EPWM_getTripZoneFlagStatus(SPWM_W) & EPWM_TZ_FLAG_DCBEVT1) != 0U)
        {
            // Clear trip flags
            EPWM_clearTripZoneFlag(SPWM_U, EPWM_TZ_FLAG_DCBEVT1 | EPWM_TZ_FLAG_OST);
            EPWM_clearTripZoneFlag(SPWM_V, EPWM_TZ_FLAG_DCBEVT1 | EPWM_TZ_FLAG_OST);
            EPWM_clearTripZoneFlag(SPWM_W, EPWM_TZ_FLAG_DCBEVT1 | EPWM_TZ_FLAG_OST);
        }
    }
}

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

    你好,Damien,

    感谢您发表您的问题。 我正在研究这一问题,并将在明天作出回应。

    此致,

    Marlyn

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

    你好,Damien,

    [引用 userid="489604" url="~/support/icls/c2000微控制器组/CC2000 /f/c2000微控制器-论坛/1081590/tms320f280025c-问题到配置-模拟比较器- cmps-信号触发器],通过查看数字子模块的文档,我认为我可以在 FLXARG1中注册此信息。
    这是正确的吗? [/引用]

    是的,这是正确的。 检查 CMPSSS 行程状态的另一种方法是直接读取 CMPSSS 的 COMPSTS。 您能检查一下 COMPSTS 并告诉我们它的表现吗?

    [引用 userid="489604" url="~/support/icler/c2000微控制器-组/CC2000 /f/c2000微控制器-论坛/1081590/tms320f280025c-问题到配置-模拟比较器- cmps-信号触发器"]初始化时,比较器寄存器的位是否正常,[引用1][]

    是的,这很正常。 不建议在初始化期间检查状态,因为各个模块正在通电且尚未稳定。 最好的方法是在初始化代码完成后添加延迟,清除状态标志,然后检查。

    [引用 userid="489604" url="~/support/icros/c2000-微控制器组/CC2000 /f/c2000-微控制器-论坛/1081590/tms320f280025c-问题到配置-模拟比较器- cmps-信号触发器"]

    如果我只使用函数 XBAR_clearInputFlag (XBAR_INPUM_FLG_CMSSx)将它们设置为0。 它似乎在我的代码中起作用(在某些情况下,我有一个在初始化时保持较高的输出)。

    我也无法解释这一点吗?

    [/引用]

    见上述答复。

    ~引用 userid="489604" url="µ 支持/微控制器/C2000 -微控制器组/CC2000 /f/C2000 -微控制器-论坛/1081590/tms320f280025c-问题到配置-模拟-比较器- cmps-信号触发器"]另一方面,当我触发 CMPSSS1时[例如,我无法无限重置/我的回路?]

    您如何触发和清除 CMPS1?

    [引用 userid="489604" url="~/support/icros/c2000-微控制器组/CC2000 /f/c2000-微控制器-论坛/1081590/tms320f280025c-问题到配置-模拟比较器- cmps-信号触发器"]

    寄存器 XbarRegs.XBARFLG1.bit 中的位仍为1。 我使用函数 XBAR_getInputFlagStatus(x)来知道触发了哪个比较器。

    在初始化时,我想通过  XBAR_ClearInputFlag 重置 CMPSSS 输出,但我遇到一个问题,即在重置功能后,一个或两个输出处于较高水平(请参阅屏幕截图)。

    [/引用]

    当 cmpss 初始化代码完成后,您需要添加延迟。 cmpss 有加电时间。 10毫秒的延迟应该足够。

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

    你好,弗兰克,

    感谢您的回复,这有助于我理解。

    我有疑问:  

    我有信号通过 InputXbar 和其他使用 CMPSS 的人触发我的跳闸区,因此他们会通过 EPWMX-bar。

    我使用这些信号时没有打断我的 ePWM 的切断。 现在,我想用中断来使用它们。 我使用 INT_EPWM2_TZ =>来自输入 Xbar 和 INT_EPWM1_TZ 的信号为 CMSS 配置了中断。 中断运行良好,但在用户确认后不会重新启动。
    使用 XBAR_ClearInputFlag()将 XBARFLG1寄存器中的标志重置为0,但 TZEINT 寄存器未重置为0,这是否是原因?

    我使用此函数 ePWM_clearTripZoneFlag,该函数在理论上作用于 TZEINT 寄存器,但不起作用。
    我忘记了一步吗?

    意料之中

    谢谢

    达米恩

    您可以看到我的代码的摘录:

    if(mi_l_u_state == PROTECTION_DETECTED)
        {
            step_global = STATE_GLOBAL_FAULT;
            step_fault = STEP_CONVERTER_INH;
            if(ack_inh_converter == 1)
            {
                step_fault = STEP_OPEN_K_LINE_FC_CONTACTOR;
                if(ack_open_k_line_fc == 1)
                {
                    step_fault = STEP_NONE;
                    ack_inh_converter = 0;
                    ack_open_k_line_fc = 0;
                    if(ack_ok == 1)
                    {
                        // Clear XBARFLG1 and TZCLR register
                        XBAR_clearInputFlag(XBAR_INPUT_FLG_CMPSS2_CTRIPH);
                        EPWM_clearTripZoneFlag(SPWM_U, EPWM_TZ_FLAG_DCBEVT1);
                        EPWM_clearTripZoneFlag(SPWM_V, EPWM_TZ_FLAG_DCBEVT1);
                        EPWM_clearTripZoneFlag(SPWM_W, EPWM_TZ_FLAG_DCBEVT1);
                        // ePWM are set ON with the duty cycle desire.
                        epwm_cmpa = epwm_get_cmpa_from_dutycyle(SPWM_U, epwm_dutycyle);
                        EPWM_setCounterCompareValue(SPWM_U, EPWM_COUNTER_COMPARE_A, epwm_cmpa);
                        EPWM_setCounterCompareValue(SPWM_V, EPWM_COUNTER_COMPARE_A, epwm_cmpa);
                        EPWM_setCounterCompareValue(SPWM_W, EPWM_COUNTER_COMPARE_A, epwm_cmpa);
                        step_global = STATE_GLOBAL_STANDBY;
                        mi_l_u_state = PROTECTION_OK;
                    }
                }
            }
        }

        epwm_init(SPWM_U, 0);
        epwm_init(SPWM_V, EPWM_PHI);
        epwm_init(SPWM_W, EPWM_PHI << 1);
    
        // Configure and actions CMPSS
        cmpss_init();
        cmpss_actions(SPWM_U);
        cmpss_actions(SPWM_V);
        cmpss_actions(SPWM_W);
        // Clear XBARFLG1 register with CMPSS concerned (for detection => flag set 1 when comparator inputs is trigger). Add delay after reset and then clear status flag (power up time).
        DEVICE_DELAY_US(10000);
        XBAR_clearInputFlag(XBAR_INPUT_FLG_CMPSS1_CTRIPH);
        XBAR_clearInputFlag(XBAR_INPUT_FLG_CMPSS1_CTRIPL);
        XBAR_clearInputFlag(XBAR_INPUT_FLG_CMPSS2_CTRIPH);
        XBAR_clearInputFlag(XBAR_INPUT_FLG_CMPSS2_CTRIPL);
        XBAR_clearInputFlag(XBAR_INPUT_FLG_CMPSS3_CTRIPH);
        XBAR_clearInputFlag(XBAR_INPUT_FLG_CMPSS4_CTRIPH);
    
        // Interrupts that are used. See PIE Channel Mapping in Peripheral Interrupts doc
        // DRV to trip zone
        Interrupt_register(INT_EPWM2_TZ, &isr_return_driver);
        Interrupt_enable(INT_EPWM2_TZ);
        // CMPSS to trip zone
        Interrupt_register(INT_EPWM1_TZ, &isr_cmpss);
        Interrupt_enable(INT_EPWM1_TZ);
    

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

    下面是我的 GPIO => InputXbar 跳闸区域配置

    无效的 Trip 区域配置(void)

    // DRV-U 信号到跳闸区
    GPIO 设置引脚配置(GPIO_45_GPIO45);
    GPIO 设置导向模式(45,GPIO _DIR_MODE_In);
    GPIO 设置 PadConfig (45,GPIO 引脚类型标准);

    // DRV-V 信号到跳闸区
    GPIO 设置引脚配置(GPIO_5_GPIO5);
    GPIO 设置导向模式(5,GPIO _DIR_MODE_In);
    GPIO 设置 PadConfig(5,GPIO 引脚类型标准);

    // DRV-W 信号到跳闸区
    GPIO 设置引脚配置(GPIO_9_GPIO9);
    GPIO 设置导向模式(9,GPIO _DIR_MODE_In);
    GPIO _setPadConfig(9,GPIO 引脚型标准);

    Xbar_setInputPin (INPUTXBA_BASE,XBAR_Input1,45);
    Xbar_setInputPin (INPUTXBA_BASE,XBAR_INPUT2,5);
    Xbar_setInputPin (INPUTXBA_BASE,XBAR_INPUT3,9);

    //启用 TZx 作为单次激发跳闸源
    // DRV_U 的 TZ1
    ePWM_enableTripZoneSignals (SPWM_U,ePWM_TZ_SIGNAL_OSHT1);
    ePWM_enableTripZoneSignals (SPWM_V,ePWM_TZ_SIGNAL_OSHT1);
    ePWM_enableTripZoneSignals (SPWM_W,ePWM_TZ_SIGNAL_OSHT1);

    // DRV_V 的 TZ2
    ePWM_enableTripZoneSignals (SPWM_U,ePWM_TZ_SIGNAL_OSHT2);
    ePWM_enableTripZoneSignals (SPWM_V,ePWM_TZ_SIGNAL_OSHT2);
    ePWM_enableTripZoneSignals (SPWM_W,ePWM_TZ_SIGNAL_OSHT2);

    // DRV_W 的 TZ3
    ePWM_enableTripZoneSignals (SPWM_U,ePWM_TZ_SIGNAL_OSHT3);
    ePWM_enableTripZoneSignals (SPWM_V,ePWM_TZ_SIGNAL_OSHT3);
    ePWM_enableTripZoneSignals (SPWM_W,ePWM_TZ_SIGNAL_OSHT3);

    //对 TZx 的操作
    ePWM_setTripZoneAction (SPWM_U,ePWM_TZ_action_event_TZA,ePWM_TZ_action_high);
    ePWM_setTripZoneAction (SPWM_V,ePWM_TZ_action_event_TZA,ePWM_TZ_action_high);
    ePWM_setTripZoneAction (SPWM_W,ePWM_TZ_action_event_TZA,ePWM_TZ_action_high);

    ePWM_enableTripZoneInterrupt (SPWM_U,ePWM_TZ_Interrupt _OST);
    ePWM_enableTripZoneInterrupt (SPWM_V,ePWM_TZ_Interrupt _OST);
    ePWM_enableTripZoneInterrupt (SPWM_W,ePWM_TZ_Interrupt _OST);
    }

    中断 void ISR_RETURE_DRIVER (void)

    GPIO 写入引脚(14,1);
    DEVICE_DELAY _US (10);
    GPIO 写入引脚(14,0);
    //确认此中断以从组2接收更多中断
    interrup_clearACKGroup (interrup_ACK_group2);
    }

    Interrupt_register(INT_EPWM2_TZ, &isr_return_driver);
    Interrupt_enable(INT_EPWM2_TZ);
    // CMPSS to trip zone
    Interrupt_register(INT_EPWM1_TZ, &isr_cmpss);
    Interrupt_enable(INT_EPWM1_TZ);

    和 CMPSSS 配置:

    void cmpss_actions(uint32_t base)
    {
        // Configure ePWMx 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);
        EPWM_enableDigitalCompareTripCombinationInput(base, EPWM_DC_COMBINATIONAL_TRIPIN5, EPWM_DC_TYPE_DCBH);
        EPWM_enableDigitalCompareTripCombinationInput(base, EPWM_DC_COMBINATIONAL_TRIPIN7, EPWM_DC_TYPE_DCBH);
        EPWM_enableDigitalCompareTripCombinationInput(base, EPWM_DC_COMBINATIONAL_TRIPIN8, EPWM_DC_TYPE_DCBH);
        EPWM_enableDigitalCompareTripCombinationInput(base, EPWM_DC_COMBINATIONAL_TRIPIN9, EPWM_DC_TYPE_DCBH);
        EPWM_enableDigitalCompareTripCombinationInput(base, EPWM_DC_COMBINATIONAL_TRIPIN10, EPWM_DC_TYPE_DCBH);
    
        // Enable DCB as DCBEVT1
        EPWM_enableTripZoneSignals(base, EPWM_TZ_SIGNAL_DCBEVT1);
        // Enable interrupt
        EPWM_enableTripZoneInterrupt(SPWM_U, EPWM_TZ_INTERRUPT_DCBEVT1);
        EPWM_enableTripZoneInterrupt(SPWM_V, EPWM_TZ_INTERRUPT_DCBEVT1);
        EPWM_enableTripZoneInterrupt(SPWM_W, EPWM_TZ_INTERRUPT_DCBEVT1);
        // Clear trip flags
        EPWM_clearTripZoneFlag(base, EPWM_TZ_FLAG_DCBEVT1);
    }
    
    __interrupt void isr_cmpss(void)
    {
        GPIO_writePin(15, 1);
        // Acknowledge this interrupt to receive more interrupts from group 2
        DEVICE_DELAY_US(10);
        GPIO_writePin(15, 0);
        Interrupt_clearACKGroup(INTERRUPT_ACK_GROUP2);
    }
    

    我想生成两个独立的中断:  

    InputXbar => TZ 中断 OST 和 CMPSSS => EpwmXbar => Tripzone => DCBEVT1。 不可能? 我的代码中有错误? 配置?

    可以帮帮我吗?

    关于中断表,名称 INT_ePWMx_TZ 只是名称,因为跳闸区域的操作是在配置中定义的,对吗?
    以下是从标题文件中提取的内容
    #define INT_EPWM1_TZ 0x00280201U // 2.1 - ePWM1跳闸区域中断
    #define INT_EPWM2_TZ 0x00290202U// 2.2 - ePWM2跳闸区域中断
    #define INT_EPWM3_TZ 0x002A203U // 2.3 - ePWM3跳闸区域中断
    #define INT_EPWM4_TZ 0x002B0204U // 2.4 - ePWM4跳闸区域中断
    #define INT_EPWM5_TZ 0x002C0205U // 2.5 - ePWM5跳闸区域中断
    #define INT_EPWM6_TZ 0x002D0206U // 2.6 - ePWM6跳闸区域中断
    #define INT_EPWM7_TZ 0x002E0207U // 2.7 - ePWM7跳闸区域中断
    我们可以在同一中断上关闭多个 PWM 信号吗?

    很抱歉创建了两个帖子,我对这两个帖子都有疑问,谢谢

    达米恩

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

    你好,Damien,

    为了避免偏离轨道,让我们一次解决一个问题?

    [引用 userid="489604" url="~/support/icros/c2000微控制器-组/CC2000 /f/c2000微控制器-论坛/1081590/tms320f280025c-问题到配置-模拟比较器- cmps-信号触发器/4010417#4010417 "]

    我使用这些信号时没有打断我的 ePWM 的切断。 现在,我想用中断来使用它们。 我使用 INT_EPWM2_TZ =>来自输入 Xbar 和 INT_EPWM1_TZ 的信号为 CMSS 配置了中断。 中断运行良好,但在用户确认后不会重新启动。
    使用 XBAR_ClearInputFlag()将 XBARFLG1寄存器中的标志重置为0,但 TZEINT 寄存器未重置为0,这是否是原因?

    我使用此函数 ePWM_clearTripZoneFlag,该函数在理论上作用于 TZEINT 寄存器,但不起作用。
    我忘记了一步吗?

    [/引用]

    我认为这是因为您没有清除 TZFLG 的“INT”字段。 在清除 TZFLG.INT 之前,不会再生成任何中断。 您还可以参考这个 C2000Ware 示例,该示例与您正在执行的操作非常相似->“C2000Ware_version\driverlib\f28002x\examples\ePWM\ePWM_ex1_TRIP 区域.c”

    一旦您确认上述问题已解决,我们可以查看您的另一个问题。

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

    你好,弗兰克,

    感谢您的回复,是的,请逐步回答! 事实上,在我的跳闸区域第一个中断结束时,我忘了用 TZCLR 重置 TZFLG 寄存器: ePWM_clearTripZoneFlag(SPWM_U,(ePWM_TZ_interrupt | ePWM_TZ_FLAG_CBC))

    在这一部分工作正常,当 GPIO 设置为0时,它会关闭我的 ePWM,我在中断中输入,以便在我的项目中记录事件日志时获得屏幕截图。

    TZ 信号不必通过数字比较模块? 这就是我对它的理解,我已经对它进行了配置,以便 DCxEVTx 事件不会被激活? 为了在 InputXbar 和 EpwmXbar 之间有两个独立的中断,我只想在这些事件上配置来自 ePWMXbar 的信号。 这样做是否正确? 我使用 InputXbar 信号作为驾驶员反馈,CMPSSS 用于不同的安全性(过电压...)。
    我对这一数字比较模块的想法不是很清楚,即使我看了文档。

    对于 EPwmXbar 信号,我只能使用 DCBEVTx? 如果我正确理解 DC 子模块。 那么为什么它不能用于我的配置? 您可以看到我的代码:

    void cmpss_actions(uint32_t base)
    {
        // Configure ePWMx 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 TRIPINx as an input
        EPWM_enableDigitalCompareTripCombinationInput(base, EPWM_DC_COMBINATIONAL_TRIPIN4, EPWM_DC_TYPE_DCBH);
        EPWM_enableDigitalCompareTripCombinationInput(base, EPWM_DC_COMBINATIONAL_TRIPIN5, EPWM_DC_TYPE_DCBH);
        EPWM_enableDigitalCompareTripCombinationInput(base, EPWM_DC_COMBINATIONAL_TRIPIN7, EPWM_DC_TYPE_DCBH);
        EPWM_enableDigitalCompareTripCombinationInput(base, EPWM_DC_COMBINATIONAL_TRIPIN8, EPWM_DC_TYPE_DCBH);
        EPWM_enableDigitalCompareTripCombinationInput(base, EPWM_DC_COMBINATIONAL_TRIPIN9, EPWM_DC_TYPE_DCBH);
        EPWM_enableDigitalCompareTripCombinationInput(base, EPWM_DC_COMBINATIONAL_TRIPIN10, EPWM_DC_TYPE_DCBH);
    
        // Enable DCB as DCBEVT1
        EPWM_enableTripZoneSignals(base, EPWM_TZ_SIGNAL_DCBEVT2);
        // Enable interrupt
        EPWM_enableTripZoneInterrupt(base, EPWM_TZ_INTERRUPT_DCBEVT2);
        // Clear trip flags
        //EPWM_clearTripZoneFlag(base, EPWM_TZ_FLAG_DCBEVT2);
    }
    
    // Interrupt to have a photo for event log
    __interrupt void isr_cmpss(void)
    {
        GPIO_writePin(15, 1);
    
        // Acknowledge this interrupt to receive more interrupts from group 2
        GPIO_writePin(15, 0);
        EPWM_clearTripZoneFlag(SPWM_U, (EPWM_TZ_INTERRUPT | EPWM_TZ_INTERRUPT_DCBEVT2));
        EPWM_clearTripZoneFlag(SPWM_V, (EPWM_TZ_INTERRUPT | EPWM_TZ_INTERRUPT_DCBEVT2));
        EPWM_clearTripZoneFlag(SPWM_W, (EPWM_TZ_INTERRUPT | EPWM_TZ_INTERRUPT_DCBEVT2));
        Interrupt_clearACKGroup(INTERRUPT_ACK_GROUP2);
    }
    oid trip_zone_config(void)
    {
        // DRV-U signals to trip zone
        GPIO_setPinConfig(GPIO_45_GPIO45);
        GPIO_setDirectionMode(45, GPIO_DIR_MODE_IN);
        GPIO_setPadConfig(45, GPIO_PIN_TYPE_STD);
    
        // DRV-V signals to trip zone
        GPIO_setPinConfig(GPIO_5_GPIO5);
        GPIO_setDirectionMode(5, GPIO_DIR_MODE_IN);
        GPIO_setPadConfig(5, GPIO_PIN_TYPE_STD);
    
        // DRV-W signals to trip zone
        GPIO_setPinConfig(GPIO_9_GPIO9);
        GPIO_setDirectionMode(9, GPIO_DIR_MODE_IN);
        GPIO_setPadConfig(9, GPIO_PIN_TYPE_STD);
    
        XBAR_setInputPin(INPUTXBAR_BASE, XBAR_INPUT1, 45);
        XBAR_setInputPin(INPUTXBAR_BASE, XBAR_INPUT2, 5);
        XBAR_setInputPin(INPUTXBAR_BASE, XBAR_INPUT3, 9);
    
        // Enable TZx as cycle by cycle trip sources
        // TZ1 for DRV_U
        EPWM_enableTripZoneSignals(SPWM_U, EPWM_TZ_SIGNAL_CBC1);
        EPWM_enableTripZoneSignals(SPWM_V, EPWM_TZ_SIGNAL_CBC1);
        EPWM_enableTripZoneSignals(SPWM_W, EPWM_TZ_SIGNAL_CBC1);
    
        // TZ2 for DRV_V
        EPWM_enableTripZoneSignals(SPWM_U, EPWM_TZ_SIGNAL_CBC2);
        EPWM_enableTripZoneSignals(SPWM_V, EPWM_TZ_SIGNAL_CBC2);
        EPWM_enableTripZoneSignals(SPWM_W, EPWM_TZ_SIGNAL_CBC2);
    
        // TZ3 for DRV_W
        EPWM_enableTripZoneSignals(SPWM_U, EPWM_TZ_SIGNAL_CBC3);
        EPWM_enableTripZoneSignals(SPWM_V, EPWM_TZ_SIGNAL_CBC3);
        EPWM_enableTripZoneSignals(SPWM_W, EPWM_TZ_SIGNAL_CBC3);
    
        // Action on TZx
        EPWM_setTripZoneAction(SPWM_U, EPWM_TZ_ACTION_EVENT_TZA, EPWM_TZ_ACTION_HIGH);
        EPWM_setTripZoneAction(SPWM_V, EPWM_TZ_ACTION_EVENT_TZA, EPWM_TZ_ACTION_HIGH);
        EPWM_setTripZoneAction(SPWM_W, EPWM_TZ_ACTION_EVENT_TZA, EPWM_TZ_ACTION_HIGH);
    
        EPWM_enableTripZoneInterrupt(SPWM_U, EPWM_TZ_INTERRUPT_CBC);
        EPWM_enableTripZoneInterrupt(SPWM_V, EPWM_TZ_INTERRUPT_CBC);
        EPWM_enableTripZoneInterrupt(SPWM_W, EPWM_TZ_INTERRUPT_CBC);
    }
    
    __interrupt void isr_return_driver(void)
    {
        GPIO_writePin(14, 1);
        DEVICE_DELAY_US(10);
        GPIO_writePin(14, 0);
        //Clear the flags, we will continue to take this interrupt until the TZ pin goes high.
        EPWM_clearTripZoneFlag(SPWM_U, (EPWM_TZ_INTERRUPT | EPWM_TZ_FLAG_CBC));
        EPWM_clearTripZoneFlag(SPWM_V, (EPWM_TZ_INTERRUPT | EPWM_TZ_FLAG_CBC));
        EPWM_clearTripZoneFlag(SPWM_W, (EPWM_TZ_INTERRUPT | EPWM_TZ_FLAG_CBC));
        // Acknowledge this interrupt to receive more interrupts from group 2
        Interrupt_clearACKGroup(INTERRUPT_ACK_GROUP2);
    }

    谢谢达米恩

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

    我在问题上取得了进展: 当我在主控制器中脱机时,第一个中断只设置了 inputtxbar 中断,在 TZFLG CBC.bit 中工作正常,INT.bit 在输入设置为0时设置,在输入设置为1时重置,并正确关闭 ePWM 时设置。  关于另一个 ePWMXbar 中断,我在配置 PWM_setTripZoneDigitalCompareEventCondition:ePWM_TZ_DC_OUTPUT _B1中犯了错误,而我使用 ePWM_TZ_SIGNAL_DCBEVT2。因此我更改 了 ePWM_TZ_DC_OUTPUT _B2。 现在,在 TZFLG 寄存器中,当进入中断并在之后重置时,DCBEVT2设置为1。

    但当 EPwmXbar 输入设置为0时,TZFLG.Bit.CBC 和  TZFLG.Bit.INT 总是为1原因?

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

    你好,Damien,

    您是否有系统的高级图表? 如果不是,这是你可以创造和提供给我们的东西吗? 我认为这将使我们更容易弥合您的想法与如何实施代码之间的差距。

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

    你(们)好  

    今晚我将能够为你们做这件事,这很复杂。 为了给我的系统带来启发,这是一个高功率转换器,我将输入 TZ1和 TZ3上的半导体驱动器的返回与 CMPSS 等的电压安全连接。 我独立隔离了这两个中断,效果很好,寄存器 TZFLG.Bit.CBC 和 TZFLG.Bit.INT 在1时,当我只激活与信号 TZ1到 TZ3相连的中断,然后当输出禁用 TZ 信号时重置为0。 对于链接到 CMPSSS 的中断,我已经使用 DCBEVT2配置了 CMPSSS,并且在寄存器中,当这些中断仅被触发而不是 TZ 时,TZFLG.Bit.DCBEVT2和 TZFLG.Bit.CBC 位处于活动状态。 您将在之前的交易中找到我的代码的一部分。
    总结我的系统:我只使用中断来获取事件日志,并在故障期间显示变量的状态。
    我的信号 TZ1至 TZ3和来自 EpWmXbar 的信号可能有两个独立的中断,不是吗?
    您能帮我解决我之前的问题吗?

    谢谢
    达米恩

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

    你好,Damien,

    [引用 userid="489604" url="~/support/icros/c2000微控制器-组/CC2000 /f/c2000微控制器-论坛/1081590/tms320f280025c-问题到配置-模拟-比较器-cmps-信号触发器/4012616#4012616"]我将能够立即为您执行此操作[引用/今晚的内容]。

    这一点不必详细。 只是对连接的高度概述。

    [引用 userid="489604" url="~/support/icls/c2000-iclers-group/c2f/c2000微控制器-forum/1081590/tms320f280025c-问题到配置-模拟比较器-cmpsz1-signals-trigger/4012616#4012616]*,以通过连接到 TSS 的高压转换器上的 TSS 输入向系统供电,并通过 TSS 驱动器在 TSS3上输出电压转换器返回。 我独立隔离了这两个中断,效果很好,寄存器 TZFLG.Bit.CBC 和 TZFLG.Bit.INT 在1时,当我只激活与信号 TZ1到 TZ3相连的中断,然后当输出禁用 TZ 信号时重置为0。 [/引用]

    这是有道理的。

    [引用 userid="489604" url="~/support/微控制器/C2000 -微控制器组/CC2000 /f/C2000 -微控制器-论坛/1081590/tms320f280025c-问题到配置-模拟-比较器-cmps-信号触发器/4012616#4012616]CMPLG.在没有在 CMPZBC.TSS 中激活并在 CVP2位和 CVP2中进行配置的情况下,且没有在 CMPBC.DBC.DBC.DBC.DBC.DBC.DBC.DBC.DBC.DBC.DBC.Z加以 触发的情况下对连接到 CSS. 您将在之前的交易中找到我的代码的一部分。

    这也是有道理的。

    [引用 userid="489604" url="~/support/icros/c2000微控制器-组/CC2000 /f/c2000微控制器-论坛/1081590/tms320f280025c-问题到配置-模拟-比较器-cmps-信号触发器/4012616#4012616"]来总结我的系统:我只使用日志和引用事件变量来获取故障数据和事件变量[。]

    好的。 您是否只对生成中断感兴趣,或者是否让这些 TZ 信号关闭 PWM?

    [引用 userid="489604" url="~/support/iclers/C2000-icler-group/c2000 /f/c2000微控制器-forum/1081590/tms320f280025c-问题到配置-模拟比较器-cmpz1-signals-rigger/4012616#4012616"]信号可能有两个独立的中断来自 Epbar[和 Zwss]。

    每个 ePWM 有一个 TZ 中断。 但是,您可以通过 TZCBCFLG 和 TZOSTFLG 寄存器确定触发器的 TZ 原因。

    对您之前问题的回答:

    [引用 userid="489604" url="~/support/icros/c2000微控制器-组/CC2000 /f/c2000微控制器-论坛/1081590/tms320f280025c-问题到配置-模拟比较器- cmps-信号触发器/4011846#4011846"] TZ 信号不必通过数字模块进行比较[引用]

    正确。 TZ 信号不必通过 DC 模块。

    [引用 userid="489604" url="~/support/icros/c2000微控制器-组/CC2000 /f/c2000微控制器-论坛/1081590/tms320f280025c-问题到配置-模拟-比较器-cmps-信号触发器/4011846#4011846"],我理解这一点,并且没有激活 DCxTx 事件? 为了在 InputXbar 和 EpwmXbar 之间有两个独立的中断,我只想在这些事件上配置来自 ePWMXbar 的信号。 这是正确的做法吗?

    见上一份答复。 每个 ePWM 有一个 TZ 中断,但您始终可以通过各种标志寄存器找出中断源。

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

    好的。 您是否只对生成中断感兴趣,或者是否让这些 TZ 信号关闭 PWM?

    回复:是的,TZ 信号关闭 PWM 并为事件触发器生成中断。 现在对我来说更清楚了,它运行得很好。

    但我有一个与本主题相关的新问题,我实时使用 CCS 工作室在调试模式下可视化寄存器和变量。 它在清除 TZFLGCBC 寄存器之前运行,这是否巧合? 因为我收到错误消息:  

    读取寄存器 PC 时遇到问题:
    (错误-1142 @ 0x0)
    设备阻止调试访问,因为它当前正在执行不可调试的代码。 选择“粗鲁重试”以禁用礼貌模式并强制操作。
    (仿真包9.4.0.00129)

    我尝试了几次操纵,但没有任何结论。 如果我只重置了 TZFLGCBC 寄存器上的一个标志,该模式就会工作

    如果我将此配置设置为无效,原因是什么?

    __interrupt void isr_trip_zone(void)
    {
        GPIO_writePin(14, 1);
    
        // Clear the flags, we will continue to take this interrupt until the TZ pin goes high.
        EPWM_clearTripZoneFlag(SPWM_U, (EPWM_TZ_INTERRUPT | EPWM_TZ_FLAG_CBC | EPWM_TZ_FLAG_DCBEVT2));
        EPWM_clearTripZoneFlag(SPWM_V, (EPWM_TZ_INTERRUPT | EPWM_TZ_FLAG_CBC | EPWM_TZ_FLAG_DCBEVT2));
        EPWM_clearTripZoneFlag(SPWM_W, (EPWM_TZ_INTERRUPT | EPWM_TZ_FLAG_CBC | EPWM_TZ_FLAG_DCBEVT2));
    
        if(EPWM_getCycleByCycleTripZoneFlagStatus(SPWM_U) == EPWM_TZ_CBC_FLAG_1)
        {
            EPWM_clearCycleByCycleTripZoneFlag(SPWM_U ,EPWM_TZ_CBC_FLAG_1);
            EPWM_clearCycleByCycleTripZoneFlag(SPWM_V ,EPWM_TZ_CBC_FLAG_1);
            EPWM_clearCycleByCycleTripZoneFlag(SPWM_W ,EPWM_TZ_CBC_FLAG_1);
        }
        if(EPWM_getCycleByCycleTripZoneFlagStatus(SPWM_U == EPWM_TZ_CBC_FLAG_2))
        {
            EPWM_clearCycleByCycleTripZoneFlag(SPWM_U ,EPWM_TZ_CBC_FLAG_2);
            EPWM_clearCycleByCycleTripZoneFlag(SPWM_V ,EPWM_TZ_CBC_FLAG_2);
            EPWM_clearCycleByCycleTripZoneFlag(SPWM_W ,EPWM_TZ_CBC_FLAG_2);
        }
        if(EPWM_getCycleByCycleTripZoneFlagStatus(SPWM_U == EPWM_TZ_CBC_FLAG_3))
        {
            EPWM_clearCycleByCycleTripZoneFlag(SPWM_U ,EPWM_TZ_CBC_FLAG_3);
            EPWM_clearCycleByCycleTripZoneFlag(SPWM_V ,EPWM_TZ_CBC_FLAG_3);
            EPWM_clearCycleByCycleTripZoneFlag(SPWM_W ,EPWM_TZ_CBC_FLAG_3);
        }
        if(EPWM_getCycleByCycleTripZoneFlagStatus(SPWM_U == EPWM_TZ_CBC_FLAG_DCBEVT2))
        {
            EPWM_clearCycleByCycleTripZoneFlag(SPWM_U ,EPWM_TZ_CBC_FLAG_DCBEVT2);
            EPWM_clearCycleByCycleTripZoneFlag(SPWM_V ,EPWM_TZ_CBC_FLAG_DCBEVT2);
            EPWM_clearCycleByCycleTripZoneFlag(SPWM_W ,EPWM_TZ_CBC_FLAG_DCBEVT2);
        }
        GPIO_writePin(14, 0);
    
        // Acknowledge this interrupt to receive more interrupts from group 2
        Interrupt_clearACKGroup(INTERRUPT_ACK_GROUP2);
    }
    

    感谢您的反馈,

    达米恩

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

    达米恩,

    [引用 userid="489604" url="~/support/icros/c2000微控制器-组/CC2000 /f/c2000微控制器-论坛/1081590/tms320f280025c-问题到配置-模拟比较器- cmps-信号触发器/4013464#4013464]reply:是,TZ 生成中断事件关闭信号和 PWM 信号。 现在对我来说更清楚了,运行良好。

    好的,这个部件现在就解决了吗?

    [引用 userid="489604" url="~/support/icros/c2000微控制器-组/CC2000 /f/c2000微控制器-论坛/1081590/tms320f280025c-问题到配置-模拟比较器- cmps-信号触发器/4013464#4013464"]

    但我有一个与本主题相关的新问题,我实时使用 CCS 工作室在调试模式下可视化寄存器和变量。 它在清除 TZFLGCBC 寄存器之前运行,这是否巧合? 因为我收到错误消息:  

    读取寄存器 PC 时遇到问题:
    (错误-1142 @ 0x0)
    设备阻止调试访问,因为它当前正在执行不可调试的代码。 选择“粗鲁重试”以禁用礼貌模式并强制操作。
    (仿真包9.4.0.00129)

    我尝试了几次操纵,但没有任何结论。 如果我只重置了 TZFLGCBC 寄存器上的一个标志,该模式就会工作

    如果我将此配置设置为无效,原因是什么?

    [/引用]

    我对这个问题不太清楚。 在“清除 TZFLGCBC 注册”之前运行了什么? 您能否概述您执行的导致此错误的确切步骤?

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

    你好,弗兰克,

    感谢你的回复。 是的,第一部分现在已经解决了,对我来说已经很清楚了。

    激活实时模式后,我再也没有问题了,我不明白我要放弃的原因,我会继续我的发展,如果问题再次出现,我会在以后再回来。 感谢您的解释。

    达米恩

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

    你好,Damien,

    很高兴能提供帮助。 如果您遇到了更多问题,请告诉我们。