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.

[参考译文] TMS320F28027:高分辨率相移 PWM 运行

Guru**** 2601915 points
Other Parts Discussed in Thread: C2000WARE

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/677071/tms320f28027-high-resolution-phase-shift-pwm-operation

器件型号:TMS320F28027
主题中讨论的其他器件:C2000WARE

您好!

在°500kHz 的 PWM 运行情况下、我可以在同步链中的两个 PWM 信号之间实现的最佳相移粒度为3 μ V (SYSCLKOUT=60MHz)。 对于我的应用、我需要更好的相移粒度、但在使相移操作与高分辨率 PWM 配合使用时遇到了困难。

下面显示了我的相关代码。 有人能帮我实现 HRPWM 相移和/或向我解释为什么该代码不起作用吗?

EALLOW;
SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC=0;
EDIS;

//配置 ePWM1

uint16周期= 120; // 60MHz/120 = 500kHz

EPwm1Regs.TBPRD =周期-1; // PWM 频率= 1/周期
EPwm1Regs.CMPA.half.CMPA =周期/2; //初始设置占空比50%
EPwm1Regs.CMPA.half.CMPAHR =(0 << 8); //初始化 HRPWM 扩展
EPwm1Regs.TBPHS.Half.TBPHS = 0; //将粗相初始化为0
EPwm1Regs.TBCTR = 0;

EPwm1Regs.TBCTL.bit.CTRMODE = TB_COUNT_UP; //向上计数模式
EPwm1Regs.TBCTL.bit.PHSEN = TB_DISABLE; // EPwm1是主设备
EPwm1Regs.TBCTL.bit.PRDLD = TB_SHADOW; //设置立即加载
EPwm1Regs.TBCTL.bit.SYNCOSEL = TB_CTR_ZERO;
EPwm1Regs.TBCTL.bit.HSPCLKDIV = TB_DIV1;
EPwm1Regs.TBCTL.bit.CLKDIV = TB_DIV1;

EPwm1Regs.CMPCTL.bit.LOADAMODE = CC_CTR_ZERO;
EPwm1Regs.CMPCTL.bit.LOADBMODE = CC_CTR_ZERO;
EPwm1Regs.CMPCTL.bit.SHDWAMODE = CC_SHADOW;
EPwm1Regs.CMPCTL.bit.SHDWBMODE = CC_SHADOW;

EPwm1Regs.AQCTLA.bit.ZRO = AQ_SET; // ePWM1上的高/低行为
EPwm1Regs.AQCTLA.bit.CAU = AQ_CLEAR;

EALLOW;
EPwm1Regs.HRCNFG.ALL = 0x0;
EPwm1Regs.HRCNFG.bit.HRLOAD = HR_CTR_ZERO; // HR_CTR_zero_PRD;// CTR = 0且 CTR = TBPRD 上的负载
EPwm1Regs.HRCNFG.bit.AUTOCONV = 1; //为 HR 周期启用自动转换
EPwm1Regs.HRCNFG.bit.EDGMODE = HR_BEP; //两个边沿上的 MEP 控制
EPwm1Regs.HRCNFG.bit.CTLMODE = HR_PHS; //选择控制 MEP 的寄存器(CMP/TBPRD 或 TBPHS):
EPwm1Regs.HRPCTL.bit.TBPHSHRLOADE = 1; //此位允许您在发生 SYNCIN 事件时将 ePWM 模块与高分辨率相位同步
EPwm1Regs.TBCTL.bit.PHSDIR = 1; //在同步事件后递增计数、并加载相位的新值(TBPHS)。
EPwm1Regs.HRPCTL.bit.HRPE = 1; //启用高分辨率周期控制。
EDIS;

//配置 ePWM2

EPwm2Regs.TBPRD =周期-1; // PWM 频率= 1/周期
EPwm2Regs.CMPA.half.CMPA =周期/2; //初始设置占空比50%
EPwm2Regs.CMPA.half.CMPAHR =(0 << 8); //初始化 HRPWM 扩展
EPwm2Regs.TBPHS.Half.TBPHS = 0;
EPwm2Regs.TBCTR = 0;

EPwm2Regs.TBCTL.bit.CTRMODE = TB_COUNT_UP;
EPwm2Regs.TBCTL.bit.PHSEN = TB_ENABLE;
EPwm2Regs.TBCTL.bit.PRDLD = TB_SHADOW; //设置立即加载
EPwm2Regs.TBCTL.bit.SYNCOSEL = TB_SYNC_IN; // EPwm2是从设备
EPwm2Regs.TBCTL.bit.HSPCLKDIV = TB_DIV1;
EPwm2Regs.TBCTL.bit.CLKDIV = TB_DIV1;

EPwm2Regs.CMPCTL.bit.LOADAMODE = CC_CTR_ZERO;
EPwm2Regs.CMPCTL.bit.LOADBMODE = CC_CTR_ZERO;
EPwm2Regs.CMPCTL.bit.SHDWAMODE = CC_SHADOW;
EPwm2Regs.CMPCTL.bit.SHDWBMODE = CC_SHADOW;

EPwm2Regs.AQCTLA.bit.ZRO = AQ_SET;
EPwm2Regs.AQCTLA.bit.CAU = AQ_CLEAR;

EALLOW;
EPwm2Regs.HRCNFG.ALL = 0x0;
EPwm2Regs.HRCNFG.bit.HRLOAD = HR_CTR_ZERO; //HR_CTR_zero_PRD;// CTR = 0且 CTR = TBPRD 上的负载
EPwm2Regs.HRCNFG.bit.AUTOCONV = 1; //为 HR 周期启用自动转换
EPwm2Regs.HRCNFG.bit.EDGMODE = HR_BEP; //两个边沿上的 MEP 控制
EPwm2Regs.HRCNFG.bit.CTLMODE = HR_PHS; //选择控制 MEP 的寄存器(CMP/TBPRD 或 TBPHS):
EPwm2Regs.HRPCTL.bit.TBPHSHRLOADE = 1; //此位允许您在发生 SYNCIN 事件时将 ePWM 模块与高分辨率相位同步
EPwm2Regs.TBCTL.bit.PHSDIR = 1; //在同步事件后递增计数、并加载相位的新值(TBPHS)。
EPwm2Regs.HRPCTL.bit.HRPE = 1; //启用高分辨率周期控制。
EDIS;

//设置 ePWM2的相位寄存器

EPwm2Regs.TBPHS.Half.TBPHS = 119; //°ePWM1 -> ePWM2的粗略相移为9°或-351
EPwm2Regs.TBPHS.Half.TBPHSHR = 100; //从 ePWM1 -> ePWM2提供任意值的精细相移

EALLOW;
SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC=1;
EDIS; 

我°此代码观察 ePWM1在 ePWM2上的领先度为9 μ s。 它的工作方式与我从未配置过任何 HR 寄存器的工作方式相同、并且只使用 TBPHS.Halt.TBPHS 进行相位加载。 从本质上讲、高分辨率似乎不起作用。  

衷心感谢您的帮助。 谢谢你。

-Jeff   

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

    TBPHSHR 寄存器的位7-0是保留的、所以所需的值应该被左移8位、这样它将写入位15-8。 HRPWM 用户指南对此进行了说明。

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

    感谢你的帮助。 在左移这些位(即 TBPHSHR = 100 << 8)后、PWM 仍然没有 HR 相移。 我发现我需要为每个 ePWM 添加 HRMSTEP (即 EPwm1Regs.HRMSTEP = 255)、以便设置每个粗略步进的 MEP 步进数。 添加此项后、HR 相移工作正常。

    不过,我有一个跟进问题。 我首先为每个 ePWM 将 HRMSTEP 设置为255。 我使用的是500kHz PWM、SYSCLOCK = 60MHz、因此每个课程步骤将为16.67ns。 当我将 TBPHSHR 设置为最高值255时、PWM 会经历35ns 的相移、但我预计为16.67ns。 我观察到、MEP 步进的最大数量如何大于1个粗步进?

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

    您不应手动设置 HRMSTEP 的值、而应考虑使用 SFO 库来执行校准、从而确定合适的 MEP 换算系数、并且如果启用了自动转换、还将更新 HRMSTEP 寄存器。 在 C2000Ware 中有一些使用 SFO 库的 HRPWM 示例(即 HRPWM_Duty_SFO_v6)
    C:\ti\c2000Ware_1_00_04_00\device_support\f2802x\examples\structs\HRPWM_Duty_SFO_v6

    SFO 库的使用也记录在 HRPWM 用户指南中。

    此致、
    Elizabeth