TMS320F28379D: 关于死区的问题

Part Number: TMS320F28379D
Other Parts Discussed in Thread: C2000WARE

在使用F28379d时,时钟周期为5ns,我设置10MHz的PWM波,我对PWMA设置了高精度PWM,将占空比设置为55%,对PWMB设置为基于PWMA的反转,理想情况下PWMB的占空比为0.45,但是实际输出为0.5.这是什么原因?

这是我初始化和配置HRPWM占空比的代码。

void HRPWM_Config(period)
{
Uint16 j;

for (j = 1;j < PWM_CH;j++)
{
(*ePWM[j]).TBCTL.bit.PRDLD = TB_SHADOW; // set Shadow load
(*ePWM[j]).TBPRD = period; // PWM frequency = 1 / period
(*ePWM[j]).CMPA.bit.CMPA = period / 2; // set duty 50% initially
(*ePWM[j]).CMPA.bit.CMPAHR = (1 << 8); // initialize HRPWM extension
(*ePWM[j]).TBPHS.all = 0;
(*ePWM[j]).TBCTR = 0;

(*ePWM[j]).TBCTL.bit.CTRMODE = TB_COUNT_UPDOWN;
(*ePWM[j]).TBCTL.bit.PHSEN = TB_DISABLE;
(*ePWM[j]).TBCTL.bit.SYNCOSEL = TB_SYNC_DISABLE;
(*ePWM[j]).TBCTL.bit.HSPCLKDIV = TB_DIV1;
(*ePWM[j]).TBCTL.bit.CLKDIV = TB_DIV1;
(*ePWM[j]).TBCTL.bit.FREE_SOFT = 11;

(*ePWM[j]).CMPCTL.bit.LOADAMODE = CC_CTR_ZERO;
(*ePWM[j]).CMPCTL.bit.LOADBMODE = CC_CTR_ZERO;
(*ePWM[j]).CMPCTL.bit.SHDWAMODE = CC_SHADOW;
(*ePWM[j]).CMPCTL.bit.SHDWBMODE = CC_SHADOW;


(*ePWM[j]).AQCTLA.bit.CAD = AQ_SET; // PWM toggle high/low
(*ePWM[j]).AQCTLA.bit.CAU = AQ_CLEAR;

EALLOW;
(*ePWM[j]).HRCNFG.all = 0x0;
(*ePWM[j]).HRCNFG.bit.EDGMODE = HR_FEP; // MEP control on falling edge
(*ePWM[j]).HRCNFG.bit.CTLMODE = HR_CMP;
(*ePWM[j]).HRCNFG.bit.HRLOAD = HR_CTR_ZERO;

#if(AUTOCONVERT)
(*ePWM[j]).HRCNFG.bit.AUTOCONV = 1; // Enable auto-conversion
// logic
#endif
(*ePWM[j]).HRPCTL.bit.HRPE = 0; // Turn off high-resolution period
// control.

(*ePWM[j]).DBCTL.bit.OUT_MODE = DB_FULL_ENABLE;
(*ePWM[j]).DBCTL.bit.POLSEL = DB_ACTV_HIC;
(*ePWM[j]).DBCTL.bit.IN_MODE = DBA_ALL;
(*ePWM[j]).DBRED.bit.DBRED = 0;
(*ePWM[j]).DBFED.bit.DBFED = 0;

EDIS;
}
}
这是我PWM初始化的代码。
float PWM_DUTY = 0.45;
Uint16 PWM_PRD = 10;
HRPWM_Config(PWM_PRD); // ePWMx target
Uint16 cifang = (1 << 15);
EALLOW;

DutyFine = PWM_DUTY * cifang;
if(UpdateFine)
{for(i = 1;i < PWM_CH;i++)
{
CMPA_reg_val = ((long)DutyFine * ((*ePWM[i]).TBPRD )) >> 15;
// CMPB_reg_val = ((long)DutyFine * ((*ePWM[i]).TBPRD )) >> 15;
temp = ((long)DutyFine * ((*ePWM[i]).TBPRD )) ;
// temp1 = ((long)DutyFine * ((*ePWM[i]).TBPRD )) ;
temp = temp - ((long)CMPA_reg_val << 15);
// temp1 = temp1 - ((long)CMPB_reg_val << 15);

#if(AUTOCONVERT)
CMPAHR_reg_val = temp << 1; // convert to Q16
CMPBHR_reg_val = temp << 1; // convert to Q16
#else
CMPAHR_reg_val = ((temp * MEP_ScaleFactor) +
(0x0080 << 7)) >> 15;
CMPAHR_reg_val = (CMPAHR_reg_val << 8) * 2;

#endif
}
}
else
{
for(i = 1;i < PWM_CH;i++)
{
(*ePWM[i]).CMPA.bit.CMPA = (((long)DutyFine *
((*ePWM[i]).TBPRD )) >> 15);
}
}
这是我设置HRPWM占空比的代码。

  • 您好,

    已经收到了您的案例,调查需要些时间,感谢您的耐心等待

  • 您好

    请在 CCS 调试视图中检查寄存器、以了解实际写入 CMPA/CMPAHR 寄存器的内容。 请查看有关 HRPWM 的 C2000Ware 位域和 driverlib 示例、以检查如何正确控制占空比: C:\ti\c2000\C2000Ware_5_03_00_00\driverlib\f28p55x\examples\HRPWM C:\ti\c2000\C2000Ware_5_03_00_00\device_support\f28p55x\examples\HRPWM

x 出现错误。请重试或与管理员联系。