工具/软件:Code Composer Studio
大家好、
我正在使用隔离式相移全桥转换器。 我使用 TMS320F28377D 器件通过相移调制为 MOSFET 生成 PWM 信号。 因此、我需要为 MOSFET 生成相移 PWM 信号。
有人能帮我编码如何生成可变相移 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
大家好、
我正在使用隔离式相移全桥转换器。 我使用 TMS320F28377D 器件通过相移调制为 MOSFET 生成 PWM 信号。 因此、我需要为 MOSFET 生成相移 PWM 信号。
有人能帮我编码如何生成可变相移 PWM 信号吗?
提前感谢您。
大家好、Md Mejbaul Haque、
每个 ePWM 模块可以相对于另一个 ePWM 模块具有相移。 您将要使用的寄存器为 PHSEN (时基相位启用)和 TBPHS。 一旦被启用、当模块接收到一个同步脉冲时、TBPHS 中编程的值将被复制到 TBCTR 中。
我建议在选择模块之前查看同步方案、以便您了解如何在模块之前路由同步。
在以下文档中、请查看以下内容:
此致、
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_*/