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.

[参考译文] LAUNCHXL-F280039C:PWM DCA/B_CTRL EVT1LAT 信号周期异步模式、TZOST 未锁存

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1618804/launchxl-f280039c-pwm-dca-b_ctrl-evt1lat-signal-cycles-async-mode-tzost-not-latched

器件型号: LAUNCHXL-F280039C

您好:

我们已经发现 PWM 模块直流控制寄存器位和 TZOST 标志在组合或'TZOST 任务事件中没有相应地发挥作用。

当 TZ7、TZ8、TZ9 组合用于 PWM A1 B1 输出的单次 DOST EVENT1 跳闸时,只有一个 TZ 可以在 XBar 模拟多路复用器链接到 CMPSSn 时单独运行。 CMPSS 锁存事件在组合直流配置的跳闸中作为单个 TZ 操作置位、并且不会停止其他两个配置的 TZ 的 PWM 操作限定符中的进一步输出。

在 PWM 配置最后启用 dc.force 位时、它会通过 x39c 器件 driverlib 调用覆盖 DC 滤波位。 这应该是对来自 CPMSS 模块的异步滤波信号的 OR'd 功能。 但是、当对于启用 SYNC 位的滤波跳闸信号、只对多路复用 CMPSSn 设置一个操作时、EVT1LAT 位周期就像发生 CBC EVENT2 一样、再次仅循环向 CCS 调试寄存器显示的 OST 标志视图中未显示的 OST 标志。3 个 PWM 发生器的 A1 B1 输出不在组合 OR TZ 跳闸配置中执行操作。  

DCA/BCTRL 寄存器同步位启用时是否会导致同步事件、而不是异步 A1/B1 事件、这与设置时 PWM 寄存器的状态相反?

是什么导致 EVT1LAT 位像发生 CMPSSn RS 数字滤波器同步复位或锁存输出那样循环?

为 3 TZOST 配置时、为什么在组合 TZ 动作限定器中只循环使用一个 TZ 标志?

 奇数部分是从 CMPSS 滤波信号或锁存输出配置进行 LAT 位循环、不能保护直流逆变器免受一次过流事件的影响! 在这种情况下、如果不将 CMPSSn 数字滤波器窗口设置为接近其范围峰值的>28 来停止 LAT 位循环、则无法通过 UMCSDK 启动电机。 因此、我们没有真正的过流保护、因为组合的 TZ7、TZ8、TZ9 在它们应该是 OR'd 操作时会单独作用!

#else
        // Trigger event when DCA1 is High
        EPWM_setTripZoneDigitalCompareEventCondition(obj->pwmHandle[cnt],
                                                     EPWM_TZ_DC_OUTPUT_A1,
                                                     EPWM_TZ_EVENT_DCXH_HIGH);

        // Trigger event when DCB1 is High
        EPWM_setTripZoneDigitalCompareEventCondition(obj->pwmHandle[cnt],
                                                     EPWM_TZ_DC_OUTPUT_B1,
                                                     EPWM_TZ_EVENT_DCXH_HIGH);

#endif

        /* Set DC-1A filter input event source */
        EPWM_setDigitalCompareFilterInput(obj->pwmHandle[cnt], EPWM_DC_WINDOW_SOURCE_DCAEVT1);

        /* Set DC-1B filter input event source */
        EPWM_setDigitalCompareFilterInput(obj->pwmHandle[cnt], EPWM_DC_WINDOW_SOURCE_DCBEVT1);


        EPWM_setDigitalCompareEventSyncMode(obj->pwmHandle[cnt],
                                            EPWM_DC_MODULE_A,
                                            EPWM_DC_EVENT_1,
                                            EPWM_DC_EVENT_INPUT_NOT_SYNCED);

        EPWM_setDigitalCompareEventSyncMode(obj->pwmHandle[cnt],
                                            EPWM_DC_MODULE_B,
                                            EPWM_DC_EVENT_1,
                                            EPWM_DC_EVENT_INPUT_NOT_SYNCED);


        // 03/10/25: Configure the DCA path to be filtered latch forces DCAEVT1
        EPWM_setDigitalCompareEventSource(obj->pwmHandle[cnt],
                                          EPWM_DC_MODULE_A,
                                          EPWM_DC_EVENT_1,
                                          EPWM_DC_EVENT_FLTLATCH_DCEVT1FORCE);

        // 03/10/25: Configure the DCB path to be filtered latch forces DCBEVT1
        EPWM_setDigitalCompareEventSource(obj->pwmHandle[cnt],
                                          EPWM_DC_MODULE_B,
                                          EPWM_DC_EVENT_1,
                                          EPWM_DC_EVENT_FLTLATCH_DCEVT1FORCE);

        // Configure the Digital CMPSS filter bit, not the Async original signal
        EPWM_setDigitalCompareEventSource(obj->pwmHandle[cnt],
                                          EPWM_DC_MODULE_A,
                                          EPWM_DC_EVENT_1,
                                          EPWM_DC_EVENT_SOURCE_FILT_SIGNAL);
        //EPWM_DC_EVENT_SOURCE_FILT_SIGNAL EPWM_DC_EVENT_SOURCE_ORIG_SIGNAL

        // Configure the Digital CMPSS filter bit, not the Async original
        EPWM_setDigitalCompareEventSource(obj->pwmHandle[cnt],
                                          EPWM_DC_MODULE_B,
                                          EPWM_DC_EVENT_1,
                                          EPWM_DC_EVENT_SOURCE_FILT_SIGNAL);
        //EPWM_DC_EVENT_SOURCE_FILT_SIGNAL EPWM_DC_EVENT_SOURCE_ORIG_SIGNAL


        // What do we want the OST/CBC events to do?
        // 9.2.1.1 ePWM X-BAR Architecture Table:9-2
        // TZA events can force EPWMxA from ePWM-xBAR MUX to DCA
        // TZB events can force EPWMxB from ePWM-xBAR MUX to DCB

        // First disable any Advanced TZ actions
        EPWM_disableTripZoneAdvAction(obj->pwmHandle[cnt]);

        EPWM_setTripZoneAction(obj->pwmHandle[cnt],
                               EPWM_TZ_ACTION_EVENT_TZA,
                                        EPWM_TZ_ACTION_LOW);
        //
        EPWM_setTripZoneAction(obj->pwmHandle[cnt],
                               EPWM_TZ_ACTION_EVENT_DCAEVT1,
                                        EPWM_TZ_ACTION_LOW);
        //EPWM_TZ_ACTION_DISABLE, EPWM_TZ_ACTION_HIGH_Z, EPWM_TZ_ACTION_LOW

        EPWM_setTripZoneAction(obj->pwmHandle[cnt],
                               EPWM_TZ_ACTION_EVENT_TZB,
                                        EPWM_TZ_ACTION_LOW);
        //
        EPWM_setTripZoneAction(obj->pwmHandle[cnt],
                               EPWM_TZ_ACTION_EVENT_DCBEVT1,
                                        EPWM_TZ_ACTION_LOW);
        //EPWM_TZ_ACTION_DISABLE, EPWM_TZ_ACTION_HIGH_Z, EPWM_TZ_ACTION_LOW


        // Technical 18.9 TZ6=CPU(EMUSTOP)
        EPWM_enableTripZoneSignals(obj->pwmHandle[cnt],
                                   EPWM_TZ_SIGNAL_CBC6);

#if defined(_SPIA_EN) || defined(_SPIB_EN)

        // Oneshot TZ1 DRV83XXRS nFault Active LOW
        EPWM_enableTripZoneSignals(obj->pwmHandle[cnt],
                                   EPWM_TZ_SIGNAL_OSHT1);

#endif

        // OSHT: DCA1/B1 Low/High trigger sources
        // TRM: 18.9.1 Fig.18-41, 18.11 Fig.18-48
        // CBC: TZ6 are DCA2/B2 trip event sources
        EPWM_enableTripZoneSignals(obj->pwmHandle[cnt],
                          (EPWM_TZ_SIGNAL_DCAEVT1 | EPWM_TZ_SIGNAL_DCBEVT1));

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

     这看起来像是问题的另一部分、除了 x39c 库调用以设置过滤器、并且 DACA/B-CTRL 操作会覆盖彼此的位集。 下面的函数根本没有配置某些位。 下面的代码可能会解释为什么 DCA/B-CTRL 寄存器 EVT1LAT 状态位会循环、就好像 CMPSSn RS 锁存器发生同步复位一样。 将 CMPSSn 数字滤波器窗口和阈值推入非常高的电压会以某种方式阻止异步信号触发任何 TZ 事件、此时即使是 3 个比较器中的一个的 CMPSS 锁存条件也会断言 TZ OST 操作已被忽略!

    什么阻止设置 DCATZ EVT1 和 DCBEVT1 位?

    // OSHT: DCA1/B1 Low/High trigger sources
    // TRM: 18.9.1 Fig.18-41, 18.11 Fig.18-48
    // CBC: TZ6 are DCA2/B2 trip event sources
    EPWM_enableTripZoneSignals(obj->pwmHandle[cnt],
                      (EPWM_TZ_SIGNAL_DCAEVT1 | EPWM_TZ_SIGNAL_DCBEVT1));

    什么是没有意义的;如果从未设置 DCA/B-EVT1 位、如何通过软件强制 TZOST 事件禁用 PWM A1/B1 输出? 当 TZ 强制操作将 PWM A1/B1 输出设置为低电平状态时、为什么在 CCS 调试寄存器视图中 TZOST 标志不置为置位?  

    这是逻辑上的困惑在所有这一切!

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

    //设置故障
    HAL_setupMtrFaults(句柄);

    //设置 PWM
    HAL_setupPWMs (handle);

    //设置跳闸区选择寄存器 (TZSEL)
    ePWM_disableTripZoneSignals (obj->pwmHandle[Cnt]、HAL_TZSEL_Signals_all);

    此调用不正确并会禁用显示的 PWM 故障选定的 OST 事件。 顺序一直是设置故障然后 PWM 驱动器、但禁用 OST 标志会创建主要 ciaos!

    我们这样做的原因可能是当 driverlib 调用未清除 DCA/B H/L 标志位时遇到了另一个问题、却忘记了这样做。 在我们将直流清除标志实施到 while 循环后、标志位被清除、但经过一段时间、因为在软件中的 TZOST 事件强制禁用 PWM 输出、从而屏蔽了 1b1 DCAOST 标志位未被清除!   

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    也许我们是在故障排除期间 driverlib 调用未清除 DCA/B H/L 标志位时这样做的

    当我们启用 TZSEL 位时、TZCLRFLG 位在 TZFLG 寄存器位被置位后就不会产生影响。 这假设这些标志的静态设置、并且不是失控循环、该循环会对这些寄存器进行操作。 然而、这似乎已经在 UMCSDK 中完成、并在 CMPSSy Ctrip 设置锁存器时导致 EV1TLAT 位循环级联。

     因此、由于它是在 C 代码设置 TZOST 位时进行配置 (hal.c)、如果 TZSEL 寄存器启用了动作限定器子模块特定控制所需的相同标志位、则无法清除该位。 只有当在 TZSEL 寄存器中禁用所有标志时、TZOST 位才与跳闸区子模块具有任何功能。 我们强制使用标志来对 UMCSSDK 中的 PWM 进行软件控制、它通过强制标志来启用和禁用 PWM 栅极驱动器。 但是、它们不应重复设置中的位、而是循环多个故障控制标志。 一旦他们被安置离开他们独自一人!

    奇怪的是、当在 TZFRC 寄存器中设置时、某些标志可以被清除(有多奇怪)、其他标志在清除时保持启用状态。 TZFRC 寄存器不指示在 CCS 调试中设置了一个位。 为什么不让 TRZFRC 寄存器在标志上添加或门来设置锁存位呢? 无论如何、当 TZFRC 被清除时、没有人知道谁设置了标志或者源在哪里设置了任何位  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    无论如何、没有人知道谁设置了标志、或者 TZFRC 被清除时源在哪里。atter 设置任何位 

    实际上、早期的 hal.h PWM 跳闸区控制功能中不存在这种奇数行为。 并且向 TZOST 调用添加强制 DCA1/B1 跳闸 EVENT1 会锁定 TZOST 标志位、因为在某个地方调用(禁用 PWM 功能)会对 TZFRC 寄存器进行位拆裂。 EVT1LAT 标志周期和 CMPSSn TRIPn 锁存输出这种意外影响也会循环出现。  只有一个动作限定器置为有效但从不被锁存、而其他两个动作限定器在组合的跳闸 TZ7、TZ8、TZ9 中从不置为有效。 所有这一切都无法禁用 TZSEL 位 (hal.c)、从而屏蔽 3 个 CXMPSS 比较器的真实操作、通过在 OVC 条件下进行单个 CMPSSn 检测来保护 3 个半桥栅极驱动器

    设置 1-TZ 来保护 3 PWM 发生器似乎很粗略、为什么需要多个 CMPSSn 并且不知道哪个相位导致 OVC 故障。 另一个优势是、如果异步锁存器在 OVC 可能太可怕时快速停止所有换向、则对直流逆变器的损坏较小! 在任何单个 OVC 事件上、3 个 PWM 发生器的单次 TZ 跳闸无法比 3-TZN 更快地做出反应。    

    奇怪的是、x49c 没有这种问题 DCA1/B1 控制标志、但 x39c TZ 操作会在 TZSEL 位被禁用 (HAL_setup_pwm ()) 时失败。操作控制调用的顺序很重要、或者 DCAP1/B1 标志将被最后一次调用覆盖、以便使用来自 DCAH/setup_pwm 输出的已过滤锁存事件来设置 DCA1/B_CTL 寄存器位 (HAL_setupFaults)。 当 C 代码需要禁用 PWM 发生器 A1/B1 输出时、组合的 EVENT1 TRIPn 会被过滤并与 (DCA1/B1.Forced) 事件锁存。

    单独启用 TZOST 标志位以禁用 PWM 输出会以某种方式导致问题! 未为其他故障标志启用 TZSEL 寄存器位、例如:当为 EVM 配置 GPIO 输入时、用于 DRV83xx 的 CBC-6、TZ1-nFAULT、最后是 DCA1/B1.强制 ENT1。   

    20.17.2.45 TZSEL 寄存器(偏移= 80h)[复位= 0000h]

    20.17.2.69 DCATL 寄存器(偏移= C3h)[复位= 0000h]

    20.17.2.70 DCBCTL 寄存器(偏移= C4h)[复位= 0000h]

    20.17.2.52 TZFLG 寄存器(偏移= 93h)[复位= 0000h]

    20.17.2.58 TZFRC 寄存器(偏移= 9Bh)[复位= 0000h]

    // hal.c
    // 03/10/25: Configure the DCA path to be filtered latch forces DCAEVT1
    EPWM_setDigitalCompareEventSource(obj->pwmHandle[cnt],
                                      EPWM_DC_MODULE_A,
                                      EPWM_DC_EVENT_1,
                                      EPWM_DC_EVENT_FLTLATCH_DCEVT1FORCE);
    
    // 03/10/25: Configure the DCB path to be filtered latch forces DCBEVT1
    EPWM_setDigitalCompareEventSource(obj->pwmHandle[cnt],
                                      EPWM_DC_MODULE_B,
                                      EPWM_DC_EVENT_1,
                                      EPWM_DC_EVENT_FLTLATCH_DCEVT1FORCE);
    
    // Configure the Digital CMPSS filter bit, not the Async original signal
    EPWM_setDigitalCompareEventSource(obj->pwmHandle[cnt],
                                      EPWM_DC_MODULE_A,
                                      EPWM_DC_EVENT_1,
                                      EPWM_DC_EVENT_SOURCE_FILT_SIGNAL);
    //EPWM_DC_EVENT_SOURCE_FILT_SIGNAL EPWM_DC_EVENT_SOURCE_ORIG_SIGNAL
    
    // Configure the Digital CMPSS filter bit, not the Async original
    EPWM_setDigitalCompareEventSource(obj->pwmHandle[cnt],
                                      EPWM_DC_MODULE_B,
                                      EPWM_DC_EVENT_1,
                                      EPWM_DC_EVENT_SOURCE_FILT_SIGNAL);
    
    // hal.h
    //! \brief      Disables the PWM device for motor control
    //! \details    Turns off the outputs of the EPWM peripherals which will put
    //!             the power switches into a high impedance state.
    //! \param[in]  handle  The hardware abstraction layer (HAL) handle
    static inline void HAL_disablePWM(HAL_MTR_Handle handle)
    {
      HAL_MTR_Obj *obj = (HAL_MTR_Obj *)handle;
    
      uint16_t cnt;
    
        for(cnt = 0; cnt <3; cnt++)
        {
              /* Enable the forced OSHT events  18.9.2 Fig.18-41 */
              //EPWM_forceTripZoneEvent(obj->pwmHandle[cnt],
                                      //EPWM_TZ_FORCE_EVENT_DCAEVT1);
              //DEVICE_DELAY_US(10);
              //EPWM_forceTripZoneEvent(obj->pwmHandle[cnt],
                                      //EPWM_TZ_FORCE_EVENT_DCBEVT1);
              DEVICE_DELAY_US(10);
              // turns off the outputs of the EPWM peripherals which will put the power
              // switches into a low state.
              EPWM_forceTripZoneEvent(obj->pwmHandle[cnt], EPWM_TZ_FORCE_EVENT_OST);
    
              DEVICE_DELAY_US(100);
        }