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/TMS320F28377D:使用 TMS320F28377D 为 MOSFET 生成可变相移 PWM 信号

Guru**** 2591820 points
Other Parts Discussed in Thread: TMS320F28377D

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/665948/ccs-tms320f28377d-variable-phase-shifted-pwm-signal-generation-for-mosfets-with-tms320f28377d

器件型号:TMS320F28377D

工具/软件:Code Composer Studio

大家好、  

我正在使用隔离式相移全桥转换器。 我使用 TMS320F28377D 器件通过相移调制为 MOSFET 生成 PWM 信号。 因此、我需要为 MOSFET 生成相移 PWM 信号。

有人能帮我编码如何生成可变相移 PWM 信号吗?  

提前感谢您。

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

    大家好、Md Mejbaul Haque、

    每个 ePWM 模块可以相对于另一个 ePWM 模块具有相移。 您将要使用的寄存器为 PHSEN (时基相位启用)和 TBPHS。  一旦被启用、当模块接收到一个同步脉冲时、TBPHS 中编程的值将被复制到 TBCTR 中。

    我建议在选择模块之前查看同步方案、以便您了解如何在模块之前路由同步。

    在以下文档中、请查看以下内容:

    • 图14-7. 时基计数器同步方案
    • 图14-5. 时基子模块信号和寄存器 (用于 PHSEN 和源)
    • 第14.4.2节控制和监控时基子模块

    此致、

    Kris

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

    大家好、

    仍然存在编码问题。 您能否为相移 PWM 生成的编码提供具体帮助?

    谢谢你  

     

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

    您是否阅读了上述文档的章节并尝试使用这些寄存器进行编程? 您能向我们展示您的代码吗?

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

    您好、Kris、

    目前、我想以不同的相移(转换1 0、转换2 45和转换3为90度)驱动三个全桥转换器。 我总共需要六个 PWM 信号、其中三个信号具有0、45和90度相移、其余三个信号将是这三个信号的补充。

    我已经上传了我所做的代码。 请参阅下图、了解我的期望。 请听我说。

    PWM 频率为20kHz

    PWM 脉冲宽度为50us  

    占空比为50%

    使用加/减计数器

    此致、

    Md Mejbaul Haque

    PWM.c

    #include "pwm.h"

    浮点 Duty_P1;

    浮点 Duty_P2;

    浮点 Duty_P3;

     

     

    void PWM_init()

          //启用三个转换器的 PWM 模块+

     

          CpuSysRegs.PCLKCR2.bit.EPWM1 = 1;

          CpuSysRegs.PCLKCR2.bit.EPWM2 = 1;

          CpuSysRegs.PCLKCR2.bit.EPWM3 = 1;

          

     

          //为串联转换器配置输出引脚

     

          InitEPwm1Gpio()

          InitEPwm2Gpio()

          InitEPwm3Gpio()

          

          //配置中断

          Dint;

     

          InitPieCtrl()

     

          //禁用 CPU 中断并清除所有 CPU 中断标志:

          IER = 0x0000;

          IFR = 0x0000;

     

          InitPieVectTable()

     

          EALLOW;

          PieVectTable.EPWM1_INT =&PWM_INTERRUPT;

          EDIS;  //这是禁止写入 EALLOW 受保护寄存器所必需的

     

          //设置 PWM 通道...

          EALLOW;

          CpuSysRegs.PCLKCR0.bit.TBCLKSYNC =0;

          EDIS;

     

          configure_pwm1();

          configure_pwm2();

          CONFIG_pwm3 ();

          

     

          EALLOW;

          CpuSysRegs.PCLKCR0.bit.TBCLKSYNC=1;

          EDIS;

     

          //启用 PIE 中断

          IER |= M_INT3;

          PieCtrlRegs.PIEIER3.bit.INTx1 = 1;

     

          //为中断使用配置引脚...

          EALLOW;

          GpioCtrlRegs.GPADIR.bit.GPIO13 = 1;

          EDIS;

     

          //启用中断,openloop 将启动...

          EINT;//启用全局中断 INTM

          ERTM;//启用全局实时中断 DBGM

     

    //为三个转换器配置 PWM 通道1-3

     

    void configure_pwm1()

          EPwm1Regs.TBPRD = 1250;              //设置定时器周期

          EPwm1Regs.TBPHS.bit.TBPHS = 0x0000;        //相位为0

          EPwm1Regs.TBCTR = 0x0000;                    //清除计数器

     

          //设置 TBCLK

          EPwm1Regs.TBCTL.bit.CTRMODE = TB_COUNT_UPDOWN;//向上计数

          EPwm1Regs.TBCTL.bit.PHSEN = TB_DISABLE;      //禁用相位加载

          EPwm1Regs.TBCTL.bit.HSPCLKDIV = TB_DIV1;    

          EPwm1Regs.TBCTL.bit.CLKDIV = TB_DIV2;

     

          EPwm1Regs.CMPCTL.bit.SHDWAMODE = CC_SHADODE;  //每0加载一次寄存器

          EPwm1Regs.CMPCTL.bit.SHDWBMODE = CC_SHADOW;

          EPwm1Regs.CMPCTL.bit.LOADAMODE = CC_CTR_ZERO;

          EPwm1Regs.CMPCTL.bit.LOADBMODE = CC_CTR_ZERO;

     

     }

     

    void configure_pwm2()

          EPwm2Regs.TBPRD = 1250;                      //设置定时器周期

          EPwm2Regs.TBPHS.bit.TBPHS = 0x009C;        //相位为45度(TBPHS 156)

          EPwm2Regs.TBCTR = 0x0000;                    //清除计数器

     

          //设置 TBCLK

          EPwm2Regs.TBCTL.bit.CTRMODE = TB_COUNT_UPDOWN;//向上计数

          EPwm2Regs.TBCTL.bit.PHSEN = TB_ENABLE;      //启用相位加载

          EPwm2Regs.TBCTL.bit.HSPCLKDIV = TB_DIV1;    

          EPwm2Regs.TBCTL.bit.CLKDIV = TB_DIV2;

     

          EPwm2Regs.CMPCTL.bit.SHDWAMODE = CC_SHADODE;  //每0加载一次寄存器

          EPwm2Regs.CMPCTL.bit.SHDWBMODE = CC_SHADOW;

          EPwm2Regs.CMPCTL.bit.LOADAMODE = CC_CTR_ZERO;

          EPwm2Regs.CMPCTL.bit.LOADBMODE = CC_CTR_ZERO;

     

     

     

    void configure_pwm3 ()

          EPwm3Regs.TBPRD = 1250;                      //设置定时器周期

          EPwm3Regs.TBPHS.bit.TBPHS = 0x0138;        //相位为90度(TBPHS 312)

          EPwm3Regs.TBCTR = 0x0000;                    //清除计数器

     

          //设置 TBCLK

          EPwm3Regs.TBCTL.bit.CTRMODE = TB_COUNT_UPDOWN;//向上计数

          EPwm3Regs.TBCTL.bit.PHSEN = TB_ENABLE;      //启用相位加载

          EPwm3Regs.TBCTL.bit.HSPCLKDIV = TB_DIV1;    

          EPwm3Regs.TBCTL.bit.CLKDIV = TB_DIV2;

     

          EPwm3Regs.CMPCTL.bit.SHDWAMODE = CC_SHADODE;  //每0加载一次寄存器

          EPwm3Regs.CMPCTL.bit.SHDWBMODE = CC_SHADOW;

          EPwm3Regs.CMPCTL.bit.LOADAMODE = CC_CTR_ZERO;

          EPwm3Regs.CMPCTL.bit.LOADBMODE = CC_CTR_ZERO;

     

     

     

     

     

    _interrupt void PWM_interrupt (void)

     

     

      GpioDataRegs.GPASET.bit.GPIO13 = 1;

     

      

          //设置串联转换器的占空比

          Duty_P1 =(float) PWM_PERIOD / 2;

          EPwm1Regs.CMPA.bit.CMPA =(int) Duty_P1;

          EPwm1Regs.CMPB.bit.CMPB =(int) Duty_P1;

     

          //设置操作

          EPwm1Regs.AQCTLA.bit.CAU = AQ_SET;          //设置 PWM1A  

          EPwm1Regs.AQCTLA.bit.CAD = AQ_CLEAR;

     

          EPwm1Regs.AQCTLB.bit.CAU = AQ_CLEAR;        //设置 PWM1B  

          EPwm1Regs.AQCTLB.bit.CAD = AQ_SET;

     

     

          Duty_P2 =(float) PWM_PERIOD / 2;

          EPwm2Regs.CMPA.bit.CMPA =(int) Duty_P2;

    EPwm2Regs.CMPB.bit.CMPB =(int) Duty_P2;

     

          //设置操作

          EPwm2Regs.AQCTLA.bit.CAU = AQ_SET;          //设置 PWM1A  

          EPwm2Regs.AQCTLA.bit.CAD = AQ_CLEAR;

     

          EPwm2Regs.AQCTLB.bit.CAU = AQ_CLEAR;        //设置 PWM1A  

          EPwm2Regs.AQCTLB.bit.CAD = AQ_SET;

     

     

          Duty_P3 =(float) PWM_PERIOD / 2;

          EPwm3Regs.CMPA.bit.CMPA =(int) Duty_P3;

          EPwm3Regs.CMPB.bit.CMPB =(int) Duty_P3;

     

          //设置操作

          EPwm3Regs.AQCTLA.bit.CAU = AQ_SET;          //设置 PWM1A  

          EPwm3Regs.AQCTLA.bit.CAD = AQ_CLEAR;

     

          EPwm3Regs.AQCTLB.bit.CAU = AQ_CLEAR;        //设置 PWM1B  

          EPwm3Regs.AQCTLB.bit.CAD = AQ_SET;

     

          

     

          EPwm1Regs.ETCLR.bit.INT = 1;

          PieCtrlRegs.PIEACX.ALL = PIEACK_Group3;

     

          GpioDataRegs.GPACLEAR.bit.GPIO13=1;

     

    PWM.H

    #ifndef PWM_H_

    #define PWM_H_

     

     

    #include "F28x_Project.h"

    #define PWM_PERIOD 1250

    extern float Duty_P1;

    extern float Duty_P2;

    extern float Duty_P3;

     

    void PWM_init()

     

    void configure_pwm1()

    void configure_pwm2()

    void configure_pwm3()

     

    _interrupt void PWM_interrupt (void);

     

     

    #endif /* PWM_H_*/

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

    大家好、

    我想生成三个相移为0、45和90度的 PWM 信号。 我已经上传了我所做的代码。 请参阅上图了解我的期望。 您能否查看并评论该代码是否可行?

    PWM 频率为20kHz

    PWM 脉冲宽度为50us  

    占空比为50%

    使用加/减计数器

    此致

    Haque