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.

[参考译文] CCS/TMS320F28032:有关 TZCLR 和 PWM 的问题

Guru**** 2392905 points


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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/751014/ccs-tms320f28032-a-question-about-tzclr-and-pwm

器件型号:TMS320F28032

工具/软件:Code Composer Studio

大家好、我们有一个问题、

在由 PWM 模块触发 OST 事件后、如果我们通过 TZCLR 清除 OST 标志、PWM 输出会立即或在下一个周期中输出?

谢谢  

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

    对于 CBC -检测到事件后、输出会立即根据 TZCTL[TZA/B]设置进行更改、但当 TBCTR = 0x0000时、输出会返回到原始状态。

    对于 OSHT -输出在检测到事件时立即根据 TZCTL[TZA/B]设置进行更改、并保持更改的状态、直到用户手动写入清除位以清除事件。

    是的、我使用一个示例代码进行了双击。 在随机时间手动清除 OST 标志。 当您清零寄存器并且不等待 TBCTR = 0时、输出恢复。

    //
    //包含的文件
    //
    #include "driverlib.h"
    #include "device.h"
    
    //
    Globals
    //
    uint32_t epwm1TZIntCount;
    uint32_t epwm2TZIntCount;
    
    //
    函数原型
    //
    void initEPWM1 (void);
    void EPWM2 (void
    
    
    );void (tepZm2);void GPIO interrupt (void);void (void)
    _interrupt void epwm2TZISR (void);
    
    void main (void)
    {
    //
    //初始化全局变量
    //
    epwm1TZIntCount = 0U;
    epwm2TZIntCount = 0U;
    
    //
    //初始化设备时钟和外设
    //
    device_init();
    
    //
    //禁用引脚锁定并启用内部上拉。
    //
    DEVICE_initGPIO();
    
    //
    //初始化 PIE 并清除 PIE 寄存器。 禁用 CPU 中断。
    //
    interrupt_initModule();
    
    //
    //使用指向 shell 中断的指针初始化 PIE 矢量表
    //服务例程(ISR)。
    //
    interrupt_initVectorTable();
    
    //
    //此示例中使用的中断被重新映射到 ISR 函数
    //在此文件中找到。
    //
    INTERRUPT_REGTER (INT_EPWM1_TZ、epwm1TZISR);
    INTERRUPT_REGTER (INT_EPWM2_TZ、epwm2TZISR);
    
    //
    //配置 ePWM1、ePWM2和 TZ GPIO
    //
    initEPWMGPIO();
    initTZGPIO();
    
    //
    //禁用同步(也冻结 PWM 的时钟)
    //
    SYSCTL_DisablePeripheral (SYSCTL_Periph_CLK_TBCLKSYNC);
    
    //
    //初始化 ePWM1和 ePWM2
    //
    initEPWM1();
    initEPWM2();
    
    //
    //启用到 PWM 的同步和时钟
    //
    SYSCTL_enablePeripheral (SYSCTL_Periph_CLK_TBCLKSYNC);
    
    //
    //启用此示例所需的中断
    //
    INTERRUPT_ENABLE (INT_EPWM1_TZ);
    INTERRUPT_ENABLE (INT_EPWM2_TZ);
    
    //
    //启用全局中断(INTM)和实时中断(DBGM)
    //
    EINT;
    ERTM;
    
    //
    //空闲循环。 只需坐下来循环(可选):
    //
    for (;;)
    {
    NOP;
    }
    }
    
    //
    // epwm1TZISR - ePWM1 TZ ISR
    //
    _interrupt void epwm1TZISR (void)
    {
    epwm1TZIntCount++;
    
    //
    //要重新启用 OST 中断,请取消注释以下代码:
    //
    // ePWM_clearTripZoneFlag (EPWM1_base、
    // (ePWM_TZ_INTERRUPT | ePWM_TZ_FLAG_OST);
    
    //
    //确认此中断以接收来自组2的更多中断
    //
    interrupt_clearACKGroup (interrupt_ack_group2);
    }
    
    //
    epwm2TZISR - ePWM2 TZ ISR
    //
    _中断 void epwm2TZISR (void)
    {
    epwm2TZIntCount++;
    
    //
    //切换 GPIO 以在输入 TZ 时发出通知
    //
    GPIO_togglePin (11);
    
    //
    //清除标志-我们将继续获取该中断,直到 TZ
    //引脚变为高电平。
    //
    ePWM_clearTripZoneFlag (EPWM2_base、(ePWM_TZ_INTERRUPT | ePWM_TZ_FLAG_CBC));
    
    //
    //确认此中断以接收来自组2的更多中断
    //
    interrupt_clearACKGroup (interrupt_ack_group2);
    }
    
    //
    // initEPWM1 -配置 ePWM1
    //
    void initEPWM1()
    {
    //
    //启用 TZ1作为一次性跳闸源
    //
    ePWM_enableTripZoneSignals (EPWM1_base、ePWM_TZ_SIGNAL _OSHT1);
    
    //
    //对 TZ1采取行动
    //
    ePWM_setTripZoneAction (EPWM1_base、
    EPWM_TZ_ACT_EVENT_TZA、
    ePWM_TZ_ACT_HIGH);
    
    //
    //启用 TZ 中断
    //
    ePWM_enableTripZoneInterrupt (EPWM1_base、ePWM_TZ_INTERRUPT_OST);
    
    //
    //设置 TBCLK
    //
    ePWM_setTimeBasePeriod (EPWM1_base、12000U);
    ePWM_setPhaseShift (EPWM1_base、0U);
    ePWM_setTimeBaseCounter (EPWM1_base、0U);
    ePWM_setTimeBaseCounterMode (EPWM1_base、ePWM_COUNTER_MODE_UP_DOWN);
    ePWM_DisablePhaseShiftLoad (EPWM1_base);
    
    //
    //设置 ePWM 时钟预分频器
    //
    ePWM_setClockPrescaler (EPWM1_base、
    ePWM_CLOCK 分频器_64、
    ePWM_HSCLOCK_DEVIDER_8);
    
    //
    //设置隐藏
    //
    EPWM_setCounterCompareShadowImage LoadMode (EPWM1_BASE、
    ePWM_COUNTER_COMPARE_A、
    ePWM_COMP_LOAD_ON_CNTR_ZERO);
    
    //
    //设置比较
    //
    ePWM_setCounterCompareValue (EPWM1_base、ePWM_COUNTER_COMPARE_A、6000U);
    
    //
    //设置操作
    //
    ePWM_setActionQualifierAction (EPWM1_base、
    ePWM_AQ_OUTPUT A、
    ePWM_AQ_OUTPUT 高电平、
    ePWM_AQ_output_on_timebase_up_CMPA);
    ePWM_setActionQualifierAction (EPWM1_base、
    ePWM_AQ_OUTPUT A、
    ePWM_AQ_OUTPUT 低电平、
    ePWM_AQ_output_on_timebase_down_CMPA);
    }
    
    //
    // initEPWM2 -配置 ePWM2
    //
    void initEPWM2 ()
    {
    //
    //启用 TZ1作为一个逐周期触发源
    //
    ePWM_enableTripZoneSignals (EPWM2_base、ePWM_TZ_SIGNAL _CBC1);
    
    //
    //对 TZ1采取行动
    //
    ePWM_setTripZoneAction (EPWM2_base、
    EPWM_TZ_ACT_EVENT_TZA、
    ePWM_TZ_ACT_HIGH);
    
    //
    //启用 TZ 中断
    //
    ePWM_enableTripZoneInterrupt (EPWM2_base、
    ePWM_TZ_INTERRUPT_CBC);
    
    //
    //设置 TBCLK
    //
    ePWM_setTimeBasePeriod (EPWM2_base、6000U);
    ePWM_setPhaseShift (EPWM2_base、0U);
    ePWM_setTimeBaseCounter (EPWM2_base、0U);
    ePWM_setTimeBaseCounterMode (EPWM2_base、ePWM_COUNTER_MODE_UP_DOWN);
    ePWM_DisablePhaseShiftLoad (EPWM2_base);
    
    //
    //设置 ePWM 时钟预分频器
    //
    ePWM_setClockPrescaler (EPWM2_base、
    ePWM_CLOCK 分频器_4、
    ePWM_HSCLOCK_DEVIDER_4);
    
    //
    //设置比较
    //
    ePWM_setCounterCompareValue (EPWM2_base、ePWM_COUNTER_COMPARE_A、3000U);
    
    //
    //设置操作
    //
    ePWM_setActionQualifierAction (EPWM2_base、
    ePWM_AQ_OUTPUT A、
    ePWM_AQ_OUTPUT 高电平、
    ePWM_AQ_output_on_timebase_up_CMPA);
    ePWM_setActionQualifierAction (EPWM2_base、
    ePWM_AQ_OUTPUT A、
    ePWM_AQ_OUTPUT 低电平、
    ePWM_AQ_output_on_timebase_down_CMPA);
    }
    
    //
    // initTZGPIO -配置 TZ GPIO
    //
    void initTZGPIO (void)
    {
    //
    //将 GPIO 12设置为启用上拉的异步输入
    //
    GPIO_setPadConfig (16、GPIO_PIN_TYPE_PULLUP);
    GPIO_setPinConfig (GPIO_16_GPIO16);
    GPIO_setDirectionMode (16、GPIO_DIR_MODE_IN);
    GPIO_setQualificationMode (16、GPIO_QUAL_异 步);
    
    //
    //将 GPIO 12设置为 TZ1输入
    //
    Xbar_setInputPin (XBAR_Input1、16);
    
    //
    //将 GPIO 11配置为通用 GPIO,以便在 TZ 时进行监控
    //已输入中断
    //
    GPIO_setPadConfig (11、GPIO_PIN_TYPE_STD);
    GPIO_setPinConfig (GPIO_11_GPIO11);
    GPIO_setDirectionMode (11、GPIO_DIR_MODE_OUT);
    }
    
    //
    initEPWMGPIO -配置 ePWM GPIO
    //
    void initEPWMGPIO (void)
    {
    //
    //禁用 GPIO 0和 GPIO 2上的上拉电阻并将其配置为 PWM1A 和
    // PWM2A 输出。
    //
    GPIO_setPadConfig (0、GPIO_PIN_TYPE_STD);
    GPIO_setPinConfig (GPIO_0_EPWM1A);
    
    GPIO_setPadConfig (2、GPIO_PIN_TYPE_STD);
    GPIO_setPinConfig (GPIO_2_EPWM2A);
    }
    

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