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.

[参考译文] TMS320F28377S:文档说明

Guru**** 2455360 points


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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/743861/tms320f28377s-clarification-on-documentation

器件型号:TMS320F28377S
在 SPRUHX5E 图13-5中、它显示了其中一个同步输出选择选项是 SWFSYNC 和 EPWMxSYNCI 的 OR 输入。
 
 
在 EPWMxSYNCO 的表13-2中、首次选择的仅为 EPWMxSYNCI 输入。
 
在 TBCTL 寄存器的 SWFSYNC 位表13-16中、它表示只有当 SYNCOSEL 为00时、SWFSYNC 才会影响 EPWMxSYNCO;对于 SYNCOSEL 位、选项00是 EPWMxSYNCI/ SWFSYNC。
 
我已经尝试过多种配置、似乎 SWFSYNC 未连接到同步输出选择多路复用器。 我无法获取通过 EPWMxSYNCO 传播到下一个 ePWM 模块的 SWFSYNC。
 
SWFSYNC 到 EPWMxSYNCO 的连接出现错误。
这是真的吗?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    当选择 SYNCOSEL 00时、EPWMxSYNCO 应为 EPWMxSYNCI 和 SWFSYNC 的 OR。 TRM 中唯一需要更新的部分是表13-2。

    您如何看到 SWFSYNC 不起作用?
    你能对我说这一点吗?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    你好、Nima、

    我无法使用 SWFSYNC 位生成任何 SYNCO。 例如、我有以下设置:

    1) 1)      EPWM4设置为 SYNCOSEL 00
    2) 2)      EPWM4 EPWM4SYNCIN 000、其中 EPWM1不会生成任何 SYNCO
    3)      3) EPWM5设置为 SYNCOSEL 00
    4)      4) EPWM5和 EPWM6设置 TBCTL:PHSEN 1
    5) 5)      EPWM5和 EPWM6设置为生成彼此不同步的正常 PWM 输出。
    6) 6)     如果我设置 EPWM5或 EPWM6 TBCTL:SWFSYNC 1、我可以单独更改每个 PWM 输出的同步。
    7)      7)如果我将 EPWM1设置为生成 SYNCO (SYNCOSEL 01)、则 EPWM5和 EPWM6立即同步。
    8)      8)如果我将 EPWM1设置为 SYNCOSEL 00 (无 SYNC OUT)、然后设置 EPWM5和 EPWM6 TBCTL:SWFSYNC 1、则两个 PWM 输出现在都不同步。
    9) 9)     如果我设置 EPWM4 TBCTL:SWFSYNC 我将看到 EPWM4 PWM 同步变化、但 EPWM5和 EPWM6 PWM 输出不会变化、并且仍然不同步
     
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    好的、我正在编写一些代码来测试这个。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    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 项目。

    e2e.ti.com/.../pinkCrape.zip

    代码如下。 我在延迟后强制 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

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

    下面是移植到 LaunchXL-F28377S 的示例代码,它显示这些功能的工作方式与379D 部件不同。 该示例仅稍作修改、以便使用 LaunchXL-F28377S 上提供的 PWM 引脚、这些引脚不同于您发送给我的示例。

    //
    // LaunchXL-F28377S
    //

    //
    //包含的文件
    //
    #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);
    _interrupt void epwm9ISR (void);

    //
    //主函
    //
    void main (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);

    //
    //禁用同步(也冻结 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
    //
    _interrupt void epwm8ISR (void)


    //
    //清除此计时器的 INT 标志
    //
    ePWM_clearEventTriggerInterruptFlag (EPWM8_BASE);

    //
    //确认中断组
    //
    INTERRUPT_clearACKGROUP (INTERRUPT_ACK_Group3);


    //
    // epwm3ISR - ePWM 3 ISR
    //
    _interrupt 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);
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    找到了单核 Launchpad。 我正在尝试此操作。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    好的、我已经在单核 Launchpad 上对其进行了测试、您答对了。 我需要检查设计。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    好的、发现了问题。 也就是说、在双核上、我们有一个 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中是否需要更多详细信息?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    这就是它的预期运行方式、但我确实了解了我需要如何在 TRM 中明确指定这一点。