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:在100MHz PWM 模块时钟下运行时、ePWM 毛刺脉冲

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/594829/tms320f28377s-epwm-glitches-while-operating-with-100mhz-pwm-module-clock

器件型号:TMS320F28377S

大家好、

我正在为四相交错降压转换器开发代码。  我使用 F28377S 微控制器来实现 PWM 级以及内部平均电流控制环路。  我在 LaunchXL 套件上进行了一些初步调试、我注意到我仅以100MHz 时钟速度运行微控制器、而 ePWM 外设仅获得50MHz 时钟。  我计划使用 HRPWM 功能、根据数据表、我意识到它可能没有任何作用、因为 PWM 模块的输入时钟超出了60-100MHz 的范围。  现在、我更改了 PLL 设置以获得合适的时钟速度、我在 PWM 通道上看到了干扰。  我得到了我预期的占空比、但也得到了上斜升中 PRD 点的15ns 宽脉冲。  我只需要占空比控制、因此我可以转到一个向上计数方案、我希望使用向上向下计数方法作为设置 ADC 采集以获取平均电流的简单方法。 任何有关导致干扰的因素的想法都是有用的。  下面是我要使用的 EPWM 配置代码。  

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.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_CTR_zero; //选择零事件
EPwm1Regs.ETSEL.bit.INTEN 上的 INT = 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_1RPRD;

//
////Epr_HR1.t.Eprg.HRCMOG.1R1.R1.R1.RLDC = 0xWHR_TRFG.HR0.TRFG.HR_TR.PHM1RIGN;EP_HR.CLM1RP.HR.CLAD.EN.E1.THR.TR.EN.CLM1RPM.E1.THR=0_RPM_RPM_RPM_RPM_RPM_RPM_RPM_RPM.EN.HR.EN.EN.HR.CLAD.CLAD.EN.EN.RES.






//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 = 0; //设置比较 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_CTR_zero; //选择零事件
EPwm2Regs.ETSEL.bit.INTEN 上的 INT = 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.HRCMT.PRD
= 0xW2RP.HR_HRCMOS.CLD.CLG.HRG.0_TRD.CLAD.HRES.TR.EN.TR_TR.EN.TRFG.HR.PHM0_TR.ENDR.PHM0_TR.TR.EN.TRFG.HR_TRFG.HR_TR.EN.EN.EN.ENTR.TR_TRFG.HR_TRFG.HR.ENTR_TR.ENTRFG.HR_TR.ENTR.ENTR.TR.EN.EN.






//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 = 0; //设置比较 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_CTR_zero; //选择零事件
EPwm3Regs.ETSEL.bit.INTEN 上的 INT = 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;

/////////EPwmREP.HRFG.HRCMT.PRD
= 0xW3RP.HR_TRN.HRCMT.FG.HRCMOS.CLD.CLAD.ENDR.PH.CLAD=0;EP_TR.HR_TRP.HRM0_TRP.HRM0_TRP.HRCMT.EN.CLG.HR_TRD.CLAD.ENDR.EN.EN.EN.TR.EN.TR.EN.TR.TR.EN.TR.EN.TR.EN.TR.EN.TR.TR.EN.TR.EN.TR.TR.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.SYNCOSEL = TBM_SYNC_IN;//通过主
EPwm4Regs.TBPHS.bit.TBPHS 的 SYNC 信号
;EPwM_PHASE_INP.TBR = 0x270度;EPw0_TBR = 3;/ EPwmP.TBR = 3 degure_offset //清除计数
器 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.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_CTR_zero; //选择零事件
EPwm4Regs.ETSEL.bit.INTEN 上的 INT = 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;

//////////Eprm4Rf.Epr.EHR_HRCMOL.RG.REG.TR.EN.HR=0XmHR_TR.EDR.TRFG.HR_TRFG.HR_TR.ENDR.ENDR.EN.TR.TR.TRFG.HR=0_TRFG.HR_TRFG.HR_TRFG.HR_TRFG.HR_TR.ENDR.ENTR.EN.ENTR.EN.ENTR.ENTR_TR.ENTR_TR.EN.ENTR.ENTR.ENTR.ENTR.TR







//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.TBIT.TBIT.TBIV1/ TBIT.TBIT.TBIT.TBIT.TBIT.TBIT.TBIT.TBIT.F/位为0

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

    我写信告诉您、C2000团队的某个人已被分配到您的职位、应该很快回答。

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

    我实际上做了一些工作和实验、我解决了这个问题。 它实际上与 HRPWM 配置有关。 我将 HRLOAD 寄存器设置为在零和周期计数器上工作、而不是仅在零计数上工作。 通过进行该更改、我消除了我在 PWM 波形上看到的干扰。

    兰斯