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.

[参考译文] TMS320F28379D:相移问题

Guru**** 2609895 points


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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/987350/tms320f28379d-problem-with-phase-shift

器件型号:TMS320F28379D

您好!

我想生成360/N°的 N PWM 偏移、以控制交错降压转换器。

我使用 PWM1作为基准(主器件)、并在 CTR = 0时生成 SYNCOUT 信号以馈送其他 PWM 模块(从器件)。

当放大从器件 PWM 的边沿时、我观察到20ns 的抖动、这似乎与 TRM 的第1967页说明相对应(+/-2时钟周期的抖动)。

如何在 HR 模式下同步 PWM 而不产生此抖动?

以下是我的初始化代码:

void PWM_configureModule (PWM_moduleConfiguration_s* conf)

volatile struct ePWM_regs * moduleRegs =&EPwm1Regs + conf->module;

PWM_CALIBRATE ();

EALLOW;

SyncSockRegs.SYNCSELECT.BIT.EPWM4SYNCIN = 0U;
SyncSockRegs.SYNCSELECT.BIT.EPWM7SYNCIN = 0U;
SyncSockRegs.SYNCSELECT.BIT.EPWM10SYNCIN = 0U;

//配置期间停止 PWM 同步
CpuSysRegs.PCLKCR0.bit.TBCLKSYNC = 0U;

moduleRegs->TBCTL.bit.PRDLD = 0U;//周期寄存器被影子化

*((volatile uint32_t*)(&moduleRegs->TBPRDHR)=(uint32_t)(64000.0F *(float32_t) sysctrl_getCpuFreqInMhz ()/ conf->频率)<< 8U;

if (conf->module =PWM_MODULE_1)

moduleRegs->TBCTL.bit.PHSEN = 0U;
moduleRegs->TBCTL.bit.SYNCOSEL = 1U;

其他

moduleRegs->TBCTL.bit.SYNCOSEL = 0U;

if (conf->enablePhaseSynchronization)

if (conf->PHASE < 180.0F)

moduleRegs->TBPHS.all =(uint32_t)(conf->PHASE /180.0F *(float32_t)(*(volatile uint32_t*)(&moduleRegs->TBPRDHR))));
moduleRegs->TBCTL.bit.PHSDIR = 0U;

其他

moduleRegs->TBPHS.all =(uint32_t)((360.0F - conf->PHASE)/180.0F *(float32_t)(*(volatile uint32_t*)(&moduleRegs->TBPRDHR))));
moduleRegs->TBCTL.bit.PHSDIR = 1U;

moduleRegs->TBCTL.bit.PHSEN = 1U;

其他

moduleRegs->TBCTL.bit.PHSEN = 0U;

moduleRegs->TBCTR = 0U;//重置时基计数器
moduleRegs->TBCTL.bit.CTRMODE = 2U;//向上向下计数模式
moduleRegs->TBCTL.bit.CLKDIV = 0U;
moduleRegs->TBCTL.bit.HSPCLKDIV = 0U;
moduleRegs->TBCTL.bit.free_soft = 2U;

if (conf->linkDutyCycle)

moduleRegs->EPWMXLINK.bit.CMPALINK = conf->linkedModule;
moduleRegs->EPWMXLINK。bit.CMPBLINK = conf->linkedModule;

其他

//启用死区半周期计时
//在死区上实现高分辨率
moduleRegs->DBCTL.bit.HALFCYCLE = 1U;
moduleRegs->DBCTL.bit.DEDB_MODE = 0U;
moduleRegs->DBCTL.bit.out_mode = 3U;//下降沿和上升沿死区
moduleRegs->DBCTL.bit.in_mode = 2U;// PWMA 是上升沿延迟的源,PWMB 是下降沿延迟的源
moduleRegs->DBCTL.bit.SHDWDBFEDMODE = 0U;//死区寄存器被影子化
moduleRegs->DBCTL.bit.SHDWDBREDMODE = 0U;
moduleRegs->DBCTL2.bit.LOADDBCTLMODE = 1U;

switch (conf->mode)(交换机(conf->mode)模式)

PWM_SINGLE_A 案例:
moduleRegs->DBCTL.bit.POLSEL = 0U;//同相 A
moduleRegs->AQCTLA.bit.CAU = 2U;
moduleRegs->AQCTLA.bit.CAD = 1U;
中断;
PWM_SINGLE_B 案例:
moduleRegs->DBCTL.bit.POLSEL = 0U;//同相 B
moduleRegs->AQCTLB.bit.CBU = 2U;
moduleRegs->AQCTLB.bit.CBD = 1U;
中断;
PWM_互补_AB 案例:
moduleRegs->DBCTL.bit.POLSEL = 2U;//非反相 A,反相 B 路径
moduleRegs->AQCTLA.bit.CAU = 2U;
moduleRegs->AQCTLA.bit.CAD = 1U;
moduleRegs->AQCTLB.bit.CBU = 2U;
moduleRegs->AQCTLB.bit.CBD = 1U;
中断;
PWM_互补_BA 案例:
moduleRegs->DBCTL.bit.POLSEL = 1U;//反转 A 路径,非反转 B
moduleRegs->AQCTLA.bit.CAU = 2U;
moduleRegs->AQCTLA.bit.CAD = 1U;
moduleRegs->AQCTLB.bit.CBU = 2U;
moduleRegs->AQCTLB.bit.CBD = 1U;
中断;

*((volatile uint32_t*)(&moduleRegs->DBREDHR.all)=(uint32_t)(conf->risingDeadband / 90.0F *(float32_t)(*(volatile uint32_t*)(&moduleRegs->TBPRDHR))))));
*((volatile uint32_t*)(&moduleRegs->DBFEDH.all)=(uint32_t)(conf->FallingDeadband / 90.0F *(float32_t)(*(volatile uint32_t*)(&moduleRegs->TBPRDHR)))));

moduleRegs->CMPCTL.bit.SHDWAMODE = 0U;// CMPA 寄存器被影子化
moduleRegs->CMPCTL.bit.SHDWBMODE = 0U;// CMPB 寄存器被影子化

moduleRegs->CMPCTL.bit.LOADAMODE = 2U;//加载 TBCTR 的 CMPA = PRD
moduleRegs->CMPCTL.bit.LOADBMODE = 2U;//加载 TBCTR 的 CMPB = PRD

/*使用 TZCTL2、TZCTLDCA 和 TZCTLDCB 中定义的跳闸操作*/
moduleRegs->TZCTL2.all = 0x8FFF;
moduleRegs->TZCTLDCA.all = 0xFFF;
moduleRegs->TZCTLDCA.all = 0xFFF;
moduleRegs->TZCTLDCB.all = 0xFFF;
moduleRegs->TZCTLDCB.all = 0xFFF;

/*数字比较子模块输入是跳闸输入的组合*/
moduleRegs->DCTRIPSEL.bit.DCAHCOMPSEL = 0xF;
moduleRegs->DCTRIPSEL.bit.DCALCOMPSEL = 0xF;
moduleRegs->DCTRIPSEL.bit.DCBHCOMPSEL = 0xF;
moduleRegs->DCTRIPSEL.bit.DCBLCOMPSEL = 0xF;

moduleRegs->TZDCSEL.bit.DCAEVT1 = 0x2U;
moduleRegs->TZDCSEL.bit.DCAEVT2 = 0x4U;
moduleRegs->TZDCSEL.bit.DCBEVT1 = 0x2U;
moduleRegs->TZDCSEL.bit.DCBEVT2 = 0x4U;

moduleRegs->TBCTL.bit.CTRMODE = 2U;//向上计数模式

if (pwm_module_ha_HR_capability (conf->module)&& conf->enableHighResolution)

moduleRegs->HRCNFG.all = 0x0000U;//清除寄存器

moduleRegs->HRCNFG.bit.CTLMODE = 0U;// TBPRDHR 寄存器控制边沿位置
//(即、这是占空比或周期控制模式)。
moduleRegs->HRCNFG.bit.CTLMODEB = 0U;//TBPRDHR (8)寄存器控制边沿位置
//(即、这是占空比或周期控制模式)。
moduleRegs->HRCNFG.bit.HRLOAD = 2U;//在 CTR = 0或 CTR = PRD 上加载 CMPAHR
moduleRegs->HRCNFG.bit.HRLOADB = 2U;//在 CTR = 0或 CTR = PRD 上加载 CMPBHR
moduleRegs->HRCNFG.bit.AUTOCONV = 1U;//自动转换打开
moduleRegs->HRCNFG.bit.EDGMODE = 3U;// MEP 控制两个边沿
moduleRegs->HRCNFG.bit.EDGMODEB = 3U;// MEP 控制两个边沿

moduleRegs->HRCNFG2.bit.EDGMODEDB= 3U;// MEP 控制两个边沿(DBREDHR 的上升沿或下降沿)
// DBFEDHR 边缘)
moduleRegs->HRCNFG2.bit.CTLMODEBFED = 1U;// CTR = 0或 CTR = PRD 上的负载
moduleRegs->HRCNFG2.bit.CTLMODEDBRED = 1U;// CTR = 0或 CTR = PRD 上的负载
moduleRegs->HRPCTL.bit.PWMSYNCSEL = 0U;
moduleRegs->HRPCTL.bit.TBPHSHRLOADE = 1U;
moduleRegs->HRPCTL.bit.HRPE = 1U;
moduleRegs->HRPWR.bit.CALPWRON = 1U;//启用 MEP 校准逻辑

CpuSysRegs.PCLKCR0.bit.TBCLKSYNC = 1U;

forceSynchronization (conf->module);
EDIS;

感谢您的支持、

Arthur

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

    尊敬的 Arthur:

    正如您提到的、TRM 中确实有以下注释: "注意:当启用高分辨率周期模式时、EPWMxSYNC 脉冲将引入+/- 1 - 2
    PWM 周期抖动(在向上计数模式下为+/- 1个周期、在向上向下计数模式下为+/- 2个周期)。 因此、TBCTL[SYNCOSEL]不应设置为1 (CTR = 0是 EPWMxSYNCO 源)或2 (CTR = CMPB 是 EPWMxSYNCO 源)。 否则、抖动将随同步脉冲在每个 PWM 周期发生。

    当 TBCTL[SYNCOSEL]= 0 (EPWMxSYNCI 是 EPWMxSYNCO 源)时、在高分辨率周期初始化期间、软件同步脉冲只应发出一次。 如果在 PWM 运行时应用软件同步脉冲、则同步脉冲时、PWM 输出上会出现抖动。"

    SYNCOSEL 不应设置为1或2、否则抖动将在每个 PWM 周期内发生。 消除抖动的唯一方法是将 SYNCOSEL 设置为0、并在初始化期间发出软件同步脉冲。

    此致、

    Marlyn

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

    您好、Marlyn、

    我已经尝试过这种方法、但 由于 SYNCOSEL = 0、模块之间失去了同步、因为在这种配置中没有同步 PWM 计数器的公共信号。  

    我花了很多时间尝试使具有高分辨率、死区和相位同步功能的 PWM 模块工作、但每次我解决问题时都会出现另一个问题。

    您能给我一个我想做什么的工作代码吗?

    谢谢、

    Arthur

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

    尊敬的 Arthur:

    您可以每隔几个周期(4-5)实施一次软件同步脉冲、但 我们建议您不要在每个 CTR=0实例中执行此操作。 当 EPWM1的时基计数器等于零时、我会设置一个中断、中断事件计数为4-5个事件。 在该中断的 ISR 内、您可以设置 软件同步脉冲。

    此致、

    Marlyn

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

    您好、Marlyn、

    此解决方案对我的应用不是很满意。 我需要在每个 PWM 上具有非常精确的占空比。

    然而、频率和相移分辨率在我的应用中并不是那么重要。

    我尝试将 TBPHSHRLOADE 和 HRPE 位设置为0来禁用周期和/或相位上的高分辨率、但是当我这么做时、我也失去了占空比上的高分辨率...

    HRPWM 很难配置、有很多参数、就像它用途广泛一样、但最终实际上允许的设置很少。

    是否可以根据我的要求发布初始化代码?

    感谢您的支持、

    Arthur

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

    亚瑟

    由于您的所有 ePWM 似乎都在同一个微控制器内、因此它们共享同一个时钟、因此您只需要在初始化期间执行同步。 之后、您可以禁用模块之间同步脉冲的传播。

    希望这有所帮助、

    皮埃尔

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

    尊敬的 Arthur:

    如果您对文档有任何建议、认为这些建议有助于澄清某些配置和设置、请告诉我、我们可以着手实施这些更改。  

    我们的 TRM 中定义了您遇到的行为。 我不会更改您的初始化代码、而是更改我已经讨论和建议的设置。

    此致、

    Marlyn

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

    正如 Pierre 所说的、如果您尝试解决方案、您就不会遇到问题。 无需外部同步、只需同步一次即可开始。 如果您需要更改相位、对值进行初始化、同步一次、则可以继续。

    NIMA

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

    谢谢 Pierre、

    您的解决方案似乎可以解决问题!

    此致、

    Arthur