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