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.

[参考译文] TMS320F28377S:使用死区模块在低占空比时的 PWM 干扰

Guru**** 2465890 points


请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/596306/tms320f28377s-pwm-glitch-at-low-duty-cycle-using-dead-band-module

器件型号:TMS320F28377S

大家好、

我使用28377S 为四相交错转换器实现调制器/平均电流模式环路。  除了我驱动极低占空比时、一切都正常。  当我继续降低占空比时、EPWMxA 波形最终始终为低电平、并且 EPWMxB 波形上出现一个窄脉冲。  最终 EPWM1xB 上的脉冲消失、然后其他 EPWMxB 脉冲消失、这是我所期望的、但一旦其他脉冲在0占空比消失、EPWM1B 上的脉冲将恢复。  我发现这非常奇怪。  如果有人能向我指出如何解决这个问题的正确方向、那将是有用的。  我已经为下面的 ePWM 模块添加了配置代码。

此致、

Lance Hummel

void Init_ePWM (void)
{
//
////设置 TBCLK
//
/////注意:此处理器的 ePWM 模块具有60MHz 至100MHz 的时钟频率的内置硬件限制以实现全功能。
//要处理此问题,默认情况下,在寄存器 ClkCfgRegs.PERCLKDIVSEL.bit.EPWMCLKDIV
EPwm1Regs.TBCTL.bit.CTRMODE 中启用主 CPU 时钟的整数/2;//向上计数
-向下计数 EPwm1Regs.TBCTL.bit.CTRMODE = TB_COUNT_PRD;//向上计数-向下计数 EPwm1PRD = TBRAM1周期= TBEP_COUNT_PRD; //设置定时器周期
EPwm1Regs.TBCTL.bit.PHSEN = TB_DISABLE;//禁用相位加载
EPwm1Regs.TBCTL.bit.SYNCOSEL = TB_CTR_ZERO;//用作锁相 PWM
的 SYNC 信号 EPwm1Regs.TBPHS.bit.TBPHS = 0x0000; //相位为0
EPwm1Regs.TBCTR = 0x0000; //清除计数
器 EPwm1Regs.TBCTL.bit.HSPCLKDIV = TB_DIV1;//时钟与 SYSCLKOUT
EPwm1Regs.TBCTL.bit.CLKDIV = TB_DIV1;

//
设置影子寄存器加载为零
// EPwm1Regs.TBCMDR.BIT.OCC.TL.BIT.AMPCM1Rd.TL.TL.RCMTL.TL.RCMTL.TL.TL.RCMTL.TL.RCMTL.TL.TL.RCMTL.TL.TL.TL.RCMTL.TL.TL.RCMTL.TL.TL.TL.TL.TL.RCMTL.TL.TL.TL.TL.TL.TL.RCMTL.TL.TL.RCMTL.TL.TL.TL.TL.TL.TL.TL.TBIT.RCMTL.TL.TL.TL.TL.TL.TL.TL.TBIT_RCMTL.T








//设置比较 A 值
EPwm1Regs.CMPB.bit.CMPB = ePWM_INTERRUPT_COUNT; //设置比较 B 值

//
设置操作
//
EPwm1Regs.AQCTLA.bit.CAU = AQ_CLEAR; //在零
EPwm1Regs.AQCTLA.bit.CAD = AQ_SET 上设置 PWM1A;//在事件 A 上清除 PWM1A、
//向上计数

//EPwm1Regs.AQCTLB.bit.CAU = AQ_SET; //将 PWM1B 置为零
// EPwm1Regs.AQCTLB.bit.CAD = AQ_CLEAR; //在事件 B 上清除 PWM1B,
//向上计数
//
//设置死区(假设非反相栅极驱动信号和 EPWMxA 作为两个延迟的源)
//
EPwm1Regs.DBCTL.bit.out_mode = DB_full_enable;
EPwm1Regs.DBCTL.bit.POLSEL = DB_ACTV_HIC;
EPwm1Rd.DB1.00n

= 0X100dB/dB/dB/dB/dB/dB/dB/dB/dB/dB/dB/dB/dB/dB/dB/dB/dB/dB/dB/dB/dB/dB/dB/dB/dB/dB/dB/dB/dB/dB/dB/dB/dB/dB/dB/dB/dB/dB/dB/dB/dB/dB/dB/dB/dB/dB/dB/dB/dB/dB/dB/dB/dB/dB/dB///100MHz EPWMCLK =>每个计数10ns、假设100ns 死区启动

//
中断、其中我们将更改比较值
//
EPwm1Regs.ETSEL.bit.INTSEL = et_CTRD_CMPB; //选择 CMPB 上的 INT 向下计数
EPwm1Regs.ETSEL.bit.INTEN = 1; //启用 INT
EPwm1Regs.ETPS.bit.INTPRD = et_1st; //生成第一个事件的 INT

//
配置 ADC SOCA 信号
//
EPwm1Regs.ETSEL.bit.SOCASEL = et_CTR_PRD;
EPwm1Regs.ETSEL.bit.SOCAEN = 1;
EPwm1Regs.ETPS.SOCAPReg= et_1st;

//
//////Eprm1.Epr.EHR1.t_HRCMOL.CLG.E1.CMOL.REG1.RP.HR=0;EP_TR.EHRM1RPM.CLG.HR.CLAD=0_RPM.EHR.CLM0_RPM.ENDR.HR.ENDR.ENDR.TR.ENDR.TR.TR.ENTR.TR.ENTR.ENTR.ENTR.ENTR.ENTR.ENTR.ENTR.TR.TR.ENTR.ENTR.TR.TR.TR.TR.TR.TR






//EPwm1Regs.HRCNFG.bit.EDGMODEB = HR_BEP;
//EPwm1Regs.HRCNFG.bit.CTLMODEB = HR_CMP;
//EPwm1Regs.HRCNFG.bit.HRLOADB = HR_CTR_Zer_PRD;EPwm1RCONV.PWCLG1.THRCLA.T1.TB.0=HRCNTL.RP.HRCLADB

= HRES.PH1.T1.TB.0.HRCLP= HRCLP1.T1.T1.TB.THRES.TR.PH.TRFG.TRFG.TRFG.
EPwm1Regs.HRPCTL.bit.HRPE = 1;
EDIS;

//
配置跳闸区域模块寄存器
//
/* EALLOW;
EPwm1Regs.TZSEL.bit.OSHT1 = TZ_ENABLE;
EPwm1Regs.TZCTL.bit.TZA = TZ_FORCE
;






注意:TZ_TZLO/TSN = TZ1MHz / TLD.TZ.TLD.TLD.TOM 的完整频率限制;注意:TZ.TZ.TZ.TLD.TLD.TZ.TLD.TZ.TZ.TS/ TCLK = TZ.TLD.TLD.TLD.TLD.TLD.TZ.TZ.TLD.TLD.TLD.TZ.
//要处理此问题,默认情况下,在寄存器 ClkCfgRegs.PERCLKDIVSEL.bit.EPWMCLKDIV
EPwm2Regs.TBCTL.bit.CTRMODE 中启用主 CPU 时钟的整数/2;//向上计数 EPwm2Regs.TBCTL.bit.CTRMODE = TB_COUNT_PRD;//向上计数-
向下计数 EPwm2PRD = TEPwm2Regs.ePeriod; //设置定时器周期
EPwm2Regs.TBCTL.bit.PHSEN = TB_ENABLE;//启用相位加载
EPwm2Regs.TBCTL.bit.SYNCOSEL = TB_SYNC_IN;//通过主
EPwm2Regs.TBPHS.bit.TBPHS 的 SYNC 信号
;EPwM_PHASE.0000 = ePWM_PHASE_OFFSET = 0x90度;// //清除计数
器 EPwm2Regs.TBCTL.bit.HSPCLKDIV = TB_DIV1;//时钟与 SYSCLKOUT
EPwm2Regs.TBCTL.bit.CLKDIV = TB_DIV1;

//
设置影子寄存器加载为零
// EPwm2Regs.TBCMDR.BIT.OCC.TL.TCMDR.TL.TL.RCMDR.TL.TL.RCMTL.TL.TL.RCMTL.TL.RCMTL.TL.TL.RCMTL.TL.TL.RCMTL.TL.TL.RCMTL.TL.RCMTL.TL.TL.RCMTL.TL.TL.TL.TL.TL.RCMTL.TL.TL.RCMTL.TL.TL.TL.TL.TL.TL.TL.TL.RCMTL.TL.TL.TL.TL.TL.TL.TL.TL.TBIT_RCMTL.TL.TL.TL.T








//设置比较 A 值
EPwm2Regs.CMPB.bit.CMPB = ePWM_INTERRUPT_COUNT; //设置比较 B 值

//
设置操作
//
EPwm2Regs.AQCTLA.bit.CAU = AQ_CLEAR; //在零
EPwm2Regs.AQCTLA.bit.CAD = AQ_SET 上设置 PWM1A; //在事件 A 上清除 PWM1A、
//向上计数

//EPwm2Regs.AQCTLB.bit.CAU = AQ_SET; //将 PWM1B 置为零
// EPwm2Regs.AQCTLB.bit.CAD = AQ_CLEAR; //在事件 B 上清除 PWM1B,
//向上计数
//
//设置死区(假设非反相栅极驱动信号和 EPWMxA 作为两个延迟的源)
//
EPwm2Regs.DBCTL.bit.out_mode = DB_full_enable;
EPwm2Regs.DBCTL.bit.POLSEL = DB_ACTV_HIC;EPw0X100d.DBRREF_REF_ENAB.DBM0=0X100d.DBRREF_REF_RESH


= 0x100d.DBRd.DBRd.DBM0.DBRREF_REF_REF_REF_REF_REF_N;EP100ML.DBMREF_REF_REF_REF_N = 0X100MREF_REF_REF_REF_REF_N = 0X100MAD.DBML.DBMREF_REF_REF_REF_REF_REF_REF_REF_//100MHz EPWMCLK =>每个计数10ns、假设100ns 死区启动

//
中断、其中我们将更改比较值
//
EPwm2Regs.ETSEL.bit.INTSEL = et_CTRD_CMPB; //选择 CMPB 上的 INT 向下计数
EPwm2Regs.ETSEL.bit.INTEN = 1; //启用 INT
EPwm2Regs.ETPS.bit.INTPRD = et_1st; //生成第一个事件的 INT

//
配置 ADC SOCA 信号
//
EPwm2Regs.ETSEL.bit.SOCASEL = et_CTR_PRD;
EPwm2Regs.ETSEL.bit.SOCAEN = 1;
EPwm2Regs.ETPS.SOCAPReg= et_1ST;

////////EPwmREP.HRFG.HRCM.ENDR.E=0XmHR_TR.ENDR.E0_TRFG.HR_TR.ENDR.ENDR.ENDR.E0=0_TR.ENTR.ENTR.ENTR.ENTR.EPM=0_HR_HR_TRFG.HR.ENTR.ENTR.ENTR.ENTR.ENTR.ENTR.ENTR.ENTR.ENTR.ENTR.ENTR.ENTR.ENTR.ENTR.ENTR.ENTR.ENTR.ENTR







//EPwm2Regs.HRCNFG.bit.EDGMODEB = HR_BEP;
//EPwm2Regs.HRCNFG.bit.CTLMODEB = HR_CMP;
// EPwm2Regs.HRCNFG.bit.HRLOADE = HR_ZERO;EPwm2REG1.THRES.TR.TRFG.HRCMP1.T1.THRCLA


= HRES.TR.TR.TRFG.HRCMP1.T1.T1.TB.THRCMP1.TB.0.TRFG.HRCLP= HRES.TR.TRFG.HRCLP1.T1.T1.THRES.TRFG.HRES.TRFG.HRCLP1.T1.T1.T


//
//配置跳闸区域模块寄存器
//
/*EALLOW;
EPwm2Regs.TZSEL.bit.OSHTHT1 = TZ_ENABLE;
EPwm2Regs.TZCTL.bit.TZA = TZ_FORCE_LO;
EPwm2Regs.TZCTL.bit.TSB = TZ_THS/针对
TZ_CLK/ TZ_N




模块的完整频率限制:/TSN 为100MHz/TBL/ TZ_LO/。注意:
//要处理此问题,默认情况下,在寄存器 ClkCfgRegs.PERCLKDIVSEL.bit.EPWMCLKDIV
EPwm3Regs.TBCTL.bit.CTRMODE 中启用主 CPU 时钟的整数/2;//向上计数 EPwm3Regs.TBCTL.bit.CTRMODE = TB_COUNT_PRD;//向上计数-
向下计数 EPwm3PRD = TBRAM_PERIOD = TBEP_COUNTL.PRD; //设置定时器周期
EPwm3Regs.TBCTL.bit.PHSEN = TB_ENABLE;//启用相位加载
EPwm3Regs.TBCTL.bit.SYNCOSEL = TB_SYNC_IN;//通过主
EPwm3Regs.TBPHS.bit.TBPHS = EPwPM_PHASE_INP= 0x180度;// EPwmRegs.TBR = 0x180度/偏移量
//清除计数
器 EPwm3Regs.TBCTL.bit.HSPCLKDIV = TB_DIV1;//时钟与 SYSCLKOUT
EPwm3Regs.TBCTL.bit.CLKDIV = TB_DIV1;

//
设置影子寄存器加载为零
// EPwm3Regs.TBCMDR.BIT.OCC.BIT.AMPCM0








= 0;// EPmCOD.AMPCM0_ADDR.TL.TL.TL.RCMOCT.TL.TL.TL.TL.RCMOCT.TL.TL.TL.RCMTL.TL.TL.RCMTL.TL.TL.RCMTL.TL.TL.TL.RCMTL.TL.TL.TL.TL.RCMTL.TL.TL.RCMTL.TL.TL.TL.TL.RCMTL.TL.TL.RCMTL.TL.TL.TL.TL.TL.RCMTL.TL.TL.TL.TBIT. //设置比较 A 值
EPwm3Regs.CMPB.bit.CMPB = ePWM_INTERRUPT_COUNT; //设置比较 B 值

//
设置操作
//
EPwm3Regs.AQCTLA.bit.CAU = AQ_CLEAR; //在零
EPwm3Regs.AQCTLA.bit.CAD = AQ_SET 上设置 PWM1A; //在事件 A 上清除 PWM1A、
//向上计数

//EPwm3Regs.AQCTLB.bit.CAU = AQ_SET; //将 PWM1B 置为零
// EPwm3Regs.AQCTLB.bit.CAD = AQ_CLEAR; //在事件 B 上清除 PWM1B,
//向上计数
//
//设置死区(假设非反相栅极驱动信号和 EPWMxA 作为两个延迟的源)
//
EPwm3Regs.DBCTL.bit.out_mode = DB_full_enable;
EPwm3Regs.DBCTL.bit.POLSEL = DB_ACTTV_HIC;
EPwmREF_DP.DCMT.DB300.N =
0x100MHz;EPwREF_DP.DCMT.DB300.N = 0.DB300.DP.DP.DCMT.DCMT.DCMT.DP.DP.DP.DP.DP.DPOL= EP_DP.DP.DP.DP.DP.DP.DP.DP.DP.DP.DP.DP.DP.DP.DP.DP.DP.DP.DP.DP.DP.DP.DP.DP.DP.DP.DP.DP.DP.
//100MHz EPWMCLK =>每个计数10ns、假设100ns 死区启动

//
中断、其中我们将更改比较值
//
EPwm3Regs.ETSEL.bit.INTSEL = et_CTRD_CMPB; //选择 CMPB 上的 INT 向下计数
EPwm3Regs.ETSEL.bit.INTEN = 1; //启用 INT
EPwm3Regs.ETPS.bit.INTPRD = et_1st; //生成第一个事件的 INT

//
配置 ADC SOCA 信号
//
EPwm3Regs.ETSEL.bit.SOCASEL = et_CTR_PRD;
EPwm3Regs.ETSEL.bit.SOCAEN = 1;
EPwm3Regs.ETPS.SOCAPReg= et_1ST;

//////////EprmHR1.Cng.EHRLD.EDR.CLG.0=EP_HRCMOL.CLG.HRG.HRL.RP.EDR.ENDR.CLG.0=0_TR.ENDR.ENDR.TR_TR.EN.ENDR.TR_TRFG.HR=0_TR.ENTR.EN.ENTR.ENTR.ENTR.ENTR.ENTR.ENTR.ENTR.ENTR.ENTR.ENTR.ENTR.ENTR.ENTR.ENTR.ENTR.ENTR.EN.







//EPwm3Regs.HRCNFG.bit.EDGMODEB = HR_BEP;
//EPwm3Regs.HRCNFG.bit.CTLMODEB = HR_CMP;
//EPwm3Regs.HRCNFG.bit.HRLOADE = HR_CTR_ZERO PRD;EPwm3Regs.TRF.PHSM.TRFG.TRFG.0

= HRCLTB.TB.THRCLA.PH.PH.CLB = HRES.TR.PH.PHM0;EPWCLADB = HRSM.TRFG.TRFG.TRFG.TRFG.TR.PH.PH.PH
EPwm3Regs.HRPCTL.bit.HRPE = 1;
EDIS;

//
配置跳闸区域模块寄存器
//
/* EALLOW;
EPwm3Regs.TZSEL.bit.OSHT1 = TZ_ENABLE;
EPwm3Regs.TZCTL.bit.TZA = TZ_FORCE
;





注意:TZ_TLD.TS/ TLD.TSN = TZL/ TLD.TZ.TLD.TOM 的完整频率限制;注意:TZ.TZ.TZ.TS/ TLD.TLD.TLD.TS/ TLD.TLD.TCLK = TZ.TS/ TLD.TLD.TLD.TS/ TLD.TLD.TLD.TLD.TLD.TLD.TCLK
//要处理此问题,默认情况下在寄存器 ClkCfgRegs.PERCLKDIVSEL.bit.EPWMCLKDIV
EPwm4Regs.TBCTL.bit.CTRMODE 中启用主 CPU 时钟的整数/2;//向上计数 EPwm4Regs.TBCTL.bit.CTRMODE = TB_COUNT_PRD;//向上计数-
向下计数 EPwm4Regs.tbpw_period; //设置计时器周期
EPwm4Regs.TBCTL.bit.PHSEN = TB_ENABLE;//启用相位加载
EPwm4Regs.TBCTL.bit.PHSDIR = TB_UP;//倒数以实现270度相移
EPwm4Regs.TBCTL.bit.SYNCOSEL = TB_UP;
//注意:TB_TRS=360度相位同步;// EPwmPWM=Tb.TRS=360度;注意:TB_TRS=Tb.Tb.Tb.Tb.Tb.Tb.Tb.Tb.eRPMs = Tb.Tb.Tb.Tbp = Tb.Tb.Tbp = Tb.Tb.Tb.Tbp = Tb.
//清除计数
器 EPwm4Regs.TBCTL.bit.HSPCLKDIV = TB_DIV1;//时钟与 SYSCLKOUT
EPwm4Regs.TBCTL.bit.CLKDIV = TB_DIV1;

//
设置影子寄存器加载为零
// EPwm4Regs.TBCMDR.BIT.AM4CTL.BIT.AMPCRC.TL.BIT.AM4=



0




;// EPmRCMDR.AM4CT.ADCMDR.TL.TL.TL.TL.TL.RCMTL.TL.TL.RCMTL.TL.TL.RCMTL.TL.RCMTL.TL.TL.RCMTL.TL.TL.TL.TL.TL.RCMTL.TL.TL.TL.TL.RCMTL.TL.TL.TL.TL.TL.TL.TL.TL.TL.RCMTL.TL.TL.TL.TL.RBIT.AM4TL.TL.TL.TL.TL. //设置比较 A 值
EPwm4Regs.CMPB.bit.CMPB = ePWM_INTERRUPT_COUNT; //设置比较 B 值

//
设置操作
//
EPwm4Regs.AQCTLA.bit.CAU = AQ_CLEAR; //在零
EPwm4Regs.AQCTLA.bit.CAD = AQ_SET 上设置 PWM1A; //在事件 A 上清除 PWM1A、
//向上计数

//EPwm4Regs.AQCTLB.bit.CAU = AQ_SET; //将 PWM1B 置为零
// EPwm4Regs.AQCTLB.bit.CAD = AQ_CLEAR; //在事件 B 上清除 PWM1B,
//向上计数
//
//设置死区(假设非反相栅极驱动信号和 EPWMxA 作为两个延迟的源)
//
EPwm4Regs.DBCTL.bit.out_mode = DB_full_enable;
EPwm4Regs.DBCTL.bit.POLSEL = DB_ACTV_HIC;EPw400.DB40RM.DBRd.REF_REF_ENAB.DBRd.DB400.REF_REF_RESP=

0x100MHz;EPwmREF_DB400.DB400.DB400.DB40RM.DBRREF_REF_REF_REF_REF_REF_REF_REF_REF_N = 0XRMENAB.REF_REF_REF_REF_REF_REF_REF_REF_REF_REF_REF_ENAB.ENABLE.ENABLE.ENABLE.ENABLE.DB
//100MHz EPWMCLK =>每个计数10ns、假设100ns 死区启动

//
中断、其中我们将更改比较值
//
EPwm4Regs.ETSEL.bit.INTSEL = et_CTRD_CMPB; //选择 CMPB 上的 INT 向下计数
EPwm4Regs.ETSEL.bit.INTEN = 1; //启用 INT
EPwm4Regs.ETPS.bit.INTPRD = et_1st; //生成第一个事件的 INT

//
配置 ADC SOCA 信号
//
EPwm4Regs.ETSEL.bit.SOCASEL = et_CTR_PRD;
EPwm4Regs.ETSEL.bit.SOCAEN = 1;
EPwm4Regs.ETPS.SOCAPReg= et_1ST;

//////////EprmHR1.Cng.EHR40Rfg.Epr.Epr.HRCMOLD.HR=0_HR.ENDR.EN.E4RPM=0_HR_TRFG.HR_TRFG.HR.ENDR.ENDR.ENDR.ENDR.TR.TR.TR.TR.EN.ENTR.EN.ENTR.ENTR.ENTR.ENTR.ENTR.ENTR.ENTR.ENTR.ENTR.ENTR.ENTR.ENTR.TR.ENTR.ENTR.EN







//EPwm4Regs.HRCNFG.bit.EDGMODEB = HR_BEP;
//EPwm4Regs.HRCNFG.bit.CTLMODEB = HR_CMP;
//EPwm4Regs.HRCNFG.bit.HRLOADE = HR_CTR_ZERO PRD;EPwm4Regs.TRF.PHRC.THRCLA.TB.0
= HRCNTL.RP.HRCLA.PH.PH.TRB

EPwm4Regs.HRPCTL.bit.HRPE = 1;
EDIS;

//
配置跳闸区域模块寄存器
//
* EALLOW;
EPwm4Regs.TZSEL.bit.OSHT1 = TZ_ENABLE;
EPwm4Regs.TZCTL.bit.TCLA = TZ_FORCE.TLDC.TBR1.TLD.TLDC




= TZ_TLD.TBR1.TLD_TLD.TLD.TLD.TLDC
= TLD.TLD.TLD.TCCTRF=TLD.TLD.TLD.TLD.TLD.TLD.TLD.TLD.T = TLD.TLD.TLD.TLD.TLD.TLD.TLD.TLD.TLDC = TLD.T = TLD.TLD
//设置定时器周期
EPwm5Regs.TBCTL.bit.PHSEN = TB_DISABLE;//启用相位加载
EPwm5Regs.TBPHS.bit.TBPHS = 0x0000;//相位为0度
EPwm5Regs.TBCTL.bit.EPPCLKDIV = TB_DIV1;// TBIN.TBIV1 = TBIT.TBIN.TBIV1;//时钟与 TBIT.TBIT.TBIT.TB.TBIT.TBIT.TBIT.TBIT.TBIT.1+ TBIT.TBIT.TBIT.TBIT.TBIT.TBIT.TB.TBI


  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Lance:

    我很抱歉耽误你的答复。

    我认为这种行为是死区配置的结果。 当占空比足够小、死区时间大于导通时间时、脉冲将消失。 通过"EPWMxB 波形上的窄脉冲" 、您是否意味着 XB 输出具有较小的低脉冲但接近于满负荷? 如果是这种情况、那么这是预期的。 如果您意味着 XB 输出具有非常小的高脉冲、接近于0%占空比、而 XA 输出也接近0%占空比、则这是一个问题。 请您澄清一下吗?

    假设以上第一种情况、如果您不喜欢 XB 输出上的小低电平脉冲、则可以在导通时间小于死区时间时更改死区时间寄存器。 或者、您也可以使用 CMPB 通过动作限定符子模块单独生成 XB。 您可以使用 CMPC/D 生成中断。

    但愿这对您有所帮助。

    Hrishi  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Hrishi、您好!

    为了澄清这一点、我希望当 XA 上的占空比变为零时、XB 将变为100%、而不会出现小的低电平脉冲。 我想我可能需要自己手动管理死区时间。 为了使转换器正常运行、我需要能够将 XB PWM 模块上的占空比驱动至100%。 感谢您的建议。

    兰斯
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Hrishi、

    我使用 CMPB/CMPBHR 寄存器切换到直接控制死区、以控制开关波形、但我仍然在 EPWM1xA/XB 通道上看到同样的问题。  我仍然会看到这些10ns 至20ns 的运行宽栅极脉冲、占空比设置为零、并且仅在 EPWM1输出上。  EPWM2、3、4在零占空比时是恒定的。  

    这是我的更新代码。  我使用调试器来验证占空比是否设置为零。  因此、我很困惑、为什么我看到这些 ePWM 输出发生了任何事情。  

    #include "master_include.h"
    
    void Init_ePWM (void)
    {
    //
    ////设置 TBCLK
    //
    ////////注意:此处理器的 ePWM 模块具有60MHz 至100MHz 的时钟频率的内置硬件限制以实现完整功能。
    //要处理此问题,默认情况下,在寄存器 ClkCfgRegs.PERCLKDIVSEL.bit.EPWMCLKDIV
    EPwm1Regs.TBCTL.bit.CTRMODE 中启用主 CPU 时钟的整数/2;//向上计数
    -向下计数 EPwm1Regs.TBCTL.bit.CTRMODE = TB_COUNT_PRD;//向上计数-向下计数 EPwm1PRD = TBRAM1周期= TBEP_COUNT_PRD; //设置定时器周期
    EPwm1Regs.TBCTL.bit.PHSEN = TB_DISABLE;//禁用相位加载
    EPwm1Regs.TBCTL.bit.SYNCOSEL = TB_CTR_ZERO;//用作锁相 PWM
    的 SYNC 信号 EPwm1Regs.TBPHS.bit.TBPHS = 0x0000; //相位为0
    EPwm1Regs.TBCTR = 0x0000; //清除计数
    器 EPwm1Regs.TBCTL.bit.HSPCLKDIV = TB_DIV1;//时钟与 SYSCLKOUT
    EPwm1Regs.TBCTL.bit.CLKDIV = TB_DIV1;
    
    //
    设置影子寄存器加载为零
    // EPwm1Regs.TBCMDR.BIT.OCC.TL.BIT.AMPCM1Rd.TL.TL.RCMTL.TL.RCMTL.TL.TL.RCMTL.TL.RCMTL.TL.TL.RCMTL.TL.TL.TL.RCMTL.TL.TL.RCMTL.TL.TL.TL.TL.TL.RCMTL.TL.TL.TL.TL.TL.TL.RCMTL.TL.TL.RCMTL.TL.TL.TL.TL.TL.TL.TL.TBIT.RCMTL.TL.TL.TL.TL.TL.TL.TL.TBIT_RCMTL.T
    
    
    
    
    
    
    
    
    //设置比较 A 值
    EPwm1Regs.CMPB.bit.CMPB = 0; //设置比较 B 值
    EPwm1Regs.CMPD = ePWM_INTERRUPT_COUNT;//设置比较 C 值
    
    //
    设置操作
    //
    EPwm1Regs.AQCTLA.bit.CAU = AQ_CLEAR; //在零
    EPwm1Regs.AQCTLA.bit.CAD = AQ_SET 上设置 PWM1A;//在事件 A 上清除 PWM1A、
    //向上计数
    
    EPwm1Regs.AQCTLB.bit.CBU = AQ_SET; //在零
    EPwm1Regs.AQCTLB.bit.CBD = AQ_CLEAR 上设置 PWM1B; //在事件 B 上清除 PWM1B,
    //向上计数
    //
    //设置死区(假设非反相栅极驱动信号和 EPWMxA 都是延迟源)
    //
    ///* EPwm1Regs.DBCTL.bit.out_mode = DB_full_enable;
    EPwm1Regs.DBCTL.bit.POLSEL = DB_ACTV_HCR.DB100MHz
    
    ;= DBW1REF_DP.DCM.DP.DP.DCMT.DB100MHz;EPwREF_DP.DCMT.DBRP.DCMT.DCMT.N = 0x100MHz;EP100MHz
    //100MHz EPWMCLK => 10ns /计数、假设100ns 死区开始*/
    
    //
    中断、其中我们将更改比较值
    //
    EPwm1Regs.ETSEL.bit.INTSELCMP = 1; //选择备用比较源,即 CMPC/CMPD
    EPwm1Regs.ETSEL.bit.INTSEL = ET_CTRD_CMPB; //选择 CMPD 上的 INT 向下计数
    EPwm1Regs.ETSEL.bit.INTEN = 1; //启用 INT
    EPwm1Regs.ETPS.bit.INTPRD = et_1st; //生成第一个事件的 INT
    
    //
    配置 ADC SOCA 信号
    //
    EPwm1Regs.ETSEL.bit.SOCASEL = et_CTR_PRD;
    EPwm1Regs.ETSEL.bit.SOCAEN = 1;
    EPwm1Regs.ETPS.SOCAPReg= et_1st;
    
    //
    //////Eprm1.Epr.EHR1.t_HRCMOL.CLG.E1.CMOL.REG1.RP.HR=0;EP_TR.EHRM1RPM.CLG.HR.CLAD=0_RPM.EHR.CLM0_RPM.ENDR.HR.ENDR.ENDR.TR.ENDR.TR.TR.ENTR.TR.ENTR.ENTR.ENTR.ENTR.ENTR.ENTR.ENTR.TR.TR.ENTR.ENTR.TR.TR.TR.TR.TR.TR
    
    
    
    
    
    
    EPwm1Regs.HRCNFG.bit.EDGMODEB = HR_BEP;
    EPwm1Regs.HRCNFG.bit.CTLMODEB = HR_CMP;
    EPwm1Regs.HRCNFG.bit.HRLOADB = HR_CTR_ZERO;EPwm1Regs.HRCNFG.bit.HRPWCLADB
    = HRSM1REG1.THRSM1REG1.T1.THREST.THRCLP0;EPwCLP0.THREST.THRCMOSIT.THRESD0
    = HRSM1AUTO1;EPWCL
    EPwm1Regs.HRPCTL.bit.HRPE = 1;
    EDIS;
    
    //
    配置跳闸区域模块寄存器
    //
    /* EALLOW;
    EPwm1Regs.TZSEL.bit.OSHT1 = TZ_ENABLE;
    EPwm1Regs.TZCTL.bit.TZA = TZ_FORCE
    ;
    
    
    
    
    
    
    注意:TZ_TZLO/TSN = TZ1MHz / TLD.TZ.TLD.TLD.TOM 的完整频率限制;注意:TZ.TZ.TZ.TLD.TLD.TZ.TLD.TZ.TZ.TS/ TCLK = TZ.TLD.TLD.TLD.TLD.TLD.TZ.TZ.TLD.TLD.TLD.TZ.
    //要处理此问题,默认情况下,在寄存器 ClkCfgRegs.PERCLKDIVSEL.bit.EPWMCLKDIV
    EPwm2Regs.TBCTL.bit.CTRMODE 中启用主 CPU 时钟的整数/2;//向上计数 EPwm2Regs.TBCTL.bit.CTRMODE = TB_COUNT_PRD;//向上计数-
    向下计数 EPwm2PRD = TEPwm2Regs.ePeriod; //设置定时器周期
    EPwm2Regs.TBCTL.bit.PHSEN = TB_ENABLE;//启用相位加载
    EPwm2Regs.TBCTL.bit.SYNCOSEL = TB_SYNC_IN;//通过主
    EPwm2Regs.TBPHS.bit.TBPHS 的 SYNC 信号
    ;EPwM_PHASE.0000 = ePWM_PHASE_OFFSET = 0x90度;// //清除计数
    器 EPwm2Regs.TBCTL.bit.HSPCLKDIV = TB_DIV1;//时钟与 SYSCLKOUT
    EPwm2Regs.TBCTL.bit.CLKDIV = TB_DIV1;
    
    //
    设置影子寄存器加载为零
    // EPwm2Regs.TBCMDR.BIT.OCC.TL.TCMDR.TL.TL.RCMDR.TL.TL.RCMTL.TL.TL.RCMTL.TL.RCMTL.TL.TL.RCMTL.TL.TL.RCMTL.TL.TL.RCMTL.TL.RCMTL.TL.TL.RCMTL.TL.TL.TL.TL.TL.RCMTL.TL.TL.RCMTL.TL.TL.TL.TL.TL.TL.TL.TL.RCMTL.TL.TL.TL.TL.TL.TL.TL.TL.TBIT_RCMTL.TL.TL.TL.T
    
    
    
    
    
    
    
    
    //设置比较 A 值
    EPwm2Regs.CMPB.bit.CMPB = 0; //设置比较 B 值
    EPwm2Regs.CMPD = ePWM_INTERRUPT_COUNT;
    //
    设置操作
    //
    EPwm2Regs.AQCTLA.bit.CAU = AQ_CLEAR; //在零
    EPwm2Regs.AQCTLA.bit.CAD = AQ_SET 上设置 PWM1A; //在事件 A 上清除 PWM1A、
    //向上计数
    
    EPwm2Regs.AQCTLB.bit.CBU = AQ_SET; //在零
    EPwm2Regs.AQCTLB.bit.CBD = AQ_CLEAR 上设置 PWM1B; //在事件 B 上清除 PWM1B,
    //向上计数
    //
    //设置死区(假设非反相栅极驱动信号和 EPWMxA 都是延迟源)
    //
    ///* EPwm2Regs.DBCTL.bit.out_mode = DB_full_enable;
    EPwm2Regs.DBCTL.bit.POLSEL = DB_ACTV_HCR.DB00n
    
    = 0xDBW2RM0.DBRd.DBRd.Db= 0X100MHz;EPw24.DBRREF_DBRd.DBRd.Db = 0X100MHz;EPwREF_DBRd.DBRd.Db = 0.DBRd.Db = 0X100M0d.DBRd.DBRd.Db
    = 0.Db.Db = 0.Db.Db.Db.Db.Db.Db.DCM.Db//100MHz EPWMCLK =>10ns /计数、假设100ns 死区启动*/
    
    //
    中断、其中我们将更改比较值
    //
    EPwm2Regs.ETSEL.bit.INTSELCMP = 1;
    EPwm2Regs.ETSEL.bit.INTSEL = et_CTRD_CMPB; //选择 CMPD 上的 INT 向下计数
    EPwm2Regs.ETSEL.bit.INTEN = 1; //启用 INT
    EPwm2Regs.ETPS.bit.INTPRD = et_1st; //生成第一个事件的 INT
    
    //
    配置 ADC SOCA 信号
    //
    EPwm2Regs.ETSEL.bit.SOCASEL = et_CTR_PRD;
    EPwm2Regs.ETSEL.bit.SOCAEN = 1;
    EPwm2Regs.ETPS.SOCAPReg= et_1ST;
    
    ////////EPwmREP.HRFG.HRCM.ENDR.E=0XmHR_TR.ENDR.E0_TRFG.HR_TR.ENDR.ENDR.ENDR.E0=0_TR.ENTR.ENTR.ENTR.ENTR.EPM=0_HR_HR_TRFG.HR.ENTR.ENTR.ENTR.ENTR.ENTR.ENTR.ENTR.ENTR.ENTR.ENTR.ENTR.ENTR.ENTR.ENTR.ENTR.ENTR.ENTR.ENTR
    
    
    
    
    
    
    
    EPwm2Regs.HRCNFG.bit.EDGMODEB = HR_BEP;
    EPwm2Regs.HRCNFG.bit.CTLMODEB = HR_CMP;
    EPwm2Regs.HRCNFG.bit.HRLOADB = HR_CTR_ZERO;EPwm2Regs.CNFG.bit.HRCLADD
    
    = HRWCLUS.THR2REG1.THREST.THRCMON.TL.THRCMOSIT.T0;EPwCLP= HRCMON.TL.THRCLADB = HREST.THRCMON.T
    EPwm2Regs.HRPCTL.bit.HRPE = 1;
    EDIS;
    
    //
    配置跳闸区域模块寄存器
    //
    /* EALLOW;
    EPwm2Regs.TZSEL.bit.OSHT1 = TZ_ENABLE;
    EPwm2Regs.TZCTL.bit.TZA = TZ_FORCE
    
    
    
    
    
    
    ;注意:TZ_TZLO/TSN = TZ.TLD.TZL/ TLD.TZ.TLD.TOM 的完整频率限制;注意:TZ.TS/ TZ.TZ.TLD.TZ.TLD.TZ.TLD.TS/ TLD.TLD.TCLK = TZ.TZ.TLD.TS/ TLD.TLD.TLD.TLD.TLD.TCLK
    //要处理此问题,默认情况下,在寄存器 ClkCfgRegs.PERCLKDIVSEL.bit.EPWMCLKDIV
    EPwm3Regs.TBCTL.bit.CTRMODE 中启用主 CPU 时钟的整数/2;//向上计数 EPwm3Regs.TBCTL.bit.CTRMODE = TB_COUNT_PRD;//向上计数-
    向下计数 EPwm3PRD = TBRAM_PERIOD = TBEP_COUNTL.PRD; //设置定时器周期
    EPwm3Regs.TBCTL.bit.PHSEN = TB_ENABLE;//启用相位加载
    EPwm3Regs.TBCTL.bit.SYNCOSEL = TB_SYNC_IN;//通过主
    EPwm3Regs.TBPHS.bit.TBPHS = EPwPM_PHASE_INP= 0x180度;// EPwmRegs.TBR = 0x180度/偏移量
    //清除计数
    器 EPwm3Regs.TBCTL.bit.HSPCLKDIV = TB_DIV1;//时钟与 SYSCLKOUT
    EPwm3Regs.TBCTL.bit.CLKDIV = TB_DIV1;
    
    //
    设置影子寄存器加载为零
    // EPwm3Regs.TBCMDR.BIT.OCC.BIT.AMPCM0
    
    
    
    
    
    
    
    
    = 0;// EPmCOD.AMPCM0_ADDR.TL.TL.TL.RCMOCT.TL.TL.TL.TL.RCMOCT.TL.TL.TL.RCMTL.TL.TL.RCMTL.TL.TL.RCMTL.TL.TL.TL.RCMTL.TL.TL.TL.TL.RCMTL.TL.TL.RCMTL.TL.TL.TL.TL.RCMTL.TL.TL.RCMTL.TL.TL.TL.TL.TL.RCMTL.TL.TL.TL.TBIT. //设置比较 A 值
    EPwm3Regs.CMPB.bit.CMPB = 0; //设置比较 B 值
    EPwm3Regs.CMPD = ePWM_INTERRUPT_COUNT;
    
    //
    设置操作
    //
    EPwm3Regs.AQCTLA.bit.CAU = AQ_CLEAR; //在零
    EPwm3Regs.AQCTLA.bit.CAD = AQ_SET 上设置 PWM1A; //在事件 A 上清除 PWM1A、
    //向上计数
    
    EPwm3Regs.AQCTLB.bit.CBU = AQ_SET; //在零
    EPwm3Regs.AQCTLB.bit.CBD = AQ_CLEAR 上设置 PWM1B; //在事件 B 上清除 PWM1B,
    //向上计数
    //
    //设置死区(假设非反相栅极驱动信号和 EPWMxA 都是延迟源)
    //
    ///* EPwm3Regs.DBCTL.bit.out_mode = DB_full_enable;
    EPwm3Regs.DBCTL.bit.POLSEL = DB_ACTV_HCR.DB00n
    = 0xDBW3RED.DBRd.DBRd.Dn
    
    = 0x100MHz;EPwmREF_DB100d.DBRd.DP.DCM.DCM.D= 0.DCM.D.DCM.D= 0X100MHz;EP_DCM.DBRd.D.D.DCM.D.D.D= 0.DCM.D.D.DCM.D.D.D= 0X100MHz//100MHz EPWMCLK =>10ns /计数、假设100ns 死区启动*/
    
    
    //中断、其中我们将更改比较值
    //
    EPwm3Regs.ETSEL.bit.INTSELCMP = 1;
    EPwm3Regs.ETSEL.bit.INTSEL = et_CTRD_CMPB; //选择 CMPD 上的 INT 向下计数
    EPwm3Regs.ETSEL.bit.INTEN = 1; //启用 INT
    EPwm3Regs.ETPS.bit.INTPRD = et_1st; //生成第一个事件的 INT
    
    //
    配置 ADC SOCA 信号
    //
    EPwm3Regs.ETSEL.bit.SOCASEL = et_CTR_PRD;
    EPwm3Regs.ETSEL.bit.SOCAEN = 1;
    EPwm3Regs.ETPS.SOCAPReg= et_1ST;
    
    //////////EprmHR1.Cng.EHRLD.EDR.CLG.0=EP_HRCMOL.CLG.HRG.HRL.RP.EDR.ENDR.CLG.0=0_TR.ENDR.ENDR.TR_TR.EN.ENDR.TR_TRFG.HR=0_TR.ENTR.EN.ENTR.ENTR.ENTR.ENTR.ENTR.ENTR.ENTR.ENTR.ENTR.ENTR.ENTR.ENTR.ENTR.ENTR.ENTR.ENTR.EN.
    
    
    
    
    
    
    
    EPwm3Regs.HRCNFG.bit.EDGMODEB = HR_BEP;
    EPwm3Regs.HRCNFG.bit.CTLMODEB = HR_CMP;
    EPwm3Regs.HRCNFG.bit.HRLOADB = HR_CTR_ZERO;
    EPwm3Regs.CNFG.bit.HRCMODIE
    = HRCNTL.THRCLA.T0;EPw3REG1.THRSM.THRCLADB = HRSM.THREST.THRSM0;EPwCLADR = HRSM1.THRSM1.THR
    EPwm3Regs.HRPCTL.bit.HRPE = 1;
    EDIS;
    
    //
    配置跳闸区域模块寄存器
    //
    /* EALLOW;
    EPwm3Regs.TZSEL.bit.OSHT1 = TZ_ENABLE;
    EPwm3Regs.TZCTL.bit.TZA = TZ_FORCE
    ;
    
    
    
    
    
    注意:TZ_TLD.TS/ TLD.TSN = TZL/ TLD.TZ.TLD.TOM 的完整频率限制;注意:TZ.TZ.TZ.TS/ TLD.TLD.TLD.TS/ TLD.TLD.TCLK = TZ.TS/ TLD.TLD.TLD.TS/ TLD.TLD.TLD.TLD.TLD.TLD.TCLK
    //要处理此问题,默认情况下在寄存器 ClkCfgRegs.PERCLKDIVSEL.bit.EPWMCLKDIV
    EPwm4Regs.TBCTL.bit.CTRMODE 中启用主 CPU 时钟的整数/2;//向上计数 EPwm4Regs.TBCTL.bit.CTRMODE = TB_COUNT_PRD;//向上计数-
    向下计数 EPwm4Regs.tbpw_period; //设置计时器周期
    EPwm4Regs.TBCTL.bit.PHSEN = TB_ENABLE;//启用相位加载
    EPwm4Regs.TBCTL.bit.PHSDIR = TB_UP;//倒数以实现270度相移
    EPwm4Regs.TBCTL.bit.SYNCOSEL = TB_UP;
    //注意:TB_TRS=360度相位同步;// EPwmPWM=Tb.TRS=360度;注意:TB_TRS=Tb.Tb.Tb.Tb.Tb.Tb.Tb.Tb.eRPMs = Tb.Tb.Tb.Tbp = Tb.Tb.Tbp = Tb.Tb.Tb.Tbp = Tb.
    //清除计数
    器 EPwm4Regs.TBCTL.bit.HSPCLKDIV = TB_DIV1;//时钟与 SYSCLKOUT
    EPwm4Regs.TBCTL.bit.CLKDIV = TB_DIV1;
    
    //
    设置影子寄存器加载为零
    // EPwm4Regs.TBCMDR.BIT.AM4CTL.BIT.AMPCRC.TL.BIT.AM4=
    
    
    
    0
    
    
    
    
    ;// EPmRCMDR.AM4CT.ADCMDR.TL.TL.TL.TL.TL.RCMTL.TL.TL.RCMTL.TL.TL.RCMTL.TL.RCMTL.TL.TL.RCMTL.TL.TL.TL.TL.TL.RCMTL.TL.TL.TL.TL.RCMTL.TL.TL.TL.TL.TL.TL.TL.TL.TL.RCMTL.TL.TL.TL.TL.RBIT.AM4TL.TL.TL.TL.TL. //设置比较 A 值
    EPwm4Regs.CMPB.bit.CMPB = 0; //设置比较 B 值
    EPwm4Regs.CMPD = ePWM_INTERRUPT_COUNT;
    
    //
    设置操作
    //
    EPwm4Regs.AQCTLA.bit.CAU = AQ_CLEAR; //在零
    EPwm4Regs.AQCTLA.bit.CAD = AQ_SET 上设置 PWM1A; //在事件 A 上清除 PWM1A、
    //向上计数
    
    EPwm4Regs.AQCTLB.bit.CBU = AQ_SET; //在零
    EPwm4Regs.AQCTLB.bit.CBD = AQ_CLEAR 上设置 PWM1B; //在事件 B 上清除 PWM1B,
    //向上计数
    //
    //设置死区(假设非反相栅极驱动信号和 EPWMxA 都是延迟源)
    //
    ///* EPwm4Regs.DBCTL.bit.out_mode = DB_full_enable;
    EPwm4Regs.DBCTL.bit.POLSEL = DB_ACTV_HCR.DB100MHz
    
    ;EPw4REF_DBRREF_ENAB.DBRREF_D= 0x100MHz;EPw40RM.DB40RM.DB40RM.DBRREF_REF_REF_REF_REF_REF_REF_ENAB.DB40RMEND.DBRMENDL.DBRES.DB40RMEND.DB40RMEND.DB40RM.DBRMEN.DBRM.DBRL.DBRES.DB40RMEND.DBRMEND.DB40.DBRES.DBRMEND.
    //100MHz EPWMCLK =>10ns /计数、假设100ns 死区启动*/
    
    
    //中断、其中我们将更改比较值
    //
    EPwm4Regs.ETSEL.bit.INTSELCMP = 1;
    EPwm4Regs.ETSEL.bit.INTSEL = et_CTRD_CMPB; //选择 CMPD 上的 INT 向下计数
    EPwm4Regs.ETSEL.bit.INTEN = 1; //启用 INT
    EPwm4Regs.ETPS.bit.INTPRD = et_1st; //生成第一个事件的 INT
    
    //
    配置 ADC SOCA 信号
    //
    EPwm4Regs.ETSEL.bit.SOCASEL = et_CTR_PRD;
    EPwm4Regs.ETSEL.bit.SOCAEN = 1;
    EPwm4Regs.ETPS.SOCAPReg= et_1ST;
    
    //////////EprmHR1.Cng.EHR40Rfg.Epr.Epr.HRCMOLD.HR=0_HR.ENDR.EN.E4RPM=0_HR_TRFG.HR_TRFG.HR.ENDR.ENDR.ENDR.ENDR.TR.TR.TR.TR.EN.ENTR.EN.ENTR.ENTR.ENTR.ENTR.ENTR.ENTR.ENTR.ENTR.ENTR.ENTR.ENTR.ENTR.TR.ENTR.ENTR.EN
    
    
    
    
    
    
    
    EPwm4Regs.HRCNFG.bit.EDGMODEB = HR_BEP;
    EPwm4Regs.HRCNFG.bit.CTLMODEB = HR_CMP;
    EPwm4Regs.HRCNFG.bit.HRLOADB = HR_CTR_ZERO;EPwm4Regs.CNFG.bit.HRPWCLADB
    
    = HR4CLADC.THRSM1.THRSMCLORT.T1.TL.THRCMOSIT.T0;EPwCLADD = HRSM1.THRSMRP.THR4CLP0;EPwCLADC.
    EPwm4Regs.HRPCTL.bit.HRPE = 1;
    EDIS;
    
    //
    配置跳闸区域模块寄存器
    //
    * EALLOW;
    EPwm4Regs.TZSEL.bit.OSHT1 = TZ_ENABLE;
    EPwm4Regs.TZCTL.bit.TCLA = TZ_FORCE.TLDC.TBR1.TLD.TLDC
    
    
    
    
    = TZ_TLD.TBR1.TLD_TLD.TLD.TLD.TLDC
    = TLD.TLD.TLD.TCCTRF=TLD.TLD.TLD.TLD.TLD.TLD.TLD.TLD.T = TLD.TLD.TLD.TLD.TLD.TLD.TLD.TLD.TLDC = TLD.T = TLD.TLD
    //设置定时器周期
    EPwm5Regs.TBCTL.bit.PHSEN = TB_DISABLE;//启用相位加载
    EPwm5Regs.TBPHS.bit.TBPHS = 0x0000;//相位为0度
    EPwm5Regs.TBCTL.bit.EPPCLKDIV = TB_DIV1;// TBIN.TBIV1 = TBIT.TBIN.TBIV1;//时钟与 TBIT.TBIT.TBIT.TB.TBIT.TBIT.TBIT.TBIT.TBIT.1+ TBIT.TBIT.TBIT.TBIT.TBIT.TBIT.TB.TBI
    
    
    

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    这是波形的示波器捕获。  我正在使用混合信号示波器、并使用数字输入同时查看所有 PWM 信号。  模拟 PWM 信号基本相同、只是纹波/噪声。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Lance:

    当您看到这些脉冲时、CMPA 和 CMPB 寄存器的值是多少? 我想知道这些寄存器的值在启用 HRPWM 时是否违反占空比限制、即这些值不能< 3或>(PRD-3)。

    此外、您现在已经完全禁用了死区模块、对吧?

    谢谢。

    Hrishi

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    此外、HRLOAD 应该被设定为 ZRO 和 PRD。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Hrishi、

    我强制 CMPA 和 CMPB 寄存器为零。  根据我的 EPWM 配置、我希望 EPWM1A 始终为低电平、而 EPWM1B 始终为高电平。  我知道 HRPWM 不能在3个 PWMCLK 计数以下工作、但我不需要 HRPWM 工作、我只需要能够将占空比驱动至理想的零。  下面是我用于通过 CLA 中运行的例程更新寄存器的代码。  ON_OFF_READ 宏始终为 false 并强制占空比为零。  因此、我知道所有 CMPA/B 和 CMPA/BHR 始终设置为零。  我还在调试器中对此进行了验证。  死区模块也被禁用。

    if (ON_OFF_READ = false){//如果关闭、将占空比设置为零
    duty1 = MIN_DUTY 周期_sat;
    }
    //计算执行占空比
    PWM_ROES_CNTS1 =(int)(ePWM_COUNT_PERIOD duty1);
    //设置执行100ns 死区 PWM 的计数
    
    = PWM_ROEST_CNTS1 =(INPWM_PWM_TRIE_PWM_0);//设置计数= CNTS_PWM_PWM_PWM_TRIE_PWM_0 = CNTS_PWM_TRIES =+PWM_PWM_PWM_PWM_TRIES = 0
    PWM_ROEST_CNTS_DB1 = 0;//在零占空比时设置补数通道以匹配也
    }
    //计算 HRPWM 数(使用分数内在函数来保存时钟周期)
    PWM_F精细_CNTS1 =((int)((((PWM_CLK_TIME/HRPWM_CLK_TIME)*(_mfract1)+CMp1.mspnp1.mspmr_r1mspmspmspmspmspmspmspms = 0.1rmspmspmspmspmspmspmspmspmspmspmspmspmspmspmspmspmspmspmspmspmspmspmspmspms =
    1;r.r_r_r_r_r1p1.mspmspmspmspmspmspmspmspmspmspmspmspmspmspmspmspmspmspmspmspmspmspmspmspmspmspmspms =
    
    
    
    

    兰斯

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    将 CMPA/CMPB 设置为0时、还应将 CMPAHR 和 CMPBHR 设置为0。 此外、HRLOAD 应该被设定为 ZRO 和 PRD。

    但愿这对您有所帮助。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我将 HRLOAD 更改为 ZRO 和 PRD、它没有做任何改变来改变错误的脉冲
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我已经在使用 CMPA/CMPB 和 CMPA/BHR 寄存器执行此操作、我对 HRLOAD 进行了更改、但它没有解决我在 EPWM1输出上看到的问题。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    这是否与 CMPA/B 计数器达到零并且模块尝试满足 AQCTLA/B 寄存器条件这一事实有关?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Lance、

    这种行为很奇怪。 我们已将其简化为非常直接的配置、当 CMPx:CMPxHR 为0时、我不会期望输出任何脉冲。

    我认为您必须已经检查过、但请确保死区已完全禁用。 此外、请确保其他 AQ 设置设置为"无关"。

    如果上述内容看起来正常、接下来要查看的内容是 TZ 寄存器。 确保所有 TZCTL 操作都设置为"无任何操作"、这不是默认设置。

    Hrishi

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Hrishi、

    死区模块被完全禁用、其他 AQ 寄存器被设置为'o Nothing"。 我还添加了代码、将所有 TZCTL 寄存器设置为"不执行任何操作"。 即使在对代码进行这些修改并重新编译之后,我仍然会在 EPWM1A/B 输出上获得10ns 的毛刺脉冲。

    我不确定是否重要、但我使用的是 F28377S 处理器的器件支持库的 V200。 我将使用 CCS7.1.0和16.9.3.LTS 编译器来构建代码。 我测试过的代码从 RAM 执行、并且我没有启用优化。 我可以继续使用更新版本的支持库、如果存在已知问题、甚至可以使用新的编译器版本。

    兰斯
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Lance、

    您是否在多个器件中看到过这种情况? 如果您禁用 HRPWM、行为会改善吗?  

    谢谢。

    Hrishi

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Hrishi、

    我在其他几个处理器上测试了这一点、我看到了同样的行为。 如果我禁用 HRPWM、问题就会消失、但我确实需要使用 HRPWM。 是否有关于如何解决此问题的任何建议?

    兰斯
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Lance、

    好的、那很好。 当您进入 CMPA/B 值为0的模式时、除了使 CMPAHR 和 CMPBHR 0为0外、还应确保 TBPRDHR 为0。 如果这样做、即使在启用 HRPWM 时、这些脉冲也应该消失。 然后、当 CMP 值从0跳到3时、您可以再次开始使用 HRPWM。

    请告诉我这是怎么发生的。

    Hrishi

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Hrishi、

    EPWM1的 TBPRDHR 寄存器已经设置为0、即使添加了强制寄存器设置为0的代码、问题仍然存在。

    兰斯
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我唯一能想到的是当你进入这个模式时禁用 HRPE、然后当你退出这个模式时重新启用它。 BTW 进入此模式(CMP = 0)时、您是否在每个周期或仅在第一个周期看到此干扰?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Hrishi、

    它在每个 ePWM 周期发生。  就我正在运行的控制环路而言、我已经处于没有大量时钟周期可供使用的状态、因此希望我能够在适当时启用/禁用 HRPE 位、并且仍然按所需的 ISR 时序。  

    兰斯

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    以进行更新。 我将 HRPE 寄存器设置为禁用 HRPWM、这样就修复了问题中的毛刺脉冲。 感谢 Hrishi 的所有帮助

    兰斯
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Lance:

    很棒! 感谢您的更新!

    Hrishi