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.
你好、Nima、
我无法使用 SWFSYNC 位生成任何 SYNCO。 例如、我有以下设置:
PinkClape、
我刚刚编写了一些代码、并测试了 SWSYNC 确实会通过传播。
那么、这里是您需要查看和注意的内容。
我首先要知道的是 EPWM1 SYNCIN。 因此、这个 ePWM 的 SYNC 输入是 EXTSYNC1或2、它们来自 INPUTXBAR6和7。 在该器 件中、INPUTXBAR6和7的默认值为 GPIO0、这意味着 GPIO0上的 EPWM1输出将导致其自身同步。 因此、第一步是更改这个值。
Xbar_setInputPin (XBAR_INPUT5、50); Xbar_setInputPin (XBAR_INPUT6、50);
我之所以选择 GPIO 50、是因为我不使用它。
好了、现在 EPWM1只能通过 EPWM1.TBCTL.SWSYNC 进行同步。
2.如果像我一样使用 driverlib、请确保包含该行、
SYSCTL_DisablePeripheral (SYSCTL_Periph_CLK_GTBCLKSYNC);
以前
SYSCTL_DisablePeripheral (SYSCTL_Periph_CLK_TBCLKSYNC);
如果你不这样做、TBCLKSYNC 将不会有任何效果。
好的、现在我们可以检查您要询问的内容。 让我们设置 EPWM1和 EWPM2之间的简单同步。
ePWM_setSyncOutPulseMode (EPWM1_base、ePWM_SYNC_OUT_PULSE_ON_SOFTWARE); ePWM_enablePhaseShiftLoad (EPWM1_base); ePWM_enablePhaseShiftLoad (EPWM2_base);
这使得 EPWM1的 SYNCOUT = SW 或 SYNCIN。
然后为 EPWM1和 EPWM2启用相移负载。
现在、如果您执行
ePWM_forceSyncPulse (EPWM1_base);
您将看到 EPWM1和 EPWM2均重新启动。
如果不希望 EPWM1同步到 swsync、只 需 ePWM_disablePhaseShiftLoad (EPWM1_base);
现在、为了向您展示这一点、我提供了您可以运行的代码、我还附加了 CCS 项目。
代码如下。 我在延迟后强制 SW 同步、您可以通过作用域 GPIO6查看何时发生同步。 您将看到 EPWM1和 EPWM2相互跟随以及同步。
// //包含的文件 // #include "driverlib.h" #include "device.h" #define ePWM_TIMER_TBPRD 2000 // 函数原型 // void initEPWM (uint32_t ePWM_base); __interrupt void epwm1ISR (void); __interrupt void epwm2ISR (void); // void Main (void);// void Main (void)/void 3 (void);// void Main (void) // //初始化设备时钟和外设 // device_init(); // //禁用引脚锁定并启用内部上拉。 // DEVICE_initGPIO(); // //初始化 PIE 并清除 PIE 寄存器。 禁用 CPU 中断。 // interrupt_initModule(); // //使用指向 shell 中断的指针初始化 PIE 矢量表 //服务例程(ISR)。 // interrupt_initVectorTable(); // //将中断服务例程分配给 ePWM 中断 // INTERRUPT_REGISTER (INT_EPWM1、epwm1ISR); INTERRUPT_REGISTER (INT_EPWM2、epwm2ISR); INTERRUPT_REGISTER (INT_EPWM3、epwm3ISR); // //将 GPIO0/1、GPIO2/3和 GPIO4/5配置为 ePWM1A/1B、ePWM2A/2B 和 // ePWM3A/3B 引脚 // GPIO_setPadConfig (0、GPIO_PIN_TYPE_STD); GPIO_setPinConfig (GPIO_0_EPWM1A); GPIO_setPadConfig (1、GPIO_PIN_TYPE_STD); GPIO_setPinConfig (GPIO_1_EPWM1B); GPIO_setPadConfig (2、GPIO_PIN_TYPE_STD); GPIO_setPinConfig (GPIO_2_EPWM2A); GPIO_setPadConfig (3、GPIO_PIN_TYPE_STD); GPIO_setPinConfig (GPIO_3_EPWM2B); GPIO_setPadConfig (4、GPIO_PIN_TYPE_STD); GPIO_setPinConfig (GPIO_4_EPWM3A); GPIO_setPadConfig (5、GPIO_PIN_TYPE_STD); GPIO_setPinConfig (GPIO_5_EPWM3B); GPIO_setPadConfig (6、GPIO_PIN_TYPE_STD); GPIO_setPinConfig (GPIO_6_GPIO6); GPIO_setDirectionMode (6、GPIO_DIR_MODE_OUT); // //禁用同步(也冻结 PWM 的时钟) // Xbar_setInputPin (XBAR_INPUT5、50); Xbar_setInputPin (XBAR_INPUT6、50); SYSCTL_DisablePeripheral (SYSCTL_Periph_CLK_GTBCLKSYNC); SYSCTL_DisablePeripheral (SYSCTL_Periph_CLK_TBCLKSYNC); initEPWM (EPWM1_base); initEPWM (EPWM2_base); initEPWM (EPWM3_base); ePWM_setSyncOutPulseMode (EPWM1_base、ePWM_SYNC_OUT_PULSE_ON_SOFTWARE); ePWM_enablePhaseShiftLoad (EPWM1_base); ePWM_enablePhaseShiftLoad (EPWM2_base); // //启用到 PWM 的同步和时钟 // SYSCTL_enablePeripheral (SYSCTL_Periph_CLK_TBCLKSYNC); //启用 ePWM 中断 // INTERRUPT_ENABLE (INT_EPWM1); INTERRUPT_ENABLE (INT_EPWM2); INTERRUPT_ENABLE (INT_EPWM3); // //启用全局中断(INTM)和实时中断(DBGM) // EINT; ERTM; // //空闲循环。 只需坐下来循环(可选): // for (;;) { GPIO_writePin (6、1); ePWM_forceSyncPulse (EPWM1_base); SYSCTL_DELAY (5000); GPIO_writePin (6、0); SYSCTL_DELAY (50000); } } // // epwm1ISR - ePWM 1 ISR // __interrupt void epwm1ISR (void) { // //清除此计时器的 INT 标志 // ePWM_clearEventTriggerInterruptFlag (EPWM1_BASE); // //确认中断组 // interrupt_clearACKGroup (interrupt_ACK_Group3); } // epwm2ISR - ePWM 2 ISR // _中断 void epwm2ISR (void) { // //清除此计时器的 INT 标志 // ePWM_clearEventTriggerInterruptFlag (EPWM2_base); // //确认中断组 // interrupt_clearACKGroup (interrupt_ACK_Group3); } // epwm3ISR - ePWM 3 ISR // _中断 void epwm3ISR (void) { // //清除此计时器的 INT 标志 // ePWM_clearEventTriggerInterruptFlag (EPWM3_base); // //确认中断组 // interrupt_clearACKGroup (interrupt_ACK_Group3); } void initEPWM (uint32_t ePWM_base) { // //设置 TBCLK // ePWM_setTimeBasePeriod (ePWM_base、ePWM_TIMER_TBPRD); ePWM_setPhaseShift (ePWM_base、0U); ePWM_setTimeBaseCounter (ePWM_base、0U); // //设置比较值 // ePWM_setCounterCompareValue (ePWM_base、 ePWM_COUNTER_COMPARE_A、 ePWM_TIMER_TBPRD/3); ePWM_setCounterCompareValue (ePWM_base、 ePWM_COUNTER_COMPARE_B、 ePWM_TIMER_TBPRD/2); // //设置计数器模式 // ePWM_setTimeBaseCounterMode (ePWM_base、ePWM_COUNTER_MODE_UP_DOWN); ePWM_DisablePhaseShiftLoad (ePWM_base); ePWM_setClockPrescaler (ePWM_base、 ePWM_CLOCK 分频器_8、 ePWM_HSCLOCK_DEVIDER_1); // //设置隐藏 // ePWM_setCounterCompareShadowImage LoadMode (ePWM_base、 ePWM_COUNTER_COMPARE_A、 ePWM_COMP_LOAD_ON_CNTR_ZERO); ePWM_setCounterCompareShadowImage LoadMode (ePWM_base、 ePWM_COUNTER_COMPARE_B、 ePWM_COMP_LOAD_ON_CNTR_ZERO); // //设置操作 // ePWM_setActionQualifierAction (ePWM_base、 ePWM_AQ_OUTPUT A、 ePWM_AQ_OUTPUT 高电平、 ePWM_AQ_output_on_timebase_up_CMPA); ePWM_setActionQualifierAction (ePWM_base、 ePWM_AQ_OUTPUT A、 ePWM_AQ_OUTPUT 低电平、 ePWM_AQ_output_on_timebase_down_CMPA); ePWM_setActionQualifierAction (ePWM_base、 ePWM_AQ_OUTPUT _B、 ePWM_AQ_OUTPUT 高电平、 ePWM_AQ_output_on_timebase_up_CMPB); ePWM_setActionQualifierAction (ePWM_base、 ePWM_AQ_OUTPUT _B、 ePWM_AQ_OUTPUT 低电平、 ePWM_AQ_output_on_timebase_down_CMPB); // //中断,我们将在其中更改比较值 //选择 INT on 时基计数器零事件, //启用 INT,在发生第三个事件时生成 INT // ePWM_setInterruptSource (ePWM_base、ePWM_INT_TBCTR_ZERO); ePWM_enableInterrupt (ePWM_base); ePWM_setInterruptEventCount (ePWM_base、3U); }
谢谢、
NIMA Eskandari
好的、发现了问题。 也就是说、在双核上、我们有一个 GPIO50引脚、并且知道上面没有发生任何事情。 在单核中、情况并非如此、因此您需要添加以下代码:
GPIO_setPadConfig (50、GPIO_PIN_TYPE_STD); GPIO_setPinConfig (GPIO_50_GPIO50); GPIO_setDirectionMode (50、GPIO_DIR_MODE_OUT); GPIO_writePin (50、0);
我已经过测试、并确保它在单核 LaunchPad 上正常工作。
这是最终代码、
// //包含的文件 // #include "driverlib.h" #include "device.h" #define ePWM_TIMER_TBPRD 2000 // 函数原型 // void initEPWM (uint32_t ePWM_base); __interrupt void epwm7ISR (void); __interrupt void epwm8ISR (void); // void Main (void);// void Main (void)/void / void / interrupt invoid (void) // //初始化设备时钟和外设 // device_init(); // //禁用引脚锁定并启用内部上拉。 // DEVICE_initGPIO(); // //初始化 PIE 并清除 PIE 寄存器。 禁用 CPU 中断。 // interrupt_initModule(); // //使用指向 shell 中断的指针初始化 PIE 矢量表 //服务例程(ISR)。 // interrupt_initVectorTable(); // //将中断服务例程分配给 ePWM 中断 // INTERRUPT_REGISTER (INT_EPWM7、epwm7ISR); INTERRUPT_REGISTER (INT_EPWM8、epwm8ISR); INTERRUPT_REGISTER (INT_EPWM9、epwm9ISR); // //将 GPIO12/13、GPIO14/15和 GPIO16/17配置为 ePWM7A/7B、ePWM8A/8B 和 // ePWM9A/9B 引脚 // GPIO_setPadConfig (12、GPIO_PIN_TYPE_STD); GPIO_setPinConfig (GPIO_12_EPWM7A); GPIO_setPadConfig (13、GPIO_PIN_TYPE_STD); GPIO_setPinConfig (GPIO_13_EPWM7B); GPIO_setPadConfig (14、GPIO_PIN_TYPE_STD); GPIO_setPinConfig (GPIO_14_EPWM8A); GPIO_setPadConfig (15、GPIO_PIN_TYPE_STD); GPIO_setPinConfig (GPIO_15_EPWM8B); GPIO_setPadConfig (16、GPIO_PIN_TYPE_STD); GPIO_setPinConfig (GPIO_16_EPWM9A); GPIO_setPadConfig (17、GPIO_PIN_TYPE_STD); GPIO_setPinConfig (GPIO_17_EPWM9B); GPIO_setPadConfig (2、GPIO_PIN_TYPE_STD); GPIO_setPinConfig (GPIO_2_GPIO2); GPIO_setDirectionMode (2、GPIO_DIR_MODE_OUT); GPIO_setPadConfig (50、GPIO_PIN_TYPE_STD); GPIO_setPinConfig (GPIO_50_GPIO50); GPIO_setDirectionMode (50、GPIO_DIR_MODE_OUT); GPIO_writePin (50、0); // //禁用同步(也冻结 PWM 的时钟) // Xbar_setInputPin (XBAR_INPUT5、50); Xbar_setInputPin (XBAR_INPUT6、50); //不是377S sysctl_disablePeripheral (sysctl_Periph_CLK_GTBCLKSYNC); SYSCTL_DisablePeripheral (SYSCTL_Periph_CLK_TBCLKSYNC); initEPWM (EPWM7_BASE); initEPWM (EPWM8_BASE); initEPWM (EPWM9_BASE); SYSCTL_setSyncInputConfig (SYSCTL_SYNC_IN_EPWM4、SYSCTL_SYNC_IN_SRC_EXTSYNCIN1); SYSCTL_setSyncInputConfig (SYSCTL_SYNC_IN_EPWM7、SYSCTL_SYNC_IN_SRC_EXTSYNCIN1); ePWM_setSyncOutPulseMode (EPWM7_BASE、ePWM_SYNC_OUT_PULSE_ON_SOFTWARE); ePWM_enablePhaseShiftLoad (EPWM7_BASE); ePWM_setSyncOutPulseMode (EPWM8_BASE、ePWM_SYNC_OUT_PULSE_ON_SOFTWARE); ePWM_enablePhaseShiftLoad (EPWM8_BASE); ePWM_setSyncOutPulseMode (EPWM9_BASE、ePWM_SYNC_OUT_PULSE_ON_SOFTWARE); ePWM_enablePhaseShiftLoad (EPWM9_BASE); // //启用到 PWM 的同步和时钟 // SYSCTL_enablePeripheral (SYSCTL_Periph_CLK_TBCLKSYNC); //启用 ePWM 中断 // INTERRUPT_ENABLE (INT_EPWM7); INTERRUPT_ENABLE (INT_EPWM8); INTERRUPT_ENABLE (INT_EPWM9); // //启用全局中断(INTM)和实时中断(DBGM) // EINT; ERTM; // //空闲循环。 只需坐下来循环(可选): // for (;;) { GPIO_writePin (2、1); ePWM_forceSyncPulse (EPWM7_BASE); SYSCTL_DELAY (5000); GPIO_writePin (2、0); SYSCTL_DELAY (50000); } } // // epwm1ISR - ePWM 1 ISR // __interrupt void epwm7ISR (void) { // //清除此计时器的 INT 标志 // ePWM_clearEventTriggerInterruptFlag (EPWM7_BASE); // //确认中断组 // interrupt_clearACKGroup (interrupt_ACK_Group3); } // epwm2ISR - ePWM 2 ISR // _中断 void epwm8ISR (void) { // //清除此计时器的 INT 标志 // ePWM_clearEventTriggerInterruptFlag (EPWM8_BASE); // //确认中断组 // interrupt_clearACKGroup (interrupt_ACK_Group3); } // epwm3ISR - ePWM 3 ISR // _中断 void epwm9ISR (void) { // //清除此计时器的 INT 标志 // ePWM_clearEventTriggerInterruptFlag (EPWM9_BASE); // //确认中断组 // interrupt_clearACKGroup (interrupt_ACK_Group3); } void initEPWM (uint32_t ePWM_base) { // //设置 TBCLK // ePWM_setTimeBasePeriod (ePWM_base、ePWM_TIMER_TBPRD); ePWM_setPhaseShift (ePWM_base、0U); ePWM_setTimeBaseCounter (ePWM_base、0U); // //设置比较值 // ePWM_setCounterCompareValue (ePWM_base、 ePWM_COUNTER_COMPARE_A、 ePWM_TIMER_TBPRD/3); ePWM_setCounterCompareValue (ePWM_base、 ePWM_COUNTER_COMPARE_B、 ePWM_TIMER_TBPRD/2); // //设置计数器模式 // ePWM_setTimeBaseCounterMode (ePWM_base、ePWM_COUNTER_MODE_UP_DOWN); ePWM_DisablePhaseShiftLoad (ePWM_base); ePWM_setClockPrescaler (ePWM_base、 ePWM_CLOCK 分频器_8、 ePWM_HSCLOCK_DEVIDER_1); // //设置隐藏 // ePWM_setCounterCompareShadowImage LoadMode (ePWM_base、 ePWM_COUNTER_COMPARE_A、 ePWM_COMP_LOAD_ON_CNTR_ZERO); ePWM_setCounterCompareShadowImage LoadMode (ePWM_base、 ePWM_COUNTER_COMPARE_B、 ePWM_COMP_LOAD_ON_CNTR_ZERO); // //设置操作 // ePWM_setActionQualifierAction (ePWM_base、 ePWM_AQ_OUTPUT A、 ePWM_AQ_OUTPUT 高电平、 ePWM_AQ_output_on_timebase_up_CMPA); ePWM_setActionQualifierAction (ePWM_base、 ePWM_AQ_OUTPUT A、 ePWM_AQ_OUTPUT 低电平、 ePWM_AQ_output_on_timebase_down_CMPA); ePWM_setActionQualifierAction (ePWM_base、 ePWM_AQ_OUTPUT _B、 ePWM_AQ_OUTPUT 高电平、 ePWM_AQ_output_on_timebase_up_CMPB); ePWM_setActionQualifierAction (ePWM_base、 ePWM_AQ_OUTPUT _B、 ePWM_AQ_OUTPUT 低电平、 ePWM_AQ_output_on_timebase_down_CMPB); // //中断,我们将在其中更改比较值 //选择 INT on 时基计数器零事件, //启用 INT,在发生第三个事件时生成 INT // ePWM_setInterruptSource (ePWM_base、ePWM_INT_TBCTR_ZERO); ePWM_enableInterrupt (ePWM_base); ePWM_setInterruptEventCount (ePWM_base、3U); }
这是一个很难调试的问题。
NIMA
谢谢你 Nima、我们 相信 我们现在看到它在377S 上工作。
文件中似乎仍然存在一个问题,首先会导致这个问题,并可能导致其他执行问题。
第一个是更改代码以使 GPIO50保持设置为1。
GPIO_writePin (50、1);
现在、在运行示例 PWM7时将同步、但 PWM8不会同步。 这现在意味着 EPWMxSYNCI 输入端有一个脉冲发生器、该脉冲发生器将进入或门、为 PHSEN 计数器负载输入馈送信号。 由于 SWFSYNC 能够同步 PWM7、因此必须为真。
由于当 EPWMxSYNCI 为常数1并且与 SWFSYNC 进行或操作时、PWM8未同步、因此 SWFSYNC 正在阻止传播到 PWM8。 在图13-5中、可以清楚地看到、进入两个或两个门的 EPWMxSYNCI 被视为脉冲输入并运行相同。 问题看起来是它们与进入或门的信号不同。
SWFSYNC 能够同步 PWM7这一事实意味着 EPWMxSYNCI 被正确设置为进行同步操作(如图13-5所示)、但事实并非如此。
由于 EPWMxSYNCI 信号对于 PWM7 PHSEN SYNC 和 EPWMxSYNCO 的运行方式似乎不同、因此可能会出现这样的情况:如果将外部信号用于 EPWMxSYNCI 并且保持1 (高电平)的时间更长、则在外部信号为1时会发生几个时钟和 SWFSYNC 同步链将损坏、PWM7将不同于其他 PWM。
这是它的运行方式吗?图13-5中是否需要更多详细信息?