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.
您好,看了那篇帖子,将装载模式设置为立即装载。但是还是没有效果。
我做的主要是方波的六步换向控制,每换一相,需要EPWM由调制转为常开或常闭。但是每次调制的第一个脉宽宽度与我设置的占空比不对。
我在想是否是在换向时与EPWM的计数值不一致导致的原因,在换向前有将计数值清零 Epwm1Regs.TBCTR = 0,但发现Epwm1Regs.TBCTR 溢出(大于当前周期值TBPRD)。请问该如何设置呢?
附上EPWM配置和波形图
EPWM配置:
\
EALLOW; \
SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 0; \
EDIS; \
\
/* Init Timer-Base Period Register for EPWM1-EPWM3*/ \
EPwm1Regs.TBPRD = v.PWMprd; \
EPwm2Regs.TBPRD = v.PWMprd; \
EPwm3Regs.TBPRD = v.PWMprd; \
\
/* Init Timer-Base Counter Register for EPWM1-EPWM3*/ \
EPwm1Regs.TBCTR = 0x0000; \
EPwm2Regs.TBCTR = 0x0000; \
EPwm3Regs.TBCTR = 0x0000; \
\
/* Init Compare Register for EPWM1-EPWM3 to 50% duty cycle */ \
EPwm1Regs.CMPA.half.CMPA = v.PWMprd/2; \
EPwm2Regs.CMPA.half.CMPA = v.PWMprd/2; \
EPwm3Regs.CMPA.half.CMPA = v.PWMprd/2; \
\
/* Init Timer-Base Phase Register for EPWM1-EPWM3*/ \
EPwm1Regs.TBPHS.half.TBPHS = 0; \
EPwm2Regs.TBPHS.half.TBPHS = 0; \
EPwm3Regs.TBPHS.half.TBPHS = 0; \
\
/* Init Timer-Base Control Register for EPWM1-EPWM3*/ \
EPwm1Regs.TBCTL.all = PWM_CNTL_INIT_STATE; \
EPwm2Regs.TBCTL.all = PWM_CNTL_INIT_STATE; \
EPwm3Regs.TBCTL.all = PWM_CNTL_INIT_STATE; \
\
/* Setup Sync*/ \
EPwm3Regs.TBCTL.bit.SYNCOSEL = 1; \
EPwm2Regs.TBCTL.bit.SYNCOSEL = 0; \
EPwm1Regs.TBCTL.bit.SYNCOSEL = 0; \
\
/* Allow each timer to be sync'ed*/ \
EPwm3Regs.TBCTL.bit.PHSEN = 0; \
EPwm2Regs.TBCTL.bit.PHSEN = 1; \
EPwm1Regs.TBCTL.bit.PHSEN = 1; \
\
/* Set count dir after sync event*/ \
EPwm3Regs.TBCTL.bit.PHSDIR = 0; \
EPwm2Regs.TBCTL.bit.PHSDIR = 1; \
EPwm1Regs.TBCTL.bit.PHSDIR = 1; \
\
/* Init Compare Control Register for EPWM1-EPWM3 */ \
EPwm1Regs.CMPCTL.all = BLDCPWM_CMPCTL_INIT_STATE; \
EPwm2Regs.CMPCTL.all = BLDCPWM_CMPCTL_INIT_STATE; \
EPwm3Regs.CMPCTL.all = BLDCPWM_CMPCTL_INIT_STATE; \
\
/* Init Action Qualifier Output A Register for EPWM1-EPWM3*/ \
EPwm1Regs.AQCTLA.all = PWM_CNTL_AQCTLA_INIT_STATE_4; \
EPwm2Regs.AQCTLA.all = PWM_CNTL_AQCTLA_INIT_STATE_4; \
EPwm3Regs.AQCTLA.all = PWM_CNTL_AQCTLA_INIT_STATE_4; \
\
/* Init Dead-Band Generator Control Register for EPWM1-EPWM3*/ \
EPwm1Regs.DBCTL.all = DBCTL_INIT_STATE; \
EPwm2Regs.DBCTL.all = DBCTL_INIT_STATE; \
EPwm3Regs.DBCTL.all = DBCTL_INIT_STATE; \
\
/* Init Dead-Band Generator for EPWM1-EPWM3*/ \
EPwm1Regs.DBFED = DBCNT_INIT_STATE; \
EPwm1Regs.DBRED = DBCNT_INIT_STATE; \
EPwm2Regs.DBFED = DBCNT_INIT_STATE; \
EPwm2Regs.DBRED = DBCNT_INIT_STATE; \
EPwm3Regs.DBFED = DBCNT_INIT_STATE; \
EPwm3Regs.DBRED = DBCNT_INIT_STATE; \
\
/* Init PWM Chopper Control Register for EPWM1-EPWM3*/ \
EPwm1Regs.PCCTL.all = BLDCPWM_PCCTL_INIT_STATE; \
EPwm2Regs.PCCTL.all = BLDCPWM_PCCTL_INIT_STATE; \
EPwm3Regs.PCCTL.all = BLDCPWM_PCCTL_INIT_STATE; \
\
\
其中
#define PWM_CNTL_INIT_STATE ( FREE_RUN_FLAG + \
PRDLD_SHADOW + \
TIMER_CNT_UPDN + \
HSPCLKDIV_PRESCALE_X_1 + \
CLKDIV_PRESCALE_X_1 + \
PHSDIR_CNT_UP + \
CNTLD_DISABLE )
#define BLDCPWM_CMPCTL_INIT_STATE ( LOADAMODE_ZRO + \
LOADBMODE_ZRO + \
SHDWAMODE_IMMEDIATE + \
SHDWBMODE_IMMEDIATE )
#define PWM_CNTL_AQCTLA_INIT_STATE_4 ( PRD_SET + CAU_CLEAR )
#define DBCTL_INIT_STATE (BP_ENABLE + POLSEL_ACTIVE_HI_CMP)
#define BLDCPWM_PCCTL_INIT_STATE CHPEN_DISABLE
换向部分函数:
#define MOD6CNTDIR_MACRO(v) \
\
if (v.TrigInput > 0) \
{ \
if(v.Counter == 5) \
{ \
v.Counter = 0; \
data=data+1; \
datasa=1; \
EPwm1Regs.TBCTR = 3000; \
EPwm2Regs.TBCTR = 3000; \
EPwm3Regs.TBCTR = 3000; \
} \
else \
{ \
v.Counter++; \
EPwm1Regs.TBCTR = 3000; \
EPwm2Regs.TBCTR = 3000; \
EPwm3Regs.TBCTR = 3000; \
} \
}
有时会出现后面这种叠加,有时是主贴的第一个脉冲宽度不同