请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
器件型号:TMS320F28032 工具/软件:Code Composer Studio
大家好、我们有一个问题、
在由 PWM 模块触发 OST 事件后、如果我们通过 TZCLR 清除 OST 标志、PWM 输出会立即或在下一个周期中输出?
谢谢
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.
工具/软件: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); }