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:双边沿高分辨率占空比控制

Guru**** 2463330 points
Other Parts Discussed in Thread: TMS320F28075

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/610440/tms320f28377s-dual-edge-high-resolution-duty-cycle-control

器件型号:TMS320F28377S
主题中讨论的其他器件:TMS320F28075

大家好、

我正在尝试使用28377S 微控制器中的 HRPWM 功能来实现占空比控制。  我需要使用向上/向下计数模式、作为我在交错降压转换器中使用的平均电流模式控制方案的一部分。  遗憾的是、我无法使高分辨率边沿控制在上升沿和下降沿工作。  我在2-3个月前发现了另一组帖子(CCS/TMS320F28075:HRPWM 双边沿占空比模式)、但我无法从这些帖子中找到有用的结论。  我有一个非常相似的 HRPWM 配置功能、但是我看到 HRPWM 功能不起作用、除非我将边沿模式设置为上升或下降、而不是两者兼有。  如果有人能就这种情况的发生提供任何想法、请告诉我。  我需要高分辨率控制、因此、如果能获得任何帮助、我将不胜感激。

兰斯

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

    如果您已将 HRPWM 正确配置为双边沿控制、 然后、当您更改 CMPAHR 值时、您应该会看到延迟应用于通道 B 的两个边沿。当您更改 CMPBHR 时、您会看到延迟应用于通道 B 的两个边沿。命名令人困惑、 但是、正如您可能在另一个线程中看到的、CMPAHR 仅影响通道 A 的两个边沿、而 CMPBHR 仅影响通道 B 的两个边沿。 这可能是你的问题,也可能不是你的问题,但这是过去的一个常见的混乱根源,因此想提出这一点。

    您能否提供以下信息:
    a) HRPWM 配置代码
    b) CMPBHR 中的延迟值以及示波器中适用的通道 A 和/或通道 B 的波形

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

    您好、Kris、

    我正在努力获取示波器捕获、我将在今天晚些时候发布它们。  现在、我可以发布 ePWM/HRPWM 模块的配置代码。

    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.CMPA.bit.CMPAHR =(1 << 8);
    EPwm1Regs.CMPB.BIT.CMPB = 0; //设置比较 B 值
    EPwm1Regs.CMPB.bit.CMPBHR =(1 << 8);
    EPwm1Regs.CMPC = ePWM_ADC_SOC_COUNT; //设置比较 C 值
    EPwm1Regs.CMPD = ePWM_INTERRUPT_COUNT;//设置比较 D 值
    
    //
    设置操作
    //
    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 是两种延迟的源)
    //目前以编程方式创建死区。 可能需要使用外部死区电路来"窃取"脉冲宽度
    //这将允许 PWM 模块保持在(3、周期-3)窗口中有效的零脉冲宽度
    //
    ///* EPwm1Regs.DBCTL.bit.out_mode = DB_full_enable;
    EPwm1Regs.DBCTL.bit.SEL = 0xDBWCTL.DB_REF_REF_MODE=0xDBw_DBW1RET.DB_REF_REF_REF_REF_ENABLE.DB_REF_REF_REF_DB_MODE.DBW1REF_REF_REF_REF_REF_REF_ENSE
    
    = 0xDBWTR_DB_DBWTRL.DB_REF_BIT.DB_DB//100MHz EPWMCLK => 10ns /计数、假设100ns 死区以启动
    EPwm1Regs.DBFED.bit.DBFED = 0x00A;//100MHz EPWMCLK => 10ns /计数、假设100ns 死区以启动*////
    
    
    中断、其中我们将更改比较值
    // EPWMCLK
    =>10ns;EPwINT1RCMP.SELSEL =/EPwINT1MP.SELPMx.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.SOCASELCMP = 1; //使用 CMPC 作为 ADC SOCA 源
    EPwm1Regs.ETSEL.bit.SOCASEL = ET_CTRL_CMPA;//在 CMPC 上发送的 ADC SOCA 递增边沿
    EPwm1Regs.ETSEL.bit.SOCAEN = 1;
    EPwm1RG.SOCAPRD = et_HRESP.E1.THRES.TRFG.1R0/ TRFG.HRES.TRFG.HRES.TRFG.TR.EN.TRFG.1R1R1R_TR_TRFG.HRES.ENTR_TR_TREM.EN.TRFG.HRES.ENTRFG.TRFG.TR_TREM.EN.ENTRFG.1R1R1./TR_TRFG.HRES.ENTR_TREM.ENTRFG.HR.ENTRFG.TR_TREM.ENTR_TR_TREM.TR_TREM.TREM.TRFG.HR.
    
    
    
    
    
    
    
    
    
    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;
    CpuSysRegs.PCLKCR0.bit.TBCLKSYNC = 1;
    EPwm1Regs.TBCTL.bit.SWFSYNC = 1;
    EDIS;
    
    //
    配置跳匣区域模块寄存
    器//
    EALLOW;EPwm1Regs.TBCLL.BIT.TRFSYNC= 1;EPI_TRL =
    0xW1TRFL.TCLT.TRFL.REP.TRFL.TRFL.TRFL.TRFL.TRFL.TRFL.TRFL.TRFL.TRFL.COL = 1
    ;= 1
    ;#TRFL.TRFL.TRFL.TRFL. //启用逐周期触发区功能
    EPwm1Regs.TZCLR.bit.CBCPULSE = 0; //在零计数时清除逐周期跳闸,除非信号持续存在。
    EPwm1Regs.TZCTL.bit.TZA = TZ_FORCE_LO;
    EPwm1Regs.TZCTL.BIT.ZB = TZ_FORCE_LO;
    #endif
    EDZB;
    IF (dipswitch_1_Read = true){
    EALLOW;EPwm1Regs.TZSEL.TZL
    
    = TLD.TZ.TLD.TLD.TLD.TLD.TLD.TLD.TLD.TLD.TLD.TZ.TLD.TLD.TLD.TLD.TLD.TLD.TLD.TLD.TLD.TLD.TZ.TLD.TLD.TLD.TLD.TLD.TLD.TLD.TLD.TLD.T
    
    
    
    
    //
    ////设置 TBCLK
    //
    ///注:此处理器的 ePWM 模块有一个针对60MHz 到100MHz 时钟频率的内置硬件限制以实现全功能。
    //要处理此问题,默认情况下,在寄存器 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.CMPA.bit.CMPAHR =(1 << 8);
    EPwm2Regs.CMPB.BIT.CMPB = 0; //设置比较 B 值
    EPwm2Regs.CMPB.bit.CMPBHR =(1 << 8);
    EPwm2Regs.CMPC = ePWM_ADC_SOC_COUNT; //设置比较 C 值
    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.SOCASELCMP = 1; //使用 CMPC 作为 ADC SOCA 源
    EPwm2Regs.ETSEL.bit.SOCASEL = ET_CTRL_CMPA;//在 CMPC 上发送的 ADC SOCA 递增边沿
    EPwm2Regs.ETSEL.bit.SOCAEN = 1;
    EPwm2RP.SOCAPRD = et_HRESP.EFR.ENDRL.SECTOR.TRFG.HRES.ENTR_TRFG.0/ EP_TRM2RPM.TRFG.HRES.TRFG.HR_TRFG.HRES.EN.TRFG.HR_TRFG.HRES.ENTR_TRFG.HR_TREM.ENTRFG.HR.ENTRFG.HR_TREM.EN.ENTR_TREM.ENTREM_TRFG.TRFG.TREM_TREM_TREM_TRFG.TREM.EN.ENTREM_TREM.ENTREM_TREM.TREM.TR
    
    
    
    
    
    
    
    
    
    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;
    CpuSysRegs.PCLKCR0.bit.TBCLKSYNC = 1;
    EPwm2Regs.TBCTL.bit.SWFSYNC = 1;
    EDIS;
    
    //
    配置跳闸区域模块寄存
    器//
    EALLOW;EPwm2Regs.tc1.tq1.tcl =
    1;EPI_r.tc1.tq1.tq1.tcl
    
    = 0xtc1.tq1.tq1.tq1.tq1.tq1.tq1.rf_r.r.r.rf_r.r.rf_r.tq1.t1s = 1; //启用逐周期触发区功能
    EPwm2Regs.TZCLR.bit.CBCPULSE = 0; //在零计数时清除逐周期跳闸,除非信号持续存在。
    EPwm2Regs.TZCTL.bit.TZA = TZ_FORCE_LO;
    EPwm2Regs.TZCTL.bit.TSB = TZ_FORCE_LO;
    #endif
    EDZB;
    IF (dipswitch_2_Read = true){
    EALLOW;EPwm2Regs.TZSEL.TZ
    
    = TLD.TLD.TZ.TLD.TLD.TLD.TLD.TLD.TLD.TLD.TLD.TZ.TLD.TLD.TLD.TLD.TLD.TZ.TLD.TLD.TLD.TLD.TLD.TLD.TLD.TLD.TLD.TLD.TLD.TLD.TLD.TLD.T
    
    
    
    
    //
    ////设置 TBCLK
    //
    ///注:此处理器的 ePWM 模块有一个针对60MHz 到100MHz 时钟频率的内置硬件限制以实现全功能。
    //要处理此问题,默认情况下,在寄存器 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.CMPA.bit.CMPAHR =(1 << 8);
    EPwm3Regs.CMPB.BIT.CMPB = 0; //设置比较 B 值
    EPwm3Regs.CMPB.bit.CMPBHR =(1 << 8);
    EPwm3Regs.CMPC = ePWM_ADC_SOC_COUNT; //设置比较 C 值
    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.SOCASELCMP = 1; //使用 CMPC 作为 ADC SOCA 源
    EPwm3Regs.ETSEL.bit.SOCASEL = ET_CTRL_CMPA;//在 CMPC 上发送的 ADC SOCA 递增边沿
    EPwm3Regs.ETSEL.bit.SOCAEN = 1;
    EPwm3RG.TRS.SOCAPRD = et_HRES.TRFG.HRES.ENDR.TRFG.0/ EP_TRFG.HRES.TRFG.HRCMOL.SECTOR.ENDR.EN.TRFG.HRES.EN.TRFG.HR_TRFG.HR_TRFG.TRFG.TREM.EN.EN.ENTRFG.TR_TREM.EN.EN.ENTRFG.TR_TREM_TREM_TREM_TREM_TRFG.HRES.ENTREM_TRFG.TREM.EN.EN.EN.TREM_TR_TREM_TREM.EN.TREM.TR
    
    
    
    
    
    
    
    
    
    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;
    CpuSysRegs.PCLKCR0.bit.TBCLKSYNC = 1;
    EPwm3Regs.TBCTL.bit.SWFSYNC = 1;
    EDIS;
    
    //
    配置跳匣区域模块寄存
    器//
    EALLOW;EPwm3Regs.TBCLL.BIT.TRFSYNC= 1;EDIS
    
    
    = 0xWTRF_TRL = 0xTCLTRFF.REP.TRFF.REP.TRFF.TRFF.TRFF.TRFF.TRFF.TRFF.REP.CTRL = 1;=#TRFF.TRFF.TRFF.TRFF.TRFF.TRFF. //启用逐周期触发区功能
    EPwm3Regs.TZCLR.bit.CBCPULSE = 0; //在零计数时清除逐周期跳闸,除非信号持续存在。
    EPwm3Regs.TZCTL.bit.TZA = TZ_FORCE_LO;
    EPwm3Regs.TZCTL.bit.TSB = TZ_FORCE_LO;
    #endif
    EDZB;
    IF (dipswitch_3_Read = true){
    EALLOW;EPwm3Regs.TZSEL.TZ_TLD.TLD.TLD.TLD.TLD.TZ.TLD.TLD.TLD.TLD.TLD.TLD.TLD.TLD.TLD.TLD.TLD.TLD.TLD.TLD.TLD.TLD.TLD.TLD.TLD.TLD.TLD.TLD.TLD.TLD.TLD.TLD.T
    
    
    
    
    
    
    //
    ////设置 TBCLK
    //
    ///注:此处理器的 ePWM 模块有一个针对60MHz 到100MHz 时钟频率的内置硬件限制以实现全功能。
    //要处理此问题,默认情况下在寄存器 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.CMPA.bit.CMPAHR =(1 << 8);
    EPwm4Regs.CMPB.BIT.CMPB = 0; //设置比较 B 值
    EPwm4Regs.CMPB.bit.CMPBHR =(1 << 8);
    EPwm4Regs.CMPC = ePWM_ADC_SOC_COUNT; //设置比较 C 值
    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.SOCASELCMP = 1; //使用 CMPC 作为 ADC SOCA 源
    EPwm4Regs.ETSEL.bit.SOCASEL = ET_CTRL_CMPA;//在 CMPC 上发送的 ADC SOCA 递增边沿
    EPwm4Regs.ETSEL.bit.SOCAEN = 1;
    EPwm4RG.TRS.SOCAPRD = et_HRES.TRFG.HRM0_TRFG.HRES.ENDR.TRFG.HR_TRFG.HRES.TRFG.TRFG.HR_TRFG.HRES.ENTRFG.HR_TRFG.TREM_TREM_TREM.EN.ENTRFG.HR_TRFG.TREM_TRFG.TREM_TREM_TREM_TREM.TREM_TREM.ENTRFG.HRES.TREM_TRFG.TREM_TREM_TREM.TREM_TREM.TREM.TRFG.HRES.TREM_TREM.TR
    
    
    
    
    
    
    
    
    
    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;
    CpuSysRegs.PCLKCR0.bit.TBCLKSYNC = 1;
    EPwm4Regs.TBCTL.bit.SWFSYNC = 1;
    EDIS;
    
    //
    配置跳匣区域模块寄存
    器//
    EALLOW;EPwm4Regs.TBCLL.BIT.TRFSYNC= 1;EPI_TRL =
    0xWTRFL.TCC1.TL.REP.TRFF.TRFF.TRFF.TRFF.REP.CTRL
    
    = 1;=#TRFF.TRFF.TRFF.TRFF.TRFF.TRFF.TRFF.TRFF.TRFF.TRFF. //启用逐周期触发区功能
    EPwm4Regs.TZCLR.bit.CBCPULSE = 0; //在零计数时清除逐周期跳闸,除非信号持续存在。
    EPwm4Regs.TZCTL.bit.TZA = TZ_FORCE_LO;
    EPwm4Regs.TZCTL.bit.TSB = TZ_FORCE_LO;
    #endif
    EDZB;
    IF (dipswitch_4_Read = true){
    EALLOW;EPwm4Regs.TZSEL.TZ_TLD.TLD.TLD.TLD.TLD.TLD.TZ.TLD.TLD.TLD.TLD.TLD.TLD.TLD.TIS.TLD.TRIS.TLD.TLD.TLD.TLD.TLD.TLD.TLD.TLD.TLD.TLD.TLD.TLD.TLD.TLD.TLD.T
    
    
    
    
    
    
    #if CLA_benchmark
    //设置 TBCLK 寄存器
    EPwm5Regs.TBCTL.bit.CTRMODE = TB_COUNT_UP;
    EPwm5Regs.TBPRD = 0xFFFF; //设置定时器周期
    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
    
    
    

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

    我更改了代码、将 HRPE 寄存器设置为零、这与我之前发布的代码不同。 我一直在努力捕获屏幕截图、但它们并不是很有用。 基本上、我看到的是大约10ns 的脉冲宽度跳跃、而不是任何远距离接近150ps 分辨率的东西。 看起来 HRPWM/MEP 根本不做任何事情。

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

    尊敬的 Lance:

    我将您的代码与我在您引用的另一个线程中发布的工作示例进行了比较(为了方便起见、再次附加在此处)。  代码之间的差异似乎是 AUTOCONVERT 和 HRPE 值。  以下是重要的细分市场:

          EALLOW;

          (* ePWM[j]).HRCNFG.ALL = 0x0;

          (* ePWM[j]).HRCNFG.bit.EDGMODE = HR_BEP; //下降沿上的 MEP 控制

          (* ePWM[j]).HRCNFG.bit.CTLMODE = HR_CMP;

          (* ePWM[j]).HRCNFG.bit.HRLOAD = HR_CTR_ZERO;

          (* ePWM[j]).HRCNFG.bit.EDGMODEB = HR_BEP;//下降边沿上的 MEP 控制

          (* ePWM[j]).HRCNFG.bit.CTLMODEB = HR_CMP;

          (* ePWM[j]).HRCNFG.bit.HRLOADB = HR_CTR_ZERO;

          #IF (AUTOCONVERT)

          (* ePWM[j]).HRCNFG.bit.AUTOCONV = 1;   //启用自动转换

                              //逻辑

         #endif

          (* ePWM[j]).HRPCTL.bit.HRPE = 0;//关闭高分辨率周期

                          //控制。

          (* ePWM[j]).cmpa.bit.cmpaHR = 0x3333;

          (* ePWM[j]).CMPB.bit.CMPBHR = 0x5555;

          EDIS;

    您能否尝试修改这些值、看看这是否会产生任何影响? 如果没有、我建议运行示例项目、并确保看到细微的边缘移动。

    此致、

    Krise2e.ti.com/.../2161.hrpwm_5F00_duty_5F00_sfo_5F00_v8_5F00_e2e.c

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

    我将尝试这样做。 我已经通过将 HRPE 寄存器设置为0的代码进行了修改。 似乎什么都没有。 我希望不使用 AUTOCONV 设置;我已经有了 ISR、假设阶跃为150ps、它会自动计算正确的 CMPAHR/CMPBHR 值。 我将告诉您使用 AUTOCONV 设置是否执行任何操作。

    此致、

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

    我无法使双边沿 HRPWM 控制工作。 我尝试使用固定的 CMPA/CMPB 设置扫描 HRPWM 值、并且使用双边沿控制、无论 CMPA/CMPB 寄存器中的设置或值是多少、占空比都不会改变。 我将 EPWMxA 切换到下降沿控制、将 EPWMxB 切换到上升沿控制。 这满足了我的需求、我验证了 HRPWM 功能是否正常工作。 感谢所有的帮助。

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

    很遗憾听到这些修改没有让您启动并使用双边缘控制运行。 我可以在下周将您的代码加载到器件上、看看我是否可以找到问题。

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

    尊敬的 Lance:

    好消息。 我已加载您的代码、它似乎正常工作。 我已经附加了 C 文件(抱歉、这是一个用于测试它的快速补丁)。  为了便于比较、我做了一些小调整、但这些调整可以在您的系统中恢复为原始调整。

    为了进行测试、示波器 PWM1A 和任何其他 PWM 在 PWM2-8上均为通道(我使用的是 EPWM6A)。 当您运行时、您应该会在信号的两个边沿上看到大约8ns 的边沿漂移。  

    验证是否存在边沿移位后、将 EPwm1Regs.CMPA.bit.CMPAHR 更改为0。 现在、您应该会看到 PWM1A 边沿移回与另一个 PWM 对齐。

    如果您有任何问题、请告诉我。 附加的代码。

    此致、

    Krise2e.ti.com/.../e2e_5F00_updown_5F00_hr.c