请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
器件型号:TMS320F28384S 工具与软件:
您好!
我正在运行一个在 ePWM1和 ePWM4之间具有相移的转换器、每个转换器使用上-下计数具有0.5个占空比。 相位 从0度变为180度。
不过、我在特定相位上遇到 ePWM3上脉冲缺失的问题。
为了解决此问题、我曾尝试在 ePWM3上实现 T1/T2事件、但我无法找到如何正确使用 T1/T2事件。
如果您能提供任何建议、我将不胜感激。
下面是我的代码:
void updatePhase(int16 ch, float32 phase)
{
while(phase > 360.0) phase -= 360.0;
while(phase < 0.0) phase += 360.0;
if(phase > 180.0) {
phase -= 360.0;
}
if(phase == 0.0) {
ePWM_Regs[ch]->TBPHS.bit.TBPHS = 0;
}
else if(phase > 0.0){
ePWM_Regs[ch]->TBCTL.bit.PHSDIR = 0;
ePWM_Regs[ch]->TBPHS.bit.TBPHS = (int16)((float32)ePWM_Regs[ch]->TBPRD * phase * 0.00555555); // 0.00277778 = 1/360
}
else{ // phase < 0.0
ePWM_Regs[ch]->TBCTL.bit.PHSDIR = 1;
ePWM_Regs[ch]->TBPHS.bit.TBPHS = (int16)((float32)ePWM_Regs[ch]->TBPRD * -phase * 0.00555555); // 0.00277778 = 1/360
}
}
void updateDuty_Sym(Uint16 ch, float32 duty)
{
ePWM_Regs[ch]->CMPA.bit.CMPA = (Uint32)((float32)ePWM_Regs[ch]->TBPRD * duty);
ePWM_Regs[ch]->CMPB.bit.CMPB = (Uint32)((float32)ePWM_Regs[ch]->TBPRD * (1-duty));
}
void conf_ePWM_Sym(Uint16 ch, float32 freq)
{
// Set actions
ePWM_Regs[ch]->AQCTLA.bit.CAD = AQ_SET;
ePWM_Regs[ch]->AQCTLA.bit.CAU = AQ_CLEAR;
ePWM_Regs[ch]->AQCTLB.bit.CBD = AQ_SET;
ePWM_Regs[ch]->AQCTLB.bit.CBU = AQ_CLEAR;
if(ch==4){
ePWM_Regs[ch]->TBCTL.bit.PHSEN = TB_DISABLE;
ePWM_Regs[ch]->EPWMSYNCOUTEN.bit.ZEROEN = 0x1;
ePWM_Regs[ch]->TBCTL.bit.SYNCOSEL = 0x1; //TB_CTR_ZERO;
ePWM_Regs[ch]->TBPHS.bit.TBPHS = 0;
}
else if(ch!=4) {
ePWM_Regs[ch]->TBCTL.bit.PHSEN = TB_ENABLE;
ePWM_Regs[ch]->EPWMSYNCINSEL.bit.SEL = 0x4;
ePWM_Regs[ch]->TBCTL.bit.SYNCOSEL = 0x1; //TB_SYNC_IN;
}
SyncSocRegs.SYNCSELECT.bit.SYNCOUT = 0x1;
// Setup TBCLK
ePWM_Regs[ch]->TBCTL.bit.CTRMODE = TB_COUNT_UPDOWN; // Count up-down
ePWM_Regs[ch]->TBCTL.bit.PRDLD = TB_SHADOW;
ePWM_Regs[ch]->TBCTL.bit.HSPCLKDIV = TB_DIV1;
ePWM_Regs[ch]->CMPCTL.bit.SHDWAMODE = CC_SHADOW; // Load registers every ZERO
ePWM_Regs[ch]->CMPCTL.bit.SHDWBMODE = CC_SHADOW;
ePWM_Regs[ch]->CMPCTL.bit.LOADAMODE = CC_CTR_ZERO;
ePWM_Regs[ch]->CMPCTL.bit.LOADBMODE = CC_CTR_ZERO;
ePWM_Regs[ch]->DBCTL.bit.IN_MODE = DBA_RED_DBB_FED;
ePWM_Regs[ch]->DBCTL.bit.POLSEL = DB_ACTV_HIC;
ePWM_Regs[ch]->DBCTL.bit.OUT_MODE = DB_FULL_ENABLE; //deadtime
updateDuty_Sym(ch, 0.0);
updatePhase(ch, 0.0);
updateFreq(ch, freq);
updateDeadtime(ch, 0.0);
}