工具/软件:Code Composer Studio
大家好,
我是TI Piccolo 32位控制器的新技术。 我将其用于Power Electronics控制应用程序。
这里我需要生成精确的PWM信号来控制ZVS全桥整流器。需要生成4个信号(PWM2A,PWM2B,PWM6A,PWM6B)。 PWM2B和PWM6B分别是PWM2A和PWM6A的补充信号。
我已经为相同的代码执行了以下代码:
void PWMHandler_s_vdPWM_Turn打开(void)
{
EALLOW;
CpuSysRegs.PCLKCR0.bit.TBCLKSYNC = 0;
EDIS;
PWM_Handler_init();
PWM_Handler_config (2,PWM_base_FREQ_microsec);
PWM_Handler_config (6,PWM_base_FREQ_microsec);
EALLOW;
CpuSysRegs.PCLKCR0.bit.TBCLKSYNC = 1U;
EDIS;
}
void PWM_Handler_config (UINT16 u16ChannelID,UINT16 u16Period)
{
UINT16 PWM_TBPRD;
(* ePWM[u16ChannelID]).TBCTL.bit.PRDLD =(UINT16) TB_shadow;
PWM_TBPRD =(UINT16)((u16Period *(float)(TB_Clock/2)));
(* ePWM[u16ChannelID]).TBPRD = PWM_TBPRD;
(* ePWM[u16ChannelID]).TBCTL.bit.CTRMODE =(UINT16) TB_COUNT_UDOWN;
(* ePWM[u16ChannelID]).TBCTL.bit.HSPCLKDIV =(UINT16) TB_DIV1;
(* ePWM[u16ChannelID]).TBCTL.bit.CLKDIV =(UINT16) TB_DIV1;
/*以确保PWM在软件halt *下继续运行
(* ePWM[u16ChannelID]).TBCTL.bit.FREE_SOFT = 2U;
(* ePWM[u16ChannelID]).TBCTL.bit.PHSEN =(UINT16) TB_ENABLE;
(* ePWM[u16ChannelID]).TBCTL.bit.SYNCOSEL =(UINT16) TB_SYNC_IN;
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
(* ePWM[u16ChannelID]).ETSEL.bit.SOCAEN = 1U;
(* ePWM[u16ChannelID]).ETPS.bit.SOCPSSEL = 1U;
(* ePWM[u16ChannelID]).ETSOCPS.bit.SOCAPRD2 = 5U;
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/* PWM2 */
IF (2 == u16ChannelID){
/*用于输出a */
EPwm2Regs.AQCTLA.bit.CAU =(UINT16) AQ_SET;
EPwm2Regs.AQCTLA.bit.CBU =(UINT16) AQ_NO_ACTION;
EPwm2Regs.AQCTLA.bit.CBD =(UINT16) AQ_CLEAR;
EPwm2Regs.AQCTLA.bit.CAD =(UINT16) AQ_NO_ACTION;
EPwm2Regs.CMPCTL.bit.SHDWAMODE =(UINT16) CC_SHAME;
/*用于输出B */
EPwm2Regs.AQCTLB.bit.CAU =(UINT16) AQ_CLEAR;
EPwm2Regs.AQCTLB.bit.CBU =(UINT16) AQ_NO_ACTION;
EPwm2Regs.AQCTLB.bit.CBD =(UINT16) AQ_SET;
EPwm2Regs.AQCTLB.bit.CAD =(UINT16) AQ_NO_ACTION;
EPwm2Regs.CMPCTL.bit.SHDWBMODE =(UINT16) CC_SHADO;
}
/* PWM6 */
IF (6 == u16ChannelID){
/*用于输出a */
EPwm6Regs.AQCTLA.bit.CAU =(UINT16) AQ_NO_ACTION;
EPwm6Regs.AQCTLA.bit.CBU =(UINT16) AQ_SET;
EPwm6Regs.AQCTLA.bit.CBD =(UINT16) AQ_NO_ACTION;
EPwm6Regs.AQCTLA.bit.CAD =(UINT16) AQ_CLEAR;
EPwm6Regs.CMPCTL.bit.SHDWAMODE =(UINT16) CC_SHAME;
/*用于输出B */
EPwm6Regs.AQCTLB.bit.CAU =(UINT16) AQ_NO_ACTION;
EPwm6Regs.AQCTLB.bit.CBU =(UINT16) AQ_CLEAR;
EPwm6Regs.AQCTLB.bit.CBD =(UINT16) AQ_NO_ACTION;
EPwm6Regs.AQCTLB.bit.CAD =(UINT16) AQ_SET;
EPwm6Regs.CMPCTL.bit.SHDWBMODE =(UINT16) CC_SHADO;
}
/*死区插入*/
(* ePWM[u16ChannelID]).DBCTL.bit.out模式= DB_FULL启用;
(* ePWM[u16ChannelID]).DBCTL.bit.POLSEL = DB_ACTV_HIC;
(* ePWM[u16ChannelID]).DBCTL.bit.in_mode = DBA_All;
(*ePWM[u16ChannelID]).DBRED.bit.DBRED = 200u;
(* ePWM[u16ChannelID]).DBFED.bit.DBFED = 200u;
}
通过这种方式,我能够生成所需的PWM,并在互补信号之间生成所需的死区。我的问题是PWM信号何时开始。我希望所有信号都能同时开始,但我看到信号PWM6A和PWM6B的分段出现延迟(~100ms)...什么 我观察到PWM2A和PWM2B一起开始。 同时,信号PWM6B会变为高电平(我推测是因为死区),但不会再切换100毫秒。请从示波器中查找屏幕截图:
由于我正在使用这些PWM以较高的电压控制电源设备,因此在启动时这种行为会导致许多问题(高浪涌等)...有人能告诉我我我在这里做了什么???
提前感谢您的支持,
此致
西山
