请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
器件型号: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); }