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.

[参考译文] TMS320F280049C:生成4个 ePWM 信号、它们之间有四分之一周期的相移

Guru**** 2585275 points
Other Parts Discussed in Thread: TMS320F280049C, SYSCONFIG, C2000WARE

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1203527/tms320f280049c-generating-4-epwm-signals-with-a-quarter-period-phase-shift-between-them

器件型号:TMS320F280049C
Thread 中讨论的其他器件: SysConfigC2000WARE

您好!  

我使用 TMS320f280049C 生成4个 ePWM 信号。 ePWM 1和2彼此互补、ePWM 3和4也是如此。 ePWM 1和3应该是同一个信号、但是它们之间有四分之一的周期相移。 ePWM 2和4也是如此。 我很难理解文档中关于如何做到这一点的内容。 我正在使用位域编码、但无法使用 driverlib 函数。 我在 TBCTL 寄存器中看到了 PHSEN 域、我不确定是否需要将其用于相移。 还有 TBPHS、我想我 需要使用它来生成信号的相移、但我不确定应该怎么做。 有人能向我解释一下吗、或许可以生成一小段代码来说明这是如何工作的?  

谢谢!

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

    您好,Kody,

    C2000Ware 中有一个名为 epwm_ex3_synchronization 的示例、演示了 ePWM 模块之间的同步。 本示例使用 SysConfig 和 driverlib、但应作为同步所需一切的良好参考。 我也会在这里总结一下:

    对于具有相移的每个 PWM 模块、您需要将该相移写入 TBPHS 字段。 您还需要使用您提到的 PHSEN 字段来启用相移负载。 每个 ePWM 模块都有一个馈入其的 SYINCIN 信号。 当该信号有上升沿且启用了 PHSEN 时、将在该 ePWM 模块的 TBCTR 中加载 TBPHS 的值。 对于 EPWM2和 EPWM3、SYNCIN 信号始终来自 EPWM1的 SYNCOUT 信号。 您可以通过 TBCTL 中的 SYNCOSEL 字段来控制 EPWM1何时生成 SYNCOUT 信号(您需要将其配置为当 EPWM1 TBCTR = 0时、以便相移寄存器中的值是 相对于 EPWM1 TBCTR 的偏移)。 但是、对于 EPWM4、可以配置 SYNCIN 信号是来自 EPWM1还是来自一个外部同步源。 这是通过 SYNCSELECT 寄存器配置的。 这是因为 ePWM 模块在一组3个中同步。 对于您的应用、您希望将其同步到 EPWM1、因为 EPWM2和4应该同步。

    如果您有任何其他问题、请告诉我。

    ——Luke

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

    是否有可以用于 EPWM 配置的任何位域示例代码? 我尝试设置它并开发了一些代码、它不会生成任何 PWM 信号、我不知道我的问题在代码中的什么位置。

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

    较旧版本的 C2000Ware 可能包含此示例的位域版本。 更高版本的 C2000Ware 移植了现有示例、以使用 driverlib 和 SysConfig。 在配置 ePWM 寄存器然后重新启用 ePWM 时钟之前、您是否禁用了 ePWM 时钟? 寄存器窗口中的值是否反映了您尝试在代码中写入的值? 您可能需要在代码中添加 EALLOW 命令以允许修改 ePWM 寄存器。

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

    以下 是我正在运行的代码

    //
    // Included Files
    //
    #include "F28x_Project.h"
    #include "math.h"
    
    
    void InitEpwm1Gpio(void);
    void InitEpwm2Gpio(void);
    void InitEpwm4Gpio(void);
    void InitEpwm5Gpio(void);
    void ConfigureEPWM(void);
    void InitEpwm1(void);
    void InitEpwm2(void);
    void InitEpwm4(void);
    void InitEpwm5(void);
    void InitEpwm1Gpio(void);
    
    Uint16 period = 322;//6.45us/2*10ns for 155kHz
    Uint16 dtCount = 20; // dead time on both edges
    
    
    //
    // Main
    //
    void main(void)
    {
        // 1) Initilize System Control
        // PLL, WatchDog, enable Peripheral Clocks
        InitSysCtrl();
    
        // 2) Initilize GPIOs
        // enable PWM1, PWM2, PWM4, PWM5
        // then init Gpio for same PWMs
        InitGpio(); //May need later if code does not work
        CpuSysRegs.PCLKCR2.bit.EPWM1 = 1;
        CpuSysRegs.PCLKCR2.bit.EPWM2 = 1;
        CpuSysRegs.PCLKCR2.bit.EPWM4 = 1;
        CpuSysRegs.PCLKCR2.bit.EPWM5 = 1;
    
        InitEpwm1Gpio();
        //InitEpwm2Gpio();
        //InitEpwm4Gpio();
        //InitEpwm5Gpio();
    
        // 3) Clear all interrupts and initilize PIE vector table
        // Disaple CPU interrupts
        DINT;
        InitPieCtrl();
        IER = 0x0000;
        IFR = 0x0000;
        InitPieVectTable(); // init pie vect table with points to shell ISR
    
        // Configure EPWM modules
        ConfigureEPWM();
    
        // 4) initialize peripherals (init all EPWM peripherals for now)
        InitEpwm1();
        //InitEpwm2();
        //InitEpwm4();
        //InitEpwm5();
    
        EALLOW;
        CpuSysRegs.PCLKCR0.bit.TBCLKSYNC = 0; // SYNCs all active PWM modules to TBCLK
        EDIS;
    
    
        IER = M_INT1;
    
        // Enable Global Interrupt (INTM) and high priority real-time debug events
        EINT; // Enable INTM
        ERTM; // Enable global realtime interrupt DBGM, may or may not be needed.
    }
    
    //
    // ConfigureEPWM - Configure EPWM SOC and compare values confused skip for now
    //
    void ConfigureEPWM(void)
    {
        EALLOW;
        EPwm1Regs.ETSEL.bit.SOCAEN = 1;
        EPwm1Regs.ETSEL.bit.SOCASEL = 4;
        EPwm1Regs.ETPS.bit.SOCAPRD = 1;
        EPwm1Regs.CMPA.bit.CMPA = 105;
        EPwm1Regs.TBPRD = 210;
        EPwm1Regs.TBCTL.bit.CTRMODE = 0;
        EDIS;
    }
    
    
    //
    // EPWM 1 Set up
    //
    void InitEpwm1(void)
    {
    
        //setup counter mode
        EPwm1Regs.TBCTL.bit.HSPCLKDIV = 0; // Divide by 1
        EPwm1Regs.TBCTL.bit.CLKDIV = 0; // Divide by 1
        EPwm1Regs.TBCTL.bit.CTRMODE = TB_COUNT_UPDOWN; // Up down count mode
        EPwm1Regs.TBCTL.bit.SYNCOSEL = TB_CTR_ZERO;
        EPwm1Regs.TBCTL.bit.PHSEN = TB_DISABLE;
    
        //setup Time base
        EPwm1Regs.TBPRD = period; // Set timer period 155kHz
        EPwm1Regs.TBPHS.bit.TBPHS = 0; // add quarter period phase shift
        EPwm1Regs.TBCTR = 0; // clear counter
    
        //setup compare values
        EPwm1Regs.CMPA.bit.CMPA = period/2;
        EPwm1Regs.CMPB.bit.CMPB = period/2;
    
        //setup shadowing
        EPwm1Regs.CMPCTL.bit.SHDWAMODE = CC_SHADOW;
        EPwm1Regs.CMPCTL.bit.SHDWBMODE = CC_SHADOW;
        EPwm1Regs.CMPCTL.bit.LOADAMODE = CC_CTR_ZERO; //load on zero
        EPwm1Regs.CMPCTL.bit.LOADBMODE = CC_CTR_ZERO;
    
        //set actions
        EPwm1Regs.AQCTLA.bit.CAU = AQ_SET; // set high on event A up count
        EPwm1Regs.AQCTLA.bit.CAD = AQ_CLEAR; // Set low on event A down count
        EPwm1Regs.AQCTLB.bit.CBU = AQ_CLEAR; // set low on event A up count
        EPwm1Regs.AQCTLB.bit.CBD = AQ_SET; // Set high on event A down count
    
        //set deadband
        EPwm1Regs.DBCTL.bit.IN_MODE = DBA_ALL;
        EPwm1Regs.DBCTL.bit.OUT_MODE = DB_FULL_ENABLE; // set rising and falling edge delay
        EPwm1Regs.DBCTL.bit.POLSEL = DB_ACTV_HIC;
        EPwm1Regs.DBRED.bit.DBRED = dtCount; //rising edge delay
        EPwm1Regs.DBFED.bit.DBFED = dtCount; //falling edge delay
    
    }
    
    void InitEpwm1Gpio(void)
    {
        EALLOW;
    
        //Disable internal pull-up resistor for selected output pins for reduced power consumption
        GpioCtrlRegs.GPAPUD.bit.GPIO0 = 1; // Disable Pull up on GPIO0 (EPWM1A)
        GpioCtrlRegs.GPAPUD.bit.GPIO1 = 1; // Disable Pull up on GPIO1 (EPWM1B
    
        //Configure pins to EPWM functionality
        GpioCtrlRegs.GPAGMUX1.bit.GPIO0 = 1; // Configure GPIO0 as EPWM1A
        GpioCtrlRegs.GPAGMUX1.bit.GPIO1 = 1; // Configure GPIO1 as EPWM1B
    
        EDIS;
    }
    
    //
    // End of File
    //

    我在这里有 EALLOW、我认为 我需要它。 我还没有检查寄存器窗口以查看代码是否反映了这一点。

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

    在配置任何 ePWM 寄存器之前、请尝试禁用所有相关的 ePWM 时钟。 对于所有 ePWM、aka 会做 CpuSysRegs.PCLKCR2.bit.ePWMx = 0。 配置完成后、在配置结束时添加代码第36-39行中当前的内容。

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

    好的、我来试一下、看看它是否起作用。 谢谢!

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

    没问题、如果您需要 任何进一步的帮助、请告诉我。

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

    好的、我在寄存器查看器中进行了检查、但在运行代码时不会更新寄存器、这就是我不会生成任何 PWM 的原因。 如何解决此问题?

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

    现在、寄存器进行了更新、但示波器上仍然没有 PWM 输出。

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

    您好,Kody,

    这是否是您第一次遇到此问题? 在尝试实施相移之前、您是否能够在示波器上看到 PWM 输出?

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

    我找到了我的问题! 感谢您在此过程中的所有帮助!