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:高分辨率相位控制模式问题

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/893679/tms320f28027-high-resolution-phase-control-mode-issues

器件型号:TMS320F28027

您好!

我在使用 HRPWM 更改 EPWM 1和 EPWM 2之间的相位时遇到问题。 我已经通过执行 EPwm2Regs.TBPHS.Half.TBPHSHR =(58 << 8)、 并将 TBPRD 寄存 器设置为 EPwm2Regs.TBPRD = 86来看到120度的相移、从而将 TBPHSHR 寄存器设置为58。  这是设置 TBPHSHR 的正确方法吗? 下面是我的代码、其中初始化了 ePWM 1和2。  

无效
InitEPwm1Examples()
{
EPwm1Regs.TBPRD = EPWM1_TIMER_TBPRD;//周期= 900 TBCLK 计数
//EPwm1Regs.TBPHS.Half.TBPHS = 0;//将相位寄存器设置为零(由于我想使用高分辨率、所以添加了注释)
EPwm1Regs.TBPHS.Half.TBPHSHR = 0;//将相位寄存器设置为零
EPwm1Regs.TBCTR = 0x0000;//清除计数器

EPwm1Regs.CMPA.half.CMPA = EPWM1_MIN_CMPA;//设置比较 A 值
EPwm1Regs.CMPB = EPWM1_MIN_CMPB;//设置比较 B 值

//在3月31日之前没有在这里
EPwm1Regs.TBCTL.bit.HSPCLKDIV = TB_DIV1;//时钟与 SYSCLKOUT 的比值-> TBCLK = SYSCLKOUT = 60MHz
EPwm1Regs.TBCTL.bit.CLKDIV = TB_DIV1;

EPwm1Regs.TBCTL.bit.CTRMODE = TB_COUNT_UPDOWN;//对称模式
EPwm1Regs.TBCTL.bit.PHSEN = TB_DISABLE;//主机模块
EPwm1Regs.TBCTL.bit.PRDLD = TB_SHADOW;
EPwm1Regs.TBCTL.bit.SYNCOSEL = TB_CTR_ZERO;//同步下流模块
EPwm1Regs.CMPCTL.bit.SHDWAMODE = CC_SHADOW;
EPwm1Regs.CMPCTL.bit.SHDWBMODE = CC_SHADOW;
EPwm1Regs.CMPCTL.bit.LOADAMODE = CC_CTR_ZERO;// CTR 上的负载=零
EPwm1Regs.CMPCTL.bit.LOADBMODE = CC_CTR_ZERO;// CTR 上的负载=零
EPwm1Regs.AQCTLA.bit.CAU = AQ_SET;//设置 EPWM1A 的操作
EPwm1Regs.AQCTLA.bit.CAD = AQ_CLEAR;

//在3月31日之前没有在这里
EPwm1Regs.AQCTLB.bit.CBU = AQ_SET;//在事件 B 上设置 PWM1B、递增计数
EPwm1Regs.AQCTLB.bit.CBD = AQ_CLEAR;//在事件 B 上清除 PWM1B,递减计数

// HRPWM 代码
EALLOW;//注意这些寄存器受保护

EPwm1Regs.HRCNFG.ALL = 0x0;//首先清除所有位
EPwm1Regs.HRCNFG.bit.AUTOCONV = 1;//启用 HR 周期的自动转换
EPwm1Regs.HRPCTL.bit.TBPHSHRLOADE = 1;//此位允许您在 SYNCIN、TBCTL[SWFSYNC]或数字比较事件上同步具有高分辨率相位的 ePWM 模块
EPwm1Regs.HRCNFG.bit.HRLOAD = HR_CTR_ZERO;// CTR 上的影子负载= 0
EPwm1Regs.HRCNFG.bit.EDGMODE = HR_BEP;//控制双边沿位置
EPwm1Regs.HRCNFG.bit.CTLMODE = HR_PHS;// PHSHR 控制 MEP

EDIS;

//
// InitEPwm2Example -
//
无效
InitEPwm2Examples()
{
EPwm2Regs.TBPRD = EPWM2_TIMER_TBPRD;//周期= 900 TBCLK 计数
//EPwm2Regs.TBPHS.Half.TBPHS = 58;//将相位寄存器设置为零 (由于我想使用高分辨率、所以添加了注释)
EPwm2Regs.TBPHS.half.TBPHSHR =(58 << 8);//将相位寄存器设置为零  
EPwm2Regs.TBCTR = 0x0000;//清除计数器

EPwm2Regs.CMPA.half.CMPA = EPWM2_MIN_CMPA;//设置比较 A 值
EPwm2Regs.CMPB = EPWM2_MIN_CMPB;//设置比较 B 值

//在3月31日之前没有在这里
EPwm2Regs.TBCTL.bit.HSPCLKDIV = TB_DIV1;//时钟与 SYSCLKOUT 的比率--> TBCLK = SYSCLKOUT = 60MHz
EPwm2Regs.TBCTL.bit.CLKDIV = TB_DIV1;


EPwm2Regs.TBCTL.bit.CTRMODE = TB_COUNT_UPDOWN;//对称模式
EPwm2Regs.TBCTL.bit.PHSEN = TB_ENABLE;//主机模块
EPwm2Regs.TBCTL.bit.PHSDIR = TB_DOWN;//同步时倒计数(=120度)
EPwm2Regs.TBCTL.bit.PRDLD = TB_SHADOW;
EPwm2Regs.TBCTL.bit.SYNCOSEL = TB_SYNC_IN;//同步下流模块
EPwm2Regs.CMPCTL.bit.SHDWAMODE = CC_SHADOW;
EPwm2Regs.CMPCTL.bit.SHDWBMODE = CC_SHADOW;
EPwm2Regs.CMPCTL.bit.LOADAMODE = CC_CTR_ZERO;// CTR 上的负载=零
EPwm2Regs.CMPCTL.bit.LOADBMODE = CC_CTR_ZERO;// CTR 上的负载=零
EPwm2Regs.AQCTLA.bit.CAU = AQ_SET;//设置 EPWM1A 的操作
EPwm2Regs.AQCTLA.bit.CAD = AQ_CLEAR;

//在3月31日之前没有在这里
EPwm2Regs.AQCTLB.bit.CBU = AQ_SET;//在事件 B 上设置 PWM1B、递增计数
EPwm2Regs.AQCTLB.bit.CBD = AQ_CLEAR;//在事件 B 上清除 PWM1B,递减计数

// HRPWM 代码
EALLOW;//注意这些寄存器受保护

EPwm2Regs.HRCNFG.ALL = 0x0;//首先清除所有位
EPwm2Regs.HRCNFG.bit.AUTOCONV = 1;//启用 HR 周期的自动转换
EPwm2Regs.HRPCTL.bit.TBPHSHRLOADE = 1;//此位允许您在 SYNCIN、TBCTL[SWFSYNC]或数字比较事件上同步具有高分辨率相位的 ePWM 模块
EPwm2Regs.HRCNFG.bit.HRLOAD = HR_CTR_ZERO;// CTR 上的影子加载= 0
EPwm2Regs.HRCNFG.bit.EDGMODE = HR_BEP;//控制双边沿位置
EPwm2Regs.HRCNFG.bit.CTLMODE = HR_PHS;// PHSHR 控制 MEP

EDIS;

}

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

    阿玛尼

    设置 TBPHSHR 只配置高分辨率扩展。 如果您想进行120度相移、您需要将 TBPHS 配置为最接近的值、然后使用步长大约为180PS 的 TBPHSHR 来移动其余部分。

    此致、
    Cody

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

    Cody、

    正如您所说的那样、我按照我通常的方式配置了 TBPHSHR、然后使用 TBPHSHR 来移动其余部分、但我看不到 TBPHSHR 的相位有任何影响。 我是否使用正确的语法来配置和利用 TBPHSHR?

    代码开始:

    --------------------------------------------------

    无效

    InitEPwm1Examples()

    {

    EPwm1Regs.TBPRD = EPWM1_TIMER_TBPRD;//周期= 900 TBCLK 计数

    EPwm1Regs.TBPHS.Half.TBPHS = 0;//将相位寄存器设置为零

    EPwm1Regs.TBPHS.Half.TBPHSHR = 0;//将相位寄存器设置为零

    EPwm1Regs.TBCTR = 0x0000;//清除计数器

    EPwm1Regs.CMPA.half.CMPA = EPWM1_MIN_CMPA;//设置比较 A 值

    EPwm1Regs.CMPB = EPWM1_MIN_CMPB;//设置比较 B 值

    //在3月31日之前没有在这里

    EPwm1Regs.TBCTL.bit.HSPCLKDIV = TB_DIV1;//时钟与 SYSCLKOUT 的比值-> TBCLK = SYSCLKOUT = 60MHz

    EPwm1Regs.TBCTL.bit.CLKDIV = TB_DIV1;

    EPwm1Regs.TBCTL.bit.CTRMODE = TB_COUNT_UPDOWN;//对称模式

    EPwm1Regs.TBCTL.bit.PHSEN = TB_DISABLE;//主机模块

    EPwm1Regs.TBCTL.bit.PRDLD = TB_SHADOW;

    EPwm1Regs.TBCTL.bit.SYNCOSEL = TB_CTR_ZERO;//同步下流模块

    EPwm1Regs.CMPCTL.bit.SHDWAMODE = CC_SHADOW;

    EPwm1Regs.CMPCTL.bit.SHDWBMODE = CC_SHADOW;

    EPwm1Regs.CMPCTL.bit.LOADAMODE = CC_CTR_ZERO;// CTR 上的负载=零

    EPwm1Regs.CMPCTL.bit.LOADBMODE = CC_CTR_ZERO;// CTR 上的负载=零

    EPwm1Regs.AQCTLA.bit.CAU = AQ_SET;//设置 EPWM1A 的操作

    EPwm1Regs.AQCTLA.bit.CAD = AQ_CLEAR;

    //在3月31日之前没有在这里

    EPwm1Regs.AQCTLB.bit.CBU = AQ_SET;//在事件 B 上设置 PWM1B、递增计数

    EPwm1Regs.AQCTLB.bit.CBD = AQ_CLEAR;//在事件 B 上清除 PWM1B,递减计数

    // HRPWM 代码

    EALLOW;//注意这些寄存器受保护

    //并仅对 Cha 执行操作

    EPwm1Regs.HRCNFG.ALL = 0x0;//首先清除所有位

    EPwm1Regs.HRCNFG.bit.AUTOCONV = 1;//启用 HR 周期的自动转换

    EPwm1Regs.HRPCTL.bit.TBPHSHRLOADE = 1;//此位允许您在 SYNCIN、TBCTL[SWFSYNC]或数字比较事件上同步具有高分辨率相位的 ePWM 模块

    EPwm1Regs.HRCNFG.bit.HRLOAD = HR_CTR_ZERO;// CTR 上的影子负载= 0

    EPwm1Regs.HRCNFG.bit.EDGMODE = HR_BEP;//控制双边沿位置

    EPwm1Regs.HRCNFG.bit.CTLMODE = HR_PHS;// PHSHR 控制 MEP

    EDIS;

    }

    //

    // InitEPwm2Example -

    //

    无效

    InitEPwm2Examples()

    {

    EPwm2Regs.TBPRD = EPWM2_TIMER_TBPRD;//周期= 900 TBCLK 计数

    EPwm2Regs.TBPHS.Half.TBPHS = 58;

    EPwm2Regs.TBPHS.Half.TBPHSHR =(100 << 8);

    EPwm2Regs.TBCTR = 0x0000;//清除计数器

    EPwm2Regs.CMPA.half.CMPA = EPWM2_MIN_CMPA;//设置比较 A 值

    EPwm2Regs.CMPB = EPWM2_MIN_CMPB;//设置比较 B 值

    EPwm2Regs.TBCTL.bit.HSPCLKDIV = TB_DIV1;//时钟与 SYSCLKOUT 的比率--> TBCLK = SYSCLKOUT = 60MHz

    EPwm2Regs.TBCTL.bit.CLKDIV = TB_DIV1;

    EPwm2Regs.TBCTL.bit.CTRMODE = TB_COUNT_UPDOWN;//对称模式

    EPwm2Regs.TBCTL.bit.PHSEN = TB_ENABLE;//主机模块

    EPwm2Regs.TBCTL.bit.PHSDIR = TB_DOWN;//同步时倒计数(=120度)

    EPwm2Regs.TBCTL.bit.PRDLD = TB_SHADOW;

    EPwm2Regs.TBCTL.bit.SYNCOSEL = TB_SYNC_IN;//同步下流模块

    EPwm2Regs.CMPCTL.bit.SHDWAMODE = CC_SHADOW;

    EPwm2Regs.CMPCTL.bit.SHDWBMODE = CC_SHADOW;

    EPwm2Regs.CMPCTL.bit.LOADAMODE = CC_CTR_ZERO;// CTR 上的负载=零

    EPwm2Regs.CMPCTL.bit.LOADBMODE = CC_CTR_ZERO;// CTR 上的负载=零

    EPwm2Regs.AQCTLA.bit.CAU = AQ_SET;//设置 EPWM1A 的操作

    EPwm2Regs.AQCTLA.bit.CAD = AQ_CLEAR;

    //在3月31日之前没有在这里

    EPwm2Regs.AQCTLB.bit.CBU = AQ_SET;//在事件 B 上设置 PWM1B、递增计数

    EPwm2Regs.AQCTLB.bit.CBD = AQ_CLEAR;//在事件 B 上清除 PWM1B,递减计数

    // HRPWM 代码

    EALLOW;//注意这些寄存器受保护

    //并仅对 Cha 执行操作

    EPwm2Regs.HRCNFG.ALL = 0x0;//首先清除所有位

    EPwm2Regs.HRCNFG.bit.AUTOCONV = 1;//启用 HR 周期的自动转换

    EPwm2Regs.HRPCTL.bit.TBPHSHRLOADE = 1;//此位允许您在 SYNCIN、TBCTL[SWFSYNC]或数字比较事件上同步具有高分辨率相位的 ePWM 模块

    EPwm2Regs.HRCNFG.bit.HRLOAD = HR_CTR_ZERO;// CTR 上的影子加载= 0

    EPwm2Regs.HRCNFG.bit.EDGMODE = HR_BEP;//控制双边沿位置

    EPwm2Regs.HRCNFG.bit.CTLMODE = HR_PHS;// PHSHR 控制 MEP

    EDIS;

    }

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

    实际上、我能够弄清我缺少 EPwm1Regs.HRMSTEP = 255;每个寄存器的声明。 我现在的问题如下:

    1) 1)如何选择 HRMSTEP 值?  (未使用 SFO -我尝试了此操作、但无法运行我的代码)

    2) 2)对于60MHz 时钟93、F28027的最大 MEP 阶跃是多少? 如果是、设置 HRMSTEP = 255有什么作用?

    3)是一个粗略步进、60MHz 时钟等于150 ps (在我正在阅读 http://www.ti.com/lit/ug/spru924f/spru924f.pdf 的指南中所说的那样)、还是像您之前所说的180 ps?

    4) 4)我能否获取计算出的 TBPHS 的十进制部分(假设为58.589、因此十进制数为0.589)、然后将其乘以某个值、将 TBPHSHR 设置为我所需的相移?

    非常感谢您的帮助。

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

    阿玛尼

    1. 您将需要运行 SFO、这是校准 HRPWM 模块的内容。 HRPWM 示例应将其显示为关闭。
    2. 否、这取决于器件。
    3. 60MHz 时钟的课程步骤等于1/60MHz。 IE。 课程步骤仅为一个时钟脉冲宽度。 PWM 的 HR 部分为~180ps / MEP 步长。
    4. 是的、这就是它在您使用自动转换时的工作方式、文档和示例中应该对此进行详细介绍。

    此致、
    Cody

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

    感谢 Cody。

    您是否有任何文档或示例可供参考、这些文档或示例显示正在设置 TBPHSHR 并使用了 SFO? 我没有找到 使用高分辨率相位控制的示例。

    最棒的

    阿玛尼

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

    阿玛尼

    它看起来像 Example_2802xHRPWM_PrdUpDown _ SFO_V6.c 和 Example_2802xHRPWM_MultiCh_PrdUpDown _ SFO_V6.c、它们都设置了 SFO 和 TBPHSHR。 不过,我没有看到有人在使用它的例子。

    由此给您带来的不便、我们深表歉意。


    此致、
    Cody