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.

[参考译文] 使用 PWMB 输出的 TMS320F28337S 梯形控制

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

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1000989/tms320f28337s-trapezoidal-control-using-pwmb-output

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

大家好、

I m 尝试实现 梯形控制、如下所示:

/* HS3 HS2 HS1 SCR TP1 TP3 BT1 BT2 BT3

     "0""0""1""1" 1                    "0""1""1" PWM "0""0"

     "1""0""1""1" 5                     "0""0" PWM "1""1""0""0"

      "1""0""0""0" 4                    "0""0""1""1" PWM "0"

     "1""1""0"           6         PWM "0""0""0""0""0""1""1""0"

      "0""1""0""0" 2                    "1""0""0""0""0" PWM

      "0""1""1""1" 3                   "0" PWM "0""0""0""0""0""0""1"

*

根据 BLDC 控制套件的示例、我设法在 A 输出(TOPS)上仅获得 PWM、  在 B 输出(底部)上仅获得高电平。

我的代码如下所示、表示传感器等于1和5:

案例1:

DrvPWM_EPwm1Regs.AQCSFRC.bit.CSFB = 0;/*在 EPWM1的输出 B 上禁用强制*

DrvPWM_EPwm1Regs.AQCTLB.bit.CBU = 2;//在递增计数时将 CTR = CMPB 时设置为高电平*

DrvPWM_EPwm1Regs.AQCTLB.bit.CBD = 1;//在递减计数时将 CTR = CMPB 时设置为低电平*

DrvPWM_EPwm1Regs.CMPB.all = p_u16PWM;/* EPWM1输出 B 上的 PWM 信号*

DrvPWM_EPwm1Regs.AQCSFRC.bit.CSFA = 1;//在 EPWM1的输出 A 上强制一个持续低电平*

/**//

DrvPWM_EPwm2Regs.AQCSFRC.bit.CSFA = 2;//在 EPWM2的输出 A 上强制设置连续高电平*

DrvPWM_EPwm2Regs.AQCSFRC.bit.CSFB = 1;//在 EPWM2的输出 B 上强制一个持续低电平*

/**//

DrvPWM_EPwm3Regs.AQCSFRC.bit.CSFA = 1;//在 EPWM3的输出 A 上强制为连续低电平*

DrvPWM_EPwm3Regs.AQCSFRC.bit.CSFB = 1;//在 EPWM3的输出 B 上强制一个持续低电平*

中断;

情况5:

DrvPWM_EPwm1Regs.AQCSFRC.bit.CSFA = 1;//在 EPWM1的输出 A 上强制为连续低电平*

DrvPWM_EPwm1Regs.AQCSFRC.bit.CSFB = 2;/*在 EPWM1的输出 B 上强制为连续高电平*

DrvPWM_EPwm2Regs.AQCSFRC.bit.CSFA = 1;//在 EPWM2的输出 A 上强制一个持续低电平*

DrvPWM_EPwm2Regs.AQCSFRC.bit.CSFB = 1;//在 EPWM2的输出 B 上强制一个持续低电平*

DrvPWM_EPwm3Regs.AQCSFRC.bit.CSFA = 0;/*在 EPWM3的输出 A 上禁用强制*

DrvPWM_EPwm3Regs.AQCTLA.bit.CAU = 2;//在递增计数时 CTR = CMPA 时设置为高电平*

DrvPWM_EPwm3Regs.AQCTLA.bit.CAD = 1;//在倒计数时 CTR = CMPA 时设置为低电平*

DrvPWM_EPwm3Regs.CMPA.all = p_u16PWM;/* EPWM3的输出 A 上的 PWM 信号*

DrvPWM_EPwm3Regs.AQCSFRC.bit.CSFB = 1;//在 EPWM3的输出 B 上强制一个持续低电平*

中断;

 

我预期在输出 B 上使用以下公式进行 PWM:

"DrvPWM_EPwm1Regs.AQCSFRC.bit.CSFB = 0;/*在 EPWM1的输出 B 上禁用强制*

DrvPWM_EPwm1Regs.AQCTLB.bit.CBU = 2;//在递增计数时将 CTR = CMPB 时设置为高电平*

DrvPWM_EPwm1Regs.AQCTLB.bit.CBD = 1;//在递减计数时将 CTR = CMPB 时设置为低电平*

DrvPWM_EPwm1Regs.CMPB.all = p_u16PWM;/* EPWM1输出 B 上的 PWM 信号*/"

 

但到目前为止、我的输出 B 只有一个高电平、并且没有 PWM……  

我应该去哪里?

 

AQCTLA 和 B 配置如下:

/******** /

/* AQCTLA 寄存器*/

/******** /

// CBD

DrvPWM_EPwm1Regs.AQCTLA.bit.CBD =

DrvPWM_EPwm2Regs.AQCTLA.bit.CBD =

DrvPWM_EPwm3Regs.AQCTLA.bit.CBD = AQ_NO_ACTION;

// CBD

DrvPWM_EPwm1Regs.AQCTLA.bit.CBU =

DrvPWM_EPwm2Regs.AQCTLA.bit.CBU =

DrvPWM_EPwm3Regs.AQCTLA.bit.CBU = AQ_NO_ACTION;

// cad

DrvPWM_EPwm1Regs.AQCTLA.bit.CAD =

DrvPWM_EPwm2Regs.AQCTLA.bit.CAD =

DrvPWM_EPwm3Regs.AQCTLA.bit.CAD = AQ_SET;

// CAU

DrvPWM_EPwm1Regs.AQCTLA.bit.CAU =

DrvPWM_EPwm2Regs.AQCTLA.bit.CAU =

DrvPWM_EPwm3Regs.AQCTLA.bit.CAU = AQ_SET;

// PRD

DrvPWM_EPwm1Regs.AQCTLA.bit.PRD =

DrvPWM_EPwm2Regs.AQCTLA.bit.PRD =

DrvPWM_EPwm3Regs.AQCTLA.bit.PRD = AQ_NO_ACTION;

// ZRO

DrvPWM_EPwm1Regs.AQCTLA.bit.ZRO =

DrvPWM_EPwm2Regs.AQCTLA.bit.ZRO =

DrvPWM_EPwm3Regs.AQCTLA.bit.ZRO = AQ_NO_ACTION;

/******** /

/* AQCTLB 寄存器*/

/******** /

// CBD

DrvPWM_EPwm1Regs.AQCTLB.bit.CBD =

DrvPWM_EPwm2Regs.AQCTLB.bit.CBD =

DrvPWM_EPwm3Regs.AQCTLB.bit.CBD = AQ_SET;

// CBD

DrvPWM_EPwm1Regs.AQCTLB.bit.CBU =

DrvPWM_EPwm2Regs.AQCTLB.bit.CBU =

DrvPWM_EPwm3Regs.AQCTLB.bit.CBU = AQ_SET;

// cad

DrvPWM_EPwm1Regs.AQCTLB.bit.CAD =

DrvPWM_EPwm2Regs.AQCTLB.bit.CAD =

DrvPWM_EPwm3Regs.AQCTLB.bit.CAD = AQ_NO_ACTION;

// CAU

DrvPWM_EPwm1Regs.AQCTLB.bit.CAU =

DrvPWM_EPwm2Regs.AQCTLB.bit.CAU =

DrvPWM_EPwm3Regs.AQCTLB.bit.CAU = AQ_NO_ACTION;

// PRD

DrvPWM_EPwm1Regs.AQCTLB.bit.PRD =

DrvPWM_EPwm2Regs.AQCTLB.bit.PRD =

DrvPWM_EPwm3Regs.AQCTLB.bit.PRD = AQ_NO_ACTION;

// ZRO

DrvPWM_EPwm1Regs.AQCTLB.bit.ZRO =

DrvPWM_EPwm2Regs.AQCTLB.bit.ZRO =

DrvPWM_EPwm3Regs.AQCTLB.bit.ZRO = AQ_NO_ACTION;

 

 

谢谢!  

功率放大器  

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

    您好、

    您是否为模式2或模式4配置了死区发生器? 某些 EPWM 模块类型0/1无法直接将死区 PWMB 旁路到 GPIO 引脚。 也许可以配置重叠的高电平有效输出 A、使 B 通过死区配置实现对称梯形 DSP。 也许可以添加 GPIO 引脚配置、以使您的代码中未显示 EPWM1输出 A/B。  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [报价 userid="271481" URL"~/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1000989/tms320f28337s-trapezoidal-control-using-pwmb-output "]我设法在 A 输出(TOPS)上仅获取 PWM、  在 B 输出(底部)上仅获取高电平[/报价]

    它是正确的、对于 BLDC 的梯形控制是可以的。

    [引用 userid="271481" URL="~/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1000989/tms320f28337s-trapezoidal-control-using-pwmb-output "]

    但到目前为止、我的输出 B 只有一个高电平、并且没有 PWM……  

    我应该去哪里看看

    [/报价]

    您  需要将相关 GPIO 配置为 PWM。

    2.禁用 ePWM 模块的死区。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我设法在 A 输出(顶部)上仅获得 PWM、  在 B 输出(底部)上仅获得高电平

    它是正确的、对于 BLDC 的梯形控制是可以的。

    用户4565873:

    是的、但不 是我们想要执行的... 那么、让我们假设 Sensored 120°control… 120°方波交替领导 PWM  

    但到目前为止、我的输出 B 只有一个高电平、并且没有 PWM……  

    我应该去哪里看看

    您  需要将相关 GPIO 配置为 PWM。

    用户4565873  已完成、FOC 控制已测试正常。

    2.禁用 ePWM 模块的死区。

    用户4565873 已完成、这使我能够获得我现在的位置… 但输出 B 上没有 PWM

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

    请您解释一下:

    "一些 EPWM 模块类型0/1无法直接将死区 PWMB 旁路到 GPIO 引脚。 也许可以配置重叠的高电平有效输出 A、使 B 通过死区配置实现对称梯形 DSP。"

    死区已禁用、我在请求 支持之前发现它可能会导致问题

    感谢您的选择。

    还有其他想法吗?

    谢谢! )

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [引用 userid="271481" URL"~/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1000989/tms320f28337s-trapezoidal-control-using-pwmb-output/3700496 #3700496"]死区已禁用,我发现在我请求 支持之前,死区可能会导致问题[/quot]

    如果您打算驾驶1/2桥,这可能会有点危险?

    您必须检查 MCU 类型的 TRM 是否仅使用死区将 EPWMA-A 绑定到 B。 0/1类模块的限制、4类 EPWM-B 在配置正确时可以完全旁路死区。 一些基于 ARM 的 PWM 模块也具有直通功能。 当死区被禁用时、可以将 CMPB 传递到 GPIO 引脚、AKA 通过模式1。

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

    您能解释一下您的意思吗

    [引用 userid="48581" URL"~/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1000989/tms320f28337s-trapezoidal-control-using-pwmb-output/3700774 #3700774"]当死区被禁用时、可以将 CMPB 传递到 GPIO 引脚、AKA 通过模式1。[/quot]

    死区 在其模式为0时被禁用。

    谢谢、

    功率放大器。

    备注:

    [引用 userid="48581" URL"~/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1000989/tms320f28337s-trapezoidal-control-using-pwmb-output/3700774 #3700774"]如果您打算驱动1/2个桥,这可能会有点危险?

    是的、这将是研究…的下一个要点 或导致不使用此命令的原因。   但首先要意识到我的电子工程师对我的要求。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [引用 userid="271481" URL"~/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1000989/tms320f28337s-trapezoidal-control-using-pwmb-output/3700914 #3700914"]死区 模式为0时被禁用。[/quot]

    这正是 ePWM-B 未输出 GPIO 引脚的点。 即使在 GPIO 被配置后、dB 模式0也不会通过 EPWM-B?

    类型4 ePWM 模块死区发生器、省略模式0。 查看您的 MCU 技术资源手册(TRM)、了解如何配置直通模式1或使用 A 以某种方式生成 B。 类型4添加了 DB 模式1、还允许通过 DB OUT 连接到 EPWM-Xbar GPIO 的 CMPB。 对于6步梯形模式下的慢速电流衰减、DB 配置会有点棘手。   

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

    非常感谢您的详细解释!  

    我不能说现在非常清楚了。。。  (由于各类方案) 但非常感谢…的解释

    在最新的 DSP 上尝试120°时、没有想到会遇到如此复杂的问题。

     我现在还有另一条路... AQCTL A 设置 使我的 PWM A  消失。

    这让我的 PWMA 很失望 此外:

    // CBD
       DrvPWM_EPwm1Regs.AQCTLB.bit.CBD =
       DrvPWM_EPwm2Regs.AQCTLB.bit.CBD =
       DrvPWM_EPwm3Regs.AQCTLB.bit.CBD = AQ_CLEAR;
       // CBU
       DrvPWM_EPwm1Regs.AQCTLB.bit.CBU =
       DrvPWM_EPwm2Regs.AQCTLB.bit.CBU =
       DrvPWM_EPwm3Regs.AQCTLB.bit.CBU = AQ_SET;

       // cad
       DrvPWM_EPwm1Regs.AQCTLB.bit.CAD =
       DrvPWM_EPwm2Regs.AQCTLB.bit.CAD =
       DrvPWM_EPwm3Regs.AQCTLB.bit.CAD = AQ_NO_ACTION;
       // CAU
       DrvPWM_EPwm1Regs.AQCTLB.bit.CAU =
       DrvPWM_EPwm2Regs.AQCTLB.bit.CAU =
       DrvPWM_EPwm3Regs.AQCTLB.bit.CAU = AQ_NO_ACTION;

       // PRD
       DrvPWM_EPwm1Regs.AQCTLB.bit.PRD =
       DrvPWM_EPwm2Regs.AQCTLB.bit.PRD =
       DrvPWM_EPwm3Regs.AQCTLB.bit.PRD = AQ_NO_ACTION;
       // ZRO
       DrvPWM_EPwm1Regs.AQCTLB.bit.ZRO =
       DrvPWM_EPwm2Regs.AQCTLB.bit.ZRO =
       DrvPWM_EPwm3Regs.AQCTLB.bit.ZRO = AQ_NO_ACTION;

    尽管它正是 TI 在其示例中给出的配置:

     DrvPWM_EPwm2Regs.AQCSFRC.bit.CSFA = 0;              /*在 EPWM2的输出 A 上禁用强制           *
                 DrvPWM_EPwm2Regs.AQCTLA.bit.CAU = 2;                //在递增计数时 CTR = CMPA 时设置为高电平            *
                 DrvPWM_EPwm2Regs.AQCTLA.bit.ZRO = 1;                //当 CTR = 0时设置为低电平                         *
                 DrvPWM_EPwm2Regs.CMPA.all = p_u16PWM;                /* EPWM2输出 A 上的 PWM 信号(Q15 -> Q0)     *
                 DrvPWM_EPwm2Regs.AQCSFRC.bit.CSFB = 1;              //在 EPWM2的输出 A 上强制一个持续低电平  *

     通过此配置 、PWMA 运行:

    // CBD
       DrvPWM_EPwm1Regs.AQCTLB.bit.CBD =
       DrvPWM_EPwm2Regs.AQCTLB.bit.CBD =
       DrvPWM_EPwm3Regs.AQCTLB.bit.CBD = AQ_SET;
       // CBU
       DrvPWM_EPwm1Regs.AQCTLB.bit.CBU =
       DrvPWM_EPwm2Regs.AQCTLB.bit.CBU =
       DrvPWM_EPwm3Regs.AQCTLB.bit.CBU = AQ_SET;

       // cad
       DrvPWM_EPwm1Regs.AQCTLB.bit.CAD =
       DrvPWM_EPwm2Regs.AQCTLB.bit.CAD =
       DrvPWM_EPwm3Regs.AQCTLB.bit.CAD = AQ_NO_ACTION;
       // CAU
       DrvPWM_EPwm1Regs.AQCTLB.bit.CAU =
       DrvPWM_EPwm2Regs.AQCTLB.bit.CAU =
       DrvPWM_EPwm3Regs.AQCTLB.bit.CAU = AQ_NO_ACTION;

       // PRD
       DrvPWM_EPwm1Regs.AQCTLB.bit.PRD =
       DrvPWM_EPwm2Regs.AQCTLB.bit.PRD =
       DrvPWM_EPwm3Regs.AQCTLB.bit.PRD = AQ_NO_ACTION;
       // ZRO
       DrvPWM_EPwm1Regs.AQCTLB.bit.ZRO =
       DrvPWM_EPwm2Regs.AQCTLB.bit.ZRO =
       DrvPWM_EPwm3Regs.AQCTLB.bit.ZRO = AQ_NO_ACTION;

     您是否看到此配置与我的 PWM-B 输出问题有任何关系?

    谢谢、

    功率放大器。

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

    您是否 禁用 ePWM 的死区?  您使用的是什么栅极驱动器? 您可以直接发布 ePWM 和 GPIO 配置文件、更容易理解 您的问题。

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

    如您所见、死区发生器位于 EPWM-CMPAA/B 输出的外部。 寄存器复位二进制默认值可能不会产生您所期望的结果。

    请使用 C2000ware driverlib 函数来配置外设寄存器。 数据表 TRM 外设技术讨论与您的问题更相关、将为您提供极大帮助。 上面的编码风格没有给出关于在发动机罩下面实际接触到的内容的足够详细的信息。

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

     以下是 PWM 配置的代码:

     

    我只是在120°的 PWM 排序方面遇到了问题。

    /*
        *以下寄存器受"保护"、允许访问。
        *
       EALLOW;
       //启用 ePWM 模块时钟
       CpuSysRegs.PCLKCR2.bit.EPWM1 = 1;// ePWM1
       CpuSysRegs.PCLKCR2.bit.EPWM2 = 1;// ePWM2
       CpuSysRegs.PCLKCR2.bit.EPWM3 = 1;// ePWM3

       CpuSysRegs.PCLKCR0.bit.TBCLKSYNC=0;//停止所有 TB 时钟

       //禁用寄存器访问
       EDIS;

       /******* /
       /* TBCTL 寄存器*/
       /******* /
       //同步后向上计数。 事件
       DrvPWM_EPwm1Regs.TBCTL.bit.PHSDIR =
       DrvPWM_EPwm2Regs.TBCTL.bit.PHSDIR =
       DrvPWM_EPwm3Regs.TBCTL.bit.PHSDIR = TB_UP;
       // TBCLK = SYSCLKOUT /(HSPCLKDIV * CLKDIV)
       // CLKDIV=1
       DrvPWM_EPwm1Regs.TBCTL.bit.CLKDIV =
       DrvPWM_EPwm2Regs.TBCTL.bit.CLKDIV =
       DrvPWM_EPwm3Regs.TBCTL.bit.CLKDIV = TB_DIV1;
       // HSPCLKDIV = 1.
       DrvPWM_EPwm1Regs.TBCTL.bit.HSPCLKDIV =
       DrvPWM_EPwm2Regs.TBCTL.bit.HSPCLKDIV =
       DrvPWM_EPwm3Regs.TBCTL.bit.HSPCLKDIV = TB_DIV1;
       // SYNCOSEL:设置同步=>直通
       DrvPWM_EPwm1Regs.TBCTL.bit.SYNCOSEL =
       DrvPWM_EPwm2Regs.TBCTL.bit.SYNCOSEL =
       DrvPWM_EPwm3Regs.TBCTL.bit.SYNCOSEL = TB_SYNC_IN;
       // PRDLD:TBPRD 寄存器加载
       DrvPWM_EPwm1Regs.TBCTL.bit.PRDLD =
       DrvPWM_EPwm2Regs.TBCTL.bit.PRDLD =
       DrvPWM_EPwm3Regs.TBCTL.bit.PRDLD = TB_SHADOW;
       // PHSEN:允许同步每个计时器
       DrvPWM_EPwm1Regs.TBCTL.bit.PHSEN =
       DrvPWM_EPwm2Regs.TBCTL.bit.PHSEN =
       DrvPWM_EPwm3Regs.TBCTL.bit.PHSEN = TB_DISABLE;
       // CTRMODE:向上-向下计数模式
       DrvPWM_EPwm1Regs.TBCTL.bit.CTRMODE =
       DrvPWM_EPwm2Regs.TBCTL.bit.CTRMODE =
       DrvPWM_EPwm3Regs.TBCTL.bit.CTRMODE = TB_COUNT_UPDOWN;

       /******** /
       /* CMPCTL 寄存器*/
       /******** /
       // SHDWAMODE
       DrvPWM_EPwm1Regs.CMPCTL.bit.SHDWAMODE =
       DrvPWM_EPwm2Regs.CMPCTL.bit.SHDWAMODE =
       DrvPWM_EPwm3Regs.CMPCTL.bit.SHDWAMODE = CC_SHADOW;
       // SHDWBMODE
       DrvPWM_EPwm1Regs.CMPCTL.bit.SHDWBMODE =
       DrvPWM_EPwm2Regs.CMPCTL.bit.SHDWBMODE =
       DrvPWM_EPwm3Regs.CMPCTL.bit.SHDWBMODE = CC_SHADOW;
       // LOADAMODE
       DrvPWM_EPwm1Regs.CMPCTL.bit.LOADAMODE =
       DrvPWM_EPwm2Regs.CMPCTL.bit.LOADAMODE =
       DrvPWM_EPwm3Regs.CMPCTL.bit.LOADAMODE = CC_CTR_ZERO;
       // LOADAMODE
       DrvPWM_EPwm1Regs.CMPCTL.bit.LOADBMODE =
       DrvPWM_EPwm2Regs.CMPCTL.bit.LOADBMODE =
       DrvPWM_EPwm3Regs.CMPCTL.bit.LOADBMODE = CC_CTR_ZERO;

       /******* /
       /* TBPHS 寄存器*/
       /******* /
       DrvPWM_EPwm1Regs.TBPHS.bit.TBPHS =
       DrvPWM_EPwm2Regs.TBPHS.bit.TBPHS =
       DrvPWM_EPwm3Regs.TBPHS.bit.TBPHS = 0x0000;

       /******* /
       /* TBPRD 寄存器*/
       /******* /
       DrvPWM_EPwm1Regs.TBPRD = DrvPWM_ePWM.epwm1timertbprd;
       DrvPWM_EPwm2Regs.TBPRD = DrvPWM_ePWM.epwm2timertbprd;
       DrvPWM_EPwm3Regs.TBPRD = DrvPWM_ePWM.epwm3timertbprd;

       /**** /
       /* CMPA 寄存器*/
       /**** /
       DrvPWM_EPwm1Regs.CMPA.bit.CMPA = DrvPWM_ePWM.epwm1cmpa;
       DrvPWM_EPwm2Regs.CMPA.bit.CMPA = DrvPWM_ePWM.epwm2cmpa;
       DrvPWM_EPwm3Regs.CMPA.bit.CMPA = DrvPWM_ePWM.epwm3cmmpa;

       /**** /
       /* CMPB 寄存器*/
       /**** /
       DrvPWM_EPwm1Regs.CMPB.bit.CMPB = DrvPWM_ePWM.epwm1cmpb;
       DrvPWM_EPwm2Regs.CMPB.bit.CMPB = DrvPWM_ePWM.epwm2cmpb;
       DrvPWM_EPwm3Regs.CMPB.bit.CMPB = DrvPWM_ePWM.epwm3cmmpb;

       /******** /
       /* AQCTLA 寄存器*/
       /******** /
       // CBD
       DrvPWM_EPwm1Regs.AQCTLA.bit.CBD =
       DrvPWM_EPwm2Regs.AQCTLA.bit.CBD =
       DrvPWM_EPwm3Regs.AQCTLA.bit.CBD = AQ_NO_ACTION;
       // CBD
       DrvPWM_EPwm1Regs.AQCTLA.bit.CBU =
       DrvPWM_EPwm2Regs.AQCTLA.bit.CBU =
       DrvPWM_EPwm3Regs.AQCTLA.bit.CBU = AQ_NO_ACTION;
       // cad
       DrvPWM_EPwm1Regs.AQCTLA.bit.CAD =
       DrvPWM_EPwm2Regs.AQCTLA.bit.CAD =
       DrvPWM_EPwm3Regs.AQCTLA.bit.CAD = AQ_CLEAR;
       // CAU
       DrvPWM_EPwm1Regs.AQCTLA.bit.CAU =
       DrvPWM_EPwm2Regs.AQCTLA.bit.CAU =
       DrvPWM_EPwm3Regs.AQCTLA.bit.CAU = AQ_SET;
       // PRD
       DrvPWM_EPwm1Regs.AQCTLA.bit.PRD =
       DrvPWM_EPwm2Regs.AQCTLA.bit.PRD =
       DrvPWM_EPwm3Regs.AQCTLA.bit.PRD = AQ_NO_ACTION;
       // ZRO
       DrvPWM_EPwm1Regs.AQCTLA.bit.ZRO =
       DrvPWM_EPwm2Regs.AQCTLA.bit.ZRO =
       DrvPWM_EPwm3Regs.AQCTLA.bit.ZRO = AQ_NO_ACTION;

       /******** /
       /* AQCTLB 寄存器*/
       /******** /
       // CBD
       DrvPWM_EPwm1Regs.AQCTLB.bit.CBD =
       DrvPWM_EPwm2Regs.AQCTLB.bit.CBD =
       DrvPWM_EPwm3Regs.AQCTLB.bit.CBD = AQ_NO_ACTION;
       // CBD
       DrvPWM_EPwm1Regs.AQCTLB.bit.CBU =
       DrvPWM_EPwm2Regs.AQCTLB.bit.CBU =
       DrvPWM_EPwm3Regs.AQCTLB.bit.CBU = AQ_NO_ACTION;

       // cad
       DrvPWM_EPwm1Regs.AQCTLB.bit.CAD =
       DrvPWM_EPwm2Regs.AQCTLB.bit.CAD =
       DrvPWM_EPwm3Regs.AQCTLB.bit.CAD = AQ_CLEAR;
       // CAU
       DrvPWM_EPwm1Regs.AQCTLB.bit.CAU =
       DrvPWM_EPwm2Regs.AQCTLB.bit.CAU =
       DrvPWM_EPwm3Regs.AQCTLB.bit.CAU = AQ_SET;

       // PRD
       DrvPWM_EPwm1Regs.AQCTLB.bit.PRD =
       DrvPWM_EPwm2Regs.AQCTLB.bit.PRD =
       DrvPWM_EPwm3Regs.AQCTLB.bit.PRD = AQ_NO_ACTION;
       // ZRO
       DrvPWM_EPwm1Regs.AQCTLB.bit.ZRO =
       DrvPWM_EPwm2Regs.AQCTLB.bit.ZRO =
       DrvPWM_EPwm3Regs.AQCTLB.bit.ZRO = AQ_NO_ACTION;

       /******* /
       /* AQCSFRC 寄存器*/
       /******* /
       //强制输出 A 处于低电平状态
       DrvPWM_EPwm1Regs.AQCSFRC.bit.CSFA =
       DrvPWM_EPwm2Regs.AQCSFRC.bit.CSFA =
       DrvPWM_EPwm3Regs.AQCSFRC.bit.CSFA = 0x1;

       //强制输出 B 处于低电平状态
     DrvPWM_EPwm1Regs.AQCSFRC.bit.CSFB =
     DrvPWM_EPwm2Regs.AQCSFRC.bit.CSFB =
     DrvPWM_EPwm3Regs.AQCSFRC.bit.CSFB = 0x1;

        /******* /
       /* DBCTL 寄存器*/
       /******* /
       DrvPWM_EPwm1Regs.DBCTL.ALL = 0x0;
       DrvPWM_EPwm2Regs.DBCTL.ALL = 0x0;
       DrvPWM_EPwm3Regs.DBCTL.ALL = 0x0;
     
       DrvPWM_EPwm1Regs.DBCTL.bit.out_mode =
       DrvPWM_EPwm2Regs.DBCTL.bit.out_mode =
       DrvPWM_EPwm3Regs.DBCTL.bit.OUT_MODE = DB_DISABLE;
       /*
        *禁用寄存器访问
        *
       EDIS;

       //最后为 PWM 配置 GPIO
       x_vDrvGPIO_CoreConfigurePWM();
       //和 EVASOC
       x_vDrvGPIO_CoreConfigureEVSOC();

     /*
     *简介:ePWM 参数初始化
     *

       /*下面的寄存器是"受保护的"、允许访问。*/
     EALLOW;

     CpuSysRegs.PCLKCR0.bit.TBCLKSYNC = 1;//启动所有已同步的计时器

     /*控制循环中断*/
      DrvPWM_EPwm1Regs.ETSEL.bit.INTSEL = ET_CTR_PRD;    //重新加载时选择 INT。
      DrvPWM_EPwm1Regs.ETSEL.bit.INTEN = 1;               //启用 INT
      DrvPWM_EPwm1Regs.ETPS.bit.INTPRD = et_1st;          //在发生第一个事件时生成 INT


         //启用 SOCA
         //DrvPWM_EPwm1Regs.TBCTL.bit.CTRMODE = 0;//取消冻结,并进入向上计数模式
         DrvPWM_EPwm1Regs.ETSEL.bit.SOCAEN = 1;
         DrvPWM_EPwm1Regs.ETSEL.bit.SOCASEL = ET_CTR_PRD;//开始@计数器=周期。


      /*
       * 禁用寄存器访问
       *
         EDIS;

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

    基于霍尔传感器位置的序列:

    TI 提供的示例是递增计数器。 我想使用 UP_DOWN。

    开关(p_u16HallSensorSeq)

    案例1:

    DrvPWM_EPwm1Regs.AQCSFRC.bit.CSFB = 0;/*在 EPWM1的输出 B 上禁用强制*

    DrvPWM_EPwm1Regs.AQCTLB.bit.CBU = 2;//在递增计数时将 CTR = CMPB 时设置为高电平*

    DrvPWM_EPwm1Regs.AQCTLB.bit.CBD = 1;//在倒计数时将 CTR = CMPB 时设置为低电平*/此处 TI 执行 bit.zero = 1

    DrvPWM_EPwm1Regs.CMPB.all = p_u16PWM;/* EPWM1输出 B 上的 PWM 信号*

    DrvPWM_EPwm1Regs.AQCSFRC.bit.CSFA = 1;//在 EPWM1的输出 A 上强制一个持续低电平*

    /**//

    DrvPWM_EPwm2Regs.AQCSFRC.bit.CSFA = 2;//在 EPWM2的输出 A 上强制设置连续高电平*

    DrvPWM_EPwm2Regs.AQCSFRC.bit.CSFB = 1;//在 EPWM2的输出 B 上强制一个持续低电平*

    /**//

    DrvPWM_EPwm3Regs.AQCSFRC.bit.CSFA = 1;//在 EPWM3的输出 A 上强制为连续低电平*

    DrvPWM_EPwm3Regs.AQCSFRC.bit.CSFB = 1;//在 EPWM3的输出 B 上强制一个持续低电平*

    中断;

    情况5:

    DrvPWM_EPwm1Regs.AQCSFRC.bit.CSFA = 1;//在 EPWM1的输出 A 上强制为连续低电平*

    DrvPWM_EPwm1Regs.AQCSFRC.bit.CSFB = 2;/*在 EPWM1的输出 B 上强制为连续高电平*

    DrvPWM_EPwm2Regs.AQCSFRC.bit.CSFA = 1;//在 EPWM2的输出 A 上强制一个持续低电平*

    DrvPWM_EPwm2Regs.AQCSFRC.bit.CSFB = 1;//在 EPWM2的输出 B 上强制一个持续低电平*

    DrvPWM_EPwm3Regs.AQCSFRC.bit.CSFA = 0;/*在 EPWM3的输出 A 上禁用强制*

     

    DrvPWM_EPwm3Regs.AQCTLA.bit.CAU = 2;//在递增计数时 CTR = CMPA 时设置为高电平*

    DrvPWM_EPwm3Regs.AQCTLA.bit.CAD = 1;//在倒计数时 CTR = CMPA 时设置为低电平*/此处 TI 执行 bit.zero = 1

    #endif

    DrvPWM_EPwm3Regs.CMPA.all = p_u16PWM;/* EPWM3的输出 A 上的 PWM 信号*

    DrvPWM_EPwm3Regs.AQCSFRC.bit.CSFB = 1;//在 EPWM3的输出 B 上强制一个持续低电平*

    中断;

    案例4:

    DrvPWM_EPwm1Regs.AQCSFRC.bit.CSFA = 1;//在 EPWM1的输出 A 上强制为连续低电平*

    DrvPWM_EPwm1Regs.AQCSFRC.bit.CSFB = 1;//在 EPWM1的输出 B 上强制一个持续低电平*

    DrvPWM_EPwm2Regs.AQCSFRC.bit.CSFB = 0;/*在 EPWM2的输出 B 上禁用强制*

    DrvPWM_EPwm2Regs.AQCTLB.bit.CBU = 2;//在递增计数时将 CTR = CMPB 时设置为高电平*

    DrvPWM_EPwm2Regs.AQCTLB.bit.CBD = 1;//在倒计数时将 CTR = CMPB 时设置为低电平*/此处 TI 执行 bit.zero = 1

    DrvPWM_EPwm2Regs.CMPB.all = p_u16PWM;/* EPWM2输出 B 上的 PWM 信号(Q15 -> Q0)*

    DrvPWM_EPwm2Regs.AQCSFRC.bit.CSFA = 1;//在 EPWM2的输出 A 上强制一个持续低电平*

    /**//

    DrvPWM_EPwm3Regs.AQCSFRC.bit.CSFA = 2;//在 EPWM3的输出 A 上强制设置连续高电平*

    DrvPWM_EPwm3Regs.AQCSFRC.bit.CSFB = 1;//在 EPWM3的输出 B 上强制一个持续低电平*

    中断;

    案例6:

    DrvPWM_EPwm1Regs.AQCSFRC.bit.CSFA = 0;/*在 EPWM1的输出 A 上强制禁用*

     

    DrvPWM_EPwm1Regs.AQCTLA.bit.CAU = 2;//在递增计数时 CTR = CMPA 时设置为高电平*

    DrvPWM_EPwm1Regs.AQCTLA.bit.CAD = 1;//在倒计数时 CTR = CMPA 时设置为低电平*/此处 TI 执行 bit.zero = 1

    DrvPWM_EPwm1Regs.CMPA.all = p_u16PWM;/* EPWM1输出 A 上的 PWM 信号*

    DrvPWM_EPwm1Regs.AQCSFRC.bit.CSFB = 1;//在 EPWM1的输出 B 上强制一个持续低电平*

    /**//

    DrvPWM_EPwm2Regs.AQCSFRC.bit.CSFA = 1;//在 EPWM2的输出 A 上强制一个持续低电平*

    DrvPWM_EPwm2Regs.AQCSFRC.bit.CSFB = 2;//在 EPWM2的输出 B 上强制一个连续高电平*

    /**//

    DrvPWM_EPwm3Regs.AQCSFRC.bit.CSFA = 1;//在 EPWM3的输出 A 上强制为连续低电平*

    DrvPWM_EPwm3Regs.AQCSFRC.bit.CSFB = 1;//在 EPWM3的输出 B 上强制一个持续低电平*

    }/**/

    中断;

    案例2:

    DrvPWM_EPwm1Regs.AQCSFRC.bit.CSFA = 2;//在 EPWM1的输出 A 上强制设置持续高电平*

    DrvPWM_EPwm1Regs.AQCSFRC.bit.CSFB = 1;//在 EPwm1的输出 B 上强制一个持续低电平*

    /**//

    DrvPWM_EPwm2Regs.AQCSFRC.bit.CSFA = 1;//在 EPWM2的输出 A 上强制一个持续低电平*

    DrvPWM_EPwm2Regs.AQCSFRC.bit.CSFB = 1;//在 EPWM2的输出 B 上强制一个持续低电平*

    /**//

    DrvPWM_EPwm3Regs.AQCSFRC.bit.CSFB = 0;/*在 EPWM3的输出 B 上禁用强制*

    DrvPWM_EPwm3Regs.AQCTLB.bit.CBU = 2;//在递增计数时将 CTR = CMPB 时设置为高电平*

    DrvPWM_EPwm3Regs.AQCTLB.bit.CBD = 1;//在倒计数时 CTR = CMPB 时设置为低电平*/此处 TI 执行 bit.zero = 1

    DrvPWM_EPwm3Regs.CMPB.all = p_u16PWM;/* EPWM3输出 B 上的 PWM 信号*

    DrvPWM_EPwm3Regs.AQCSFRC.bit.CSFA = 1;//在 EPWM3的输出 A 上强制为连续低电平*

    中断;

    案例3:

    DrvPWM_EPwm1Regs.AQCSFRC.bit.CSFA = 1;//在 EPWM1的输出 A 上强制为连续低电平*

    DrvPWM_EPwm1Regs.AQCSFRC.bit.CSFB = 1;//在 EPWM1的输出 B 上强制一个持续低电平*

    /**//

    DrvPWM_EPwm2Regs.AQCSFRC.bit.CSFA = 0;/*在 EPWM2的输出 A 上禁用强制*

    DrvPWM_EPwm2Regs.AQCTLA.bit.CAU = 2;//在递增计数时 CTR = CMPA 时设置为高电平*

    DrvPWM_EPwm2Regs.AQCTLA.bit.CAD = 1;//在倒计数时 CTR = CMPA 时设置为低电平*

    DrvPWM_EPwm2Regs.CMPA.all = p_u16PWM;/* EPWM2输出 A 上的 PWM 信号(Q15 -> Q0)*

    DrvPWM_EPwm2Regs.AQCSFRC.bit.CSFB = 1;//在 EPWM2的输出 A 上强制一个持续低电平*

    /**//

    DrvPWM_EPwm3Regs.AQCSFRC.bit.CSFA = 1;//在 EPWM3的输出 A 上强制为连续低电平*

    DrvPWM_EPwm3Regs.AQCSFRC.bit.CSFB = 2;/*在 EPWM3的输出 B 上强制为连续高电平*

    中断;

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

    对于 PWM1、2、GPIO 初始化相同、此处为3:

    (当然、基于 TI 代码)

    在我看来、GPIO 运行正常...

    EALLOW;

    /*禁用所选输出引脚的内部上拉电阻

    以降低功耗*/

    //用户可以启用或禁用上拉。

    //这将启用指定引脚的上拉电阻。

    GpioCtrlRegs.GPAPUD.bit.GPIO4 = 1;//禁用 GPIO4上的上拉电阻(EPWM3A)

    GpioCtrlRegs.GPAPUD.bit.GPIO5=1//禁用 GPIO5上的上拉电阻(EPWM3B)

    /*使用 GPIO 寄存器配置 EPWM-3引脚*/

    //这指定哪些可能的 GPIO 引脚将是 EPWM3功能引脚。

    //注释掉其他不需要的行。

    GpioCtrlRegs.GPAMUX1.bit.GPIO4=1//将 GPIO4配置为 EPWM3A

    GpioCtrlRegs.GPAMUX1.bit.GPIO5=1//将 GPIO5配置为 EPWM3B

    EDIS;

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [引用 userid="271481" URL"~/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1000989/tms320f28337s-trapezoidal-control-using-pwmb-output/3706004 #3706004"> TI 提供的示例是递增计数器。 我想使用 up_down。

    您需要将 TBPRD 控制寄存器配置为向上/向下计数模式。   

    [引用 userid="271481" URL"~/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1000989/tms320f28337s-trapezoidal-control-using-pwmb-output/3705998 #3705998"]   DrvPWM_EPwm1Regs.DBCTL.bit.out_mode =
       DrvPWM_EPwm2Regs.DBCTL.bit.out_mode =
       DrvPWM_EPwm3Regs.DBCTL.bit.out_mode = DB_disable;[/quot]

    为什么仅禁用最后一个 ePWM?  注意 可能会禁用全部3以完全绕过 DB、禁用的模式0可能仍会重置为默认值。  

    [引用 userid="271481" URL"~/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1000989/tms320f28337s-trapezoidal-control-using-pwmb-output/3706004 #3706004"]

    案例1:

    DrvPWM_EPwm1Regs.AQCSFRC.bit.CSFB = 0;/*在 EPWM1的输出 B 上禁用强制*

    DrvPWM_EPwm1Regs.AQCTLB.bit.CBU = 2;//在递增计数时将 CTR = CMPB 时设置为高电平*

    DrvPWM_EPwm1Regs.AQCTLB.bit.CBD = 1;//在倒计数时将 CTR = CMPB 时设置为低电平*/此处 TI 执行 bit.zero = 1

    DrvPWM_EPwm1Regs.CMPB.all = p_u16PWM;/* EPWM1输出 B 上的 PWM 信号*

    DrvPWM_EPwm1Regs.AQCSFRC.bit.CSFA = 1;//在 EPWM1的输出 A 上强制一个持续低电平*

    [/报价]

    您可以批注 ePWM 不需要执行的所有操作、只为每种情况选择1个操作。

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

    确保启用 ePWM 时钟。

    SYSCTL_enablePeripheral (SYSCTL_Periph_CLK_EPWM1);
    SYSCTL_enablePeripheral (SYSCTL_Periph_CLK_EPWM2);
    SYSCTL_enablePeripheral (SYSCTL_Periph_CLK_EPWM3);  

    [引用 userid="271481" URL"~/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1000989/tms320f28337s-trapezoidal-control-using-pwmb-output/3706075 #3706075"]对于 PWM1、2、GPIO 初始化相同、此处为3:

    GPIO 方向模式控制寄存器如何?

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

    感谢您的帮助、但目前还没有任何帮助。

    GPIO 和时钟不 是 PB。 我可以在 PWMB 上获得全高电平或全低电平、只是不执行斩波。 我可以完美地执行电机的 FOC 控制。

    就在我°在 PWM A 和 B 上执行120 μ s 的对称性和替代斩波时。 我 不会在输出 B 上被斩波、而只会在 PWMA 上得到对称斩波。  

    [引用 userid="48581" URL"~/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1000989/tms320f28337s-trapezoidal-control-using-pwmb-output/3706420 #3706420"]您可能会评论 ePWM 不需要执行的所有操作,但只为每种情况选择1个操作。

    这是从 TI C2000器件中提取的代码、我认为它应该起作用。 ;)

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [引用 userid="271481" URL"~/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1000989/tms320f28337s-trapezoidal-control-using-pwmb-output/3706439 #3706439"]GPIO 和时钟不 是 PB。 我可以在 PWMB 上获得全高电平或全低电平、只是不执行斩波。 我可以完美地执行电机的 FOC 控制。

    您到目前为止从未提及的详细信息不能很好地找到解决方案。 未在上述代码中配置 DB 控制寄存器 EPWM1或 EPWM2。 在没有启用死区的情况下运行霍尔 FOC 很容易导致击穿。

    请使用 CCS 调试查看 ePWM 寄存器、并确保配置符合您的需求。

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

    感谢您的支持、但很抱歉、您应该花点时间仔细阅读所有答案和代码。

    [引用 userid="48581" URL"~/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1000989/tms320f28337s-trapezoidal-control-using-pwmb-output/3706648 #3706648"]您从未提及的详细信息目前无法很好地找到解决方案[/quot]

    已在上一答复中包含:

    [引用 userid="271481" URL"~/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1000989/tms320f28337s-trapezoidal-control-using-pwmb-output/3700492 #3700492"]

    您  需要将相关 GPIO 配置为 PWM。

    用户4565873  已完成、FOC 控制已测试正常。

    2.禁用 ePWM 模块的死区。

    用户4565873 已完成、这使我能够获得我现在的位置… 但输出 B 上没有 PWM

    [/报价]

    用户4565873说:

    [引用 userid="271481" URL"~/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1000989/tms320f28337s-trapezoidal-control-using-pwmb-output/3705998 #3705998]DrvPWM_EPwm1Regs.DBCTL.bit.out_mode =
       DrvPWM_EPwm2Regs.DBCTL.bit.out_mode =
       DrvPWM_EPwm3Regs.DBCTL.bit.out_mode = DB_disable;[/quot]

    这允许使用相同的值对3个寄存器进行编码。

    谢谢、

    功率放大器。