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.

[参考译文] TMS320F28377D:使用 CMPA 和 CMPB 的 HRPWM

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/926663/tms320f28377d-hrpwm-using-cmpa-and-cmpb

器件型号:TMS320F28377D

这让我有点失望、如果您需要更多信息、请告诉我、我会尽量保持简洁。 感谢你的帮助。

我在高分辨率模式下使用 ePWM。 ePWM 以递增计数的方式设置、并将 CMPA 用于一个触发器、而 CMPB 用于另一个触发器。 我一直在比较一个 ePWM 和另一个 ePWM (5&6)、并获得一些非常奇怪的结果这里没有使用死区时间来确保不会在那里发生混乱。 我已经查看了 ePWM 寄存器、它们看起来是正确的。 对于 EPWM1、CALPWRON 设置为1、HRMSTEP 设置为67 (所有其他 ePWM 为0) 、我使用 EPWM5作为基准、然后将由 CMPA 控制的 B 通道(下部开关)的上升沿与 EPWM6中的上升沿进行比较。 这也是在下降沿完成的。 ePWM 时钟为100MHz。  

正如您在以下数据中看到的、下降延迟与 CMPA 之间的关系就好像高分辨率未激活一样。

但是、上升沿延迟与 CPMB 之间的关系看起来正常、但似乎与下降沿之间存在一些相互作用、这很奇怪。

我可以分享几个屏幕截图、但不确定如何做到。

这是设置代码


   //##########  EPWM5
   EALLOW;
   //假设 ePWM 时钟已启用
   EPwm5Regs.TBPRD                =  PWM_TBPRD;         //设置 ePWMx 的周期
   EPwm5Regs.TBCTR                =  0x0000;            //清除计数器
   EPwm5Regs.TBCTL.bit.CLKDIV     =  TB_DIV1;           //时基时钟预分频位
   EPwm5Regs.TBCTL.bit.HSPCLKDIV  =  TB_DIV1;           //高速时基时钟预分频位
   EPwm5Regs.TBCTL.bit.SYNCOSEL   =  TB_SYNC_IN;        // ePWMx 是一个"从器件"、同步直通
   EPwm5Regs.TBCTL.bit.PHSEN      =  TB_ENABLE;         // ePWMx 是一个"从器件"、在 SYNC 上从 TBPHS 加载时间度计数器
   EPwm5Regs.TBPHS.bit.TBPHS      =  0x0000;            //初始化相移
   EPwm5Regs.TBCTL.bit.CTRMODE    =  TB_COUNT_UP;       //向上计数模式
   EPwm5Regs.CMPA.bit.CMPAHR      =  0;                 //初始化 HRPWM 扩展
   EPwm5Regs.CMPB.bit.CMPBHR      =  0;                 //初始化 HRPWM 扩展
   EPwm5Regs.CMPCTL.bit.SHDWAMODE =  CC_SHADODE;         // CmpA 影子模式
   EPwm5Regs.CMPCTL.bit.SHDWBMODE =  CC_SHADOW;         // CMPB 影子模式
   EPwm5Regs.CMPCTL.bit.LOADBMODE =  CC_CTR_ZERO;       //载波底部的负载(用于递增计数)
   EPwm5Regs.CMPCTL.bit.LOADAMODE =  CC_CTR_ZERO;       //在载波底部加载(用于递增计数)

   //为 A 和 B 比较寄存器设置比较
   EPwm5Regs.AQCTLA.bit.CAU       =  AQ_SET;            //在比较 A 向上时打开上部开关
   EPwm5Regs.AQCTLA.bit.CBU       =  AQ_CLEAR;          //在比较 B 向上时关闭上部开关
   EPwm5Regs.AQCTLB.bit.CAU       =  AQ_CLEAR;          //在比较 A 向上时关闭下部开关
   EPwm5Regs.AQCTLB.bit.CBU       =  AQ_SET;            // 在比较 B 向上时打开较低的开关

//   EPwm5Regs.TZSEL.bit.OSHT1      =  0;                 //禁用 TZ1作为单次触发源
   EPwm5Regs.TZSEL.bit.OSHT1      =  1;                 //启用 TZ1作为单次触发源
//   EPwm5Regs.TZSEL.bit.OSHT2      =  0;                 //禁用 TZ2作为单次触发源
   EPwm5Regs.TZSEL.bit.OSHT2      =  1;                 //启用 TZ2作为单次触发源
//   EPwm5Regs.TZSEL.bit.OSHT3      =  0;                 //禁用 TZ3作为单次触发源
   EPwm5Regs.TZSEL.bit.OSHT3      =  1;                 //启用 TZ3作为单次触发源
   EPwm5Regs.TZSEL.bit.OSHT6      =  1;                 //启用 TZ6作为单次触发源,以防止仿真停止期间发生击穿(暂停、复位、重新编程)
   EPwm5Regs.TZCTL.bit.TZA        =  TZ_FORCE_LO;       // TZ1强制输出低电平
   EPwm5Regs.TZCTL.bit.TSB        =  TZ_FORCE_LO;       // TZ1强制 B 输出低电平
   EPwm5Regs.TZEINT.BIT.OST       =  1;                 //启用 TZ 中断

   EPwm5Regs.HRCNFG.ALL           = 0x0;                 //复位 HRCNFG
   EPwm5Regs.HRCNFG.bit.EDGMODE   = HR_BEP;  //HR_REP;  //HR_FEP;              //下降沿 DAP 上的 MEP 控制
   EPwm5Regs.HRCNFG.bit.EDGMODEB  = HR_BEP;  //HR_FEP;  //HR_REP;              //上升沿  DAP 上的 MEP 控制
   EPwm5Regs.HRCNFG.bit.HRLOAD    = HR_CTR_ZERO;         //在载波底部加载(用于递增计数)
   EPwm5Regs.HRCNFG.bit.HRLOADB   = HR_CTR_ZERO;         //在载波底部加载(用于递增计数)
   EPwm5Regs.HRCNFG.bit.AUTOCONV  = 0x1;                 //启用基于 MEP_ScaleFactor 的 CMPAHR 自动缩放。 启用此选项后、CMPAHR 仅为[0x0000 0xFF00]。
   EDIS;

   //##########  EPWM6
   EALLOW;
   //假设 ePWM 时钟已启用
   EPwm6Regs.TBPRD                =  PWM_TBPRD;         //设置 ePWMx 的周期
   EPwm6Regs.TBCTR                =  0x0000;            //清除计数器
   EPwm6Regs.TBCTL.bit.CLKDIV     =  TB_DIV1;           //时基时钟预分频位
   EPwm6Regs.TBCTL.bit.HSPCLKDIV  =  TB_DIV1;           //高速时基时钟预分频位
   EPwm6Regs.TBCTL.bit.SYNCOSEL   =  TB_SYNC_IN;        // ePWMx 是一个"从器件"、同步直通
   EPwm6Regs.TBCTL.bit.PHSEN      =  TB_ENABLE;         // ePWMx 是一个"从器件"、在 SYNC 上从 TBPHS 加载时间度计数器
   EPwm6Regs.TBPHS.bit.TBPHS      =  0x0000;            //初始化相移
   EPwm6Regs.TBCTL.bit.CTRMODE    =  TB_COUNT_UP;       //向上计数模式
   EPwm6Regs.CMPA.bit.CMPAHR      =  0;                 //初始化 HRPWM 扩展
   EPwm6Regs.CMPB.bit.CMPBHR      =  0;                 //初始化 HRPWM 扩展
   EPwm6Regs.CMPCTL.bit.SHDWAMODE =  CC_SHADODE;         // CmpA 影子模式
   EPwm6Regs.CMPCTL.bit.SHDWBMODE =  CC_SHADOW;         // CMPB 影子模式
   EPwm6Regs.CMPCTL.bit.LOADBMODE =  CC_CTR_ZERO;       //载波底部的负载(用于递增计数)
   EPwm6Regs.CMPCTL.bit.LOADAMODE =  CC_CTR_ZERO;       //载波底部的负载(用于递增计数)

   //为 A 和 B 比较寄存器设置比较
   EPwm6Regs.AQCTLA.bit.CAU       =  AQ_SET;            //在比较 A 向上时打开上部开关
   EPwm6Regs.AQCTLA.bit.CBU       =  AQ_CLEAR;          //在比较 B 向上时关闭上部开关
   EPwm6Regs.AQCTLB.bit.CAU       =  AQ_CLEAR;          //在比较 A 向上时关闭下部开关
   EPwm6Regs.AQCTLB.bit.CBU       =  AQ_SET;            //在比较 B 向上时打开较低的开关

//   EPwm6Regs.TZSEL.bit.OSHT1      =  0;                 //禁用 TZ1作为单次触发源
   EPwm6Regs.TZSEL.bit.OSHT1      =  1;                 //启用 TZ1作为单次触发源
//   EPwm6Regs.TZSEL.bit.OSHT2      =  0;                 //禁用 TZ2作为单次触发源
   EPwm6Regs.TZSEL.bit.OSHT2      =  1;                 //启用 TZ2作为单次触发源
//   EPwm6Regs.TZSEL.bit.OSHT3      =  0;                 //禁用 TZ3作为单次触发源
   EPwm6Regs.TZSEL.bit.OSHT3      =  1;                 //启用 TZ3作为单次触发源
   EPwm6Regs.TZSEL.bit.OSHT6      =  1;                 //启用 TZ6作为单次触发源,以防止仿真停止期间发生击穿(暂停、复位、重新编程)
   EPwm6Regs.TZCTL.bit.TZA        =  TZ_FORCE_LO;       // TZ1强制输出低电平
   EPwm6Regs.TZCTL.bit.TSB        =  TZ_FORCE_LO;       // TZ1强制 B 输出低电平
   EPwm6Regs.TZEINT.BIT.OST       =  1;                 //启用 TZ 中断

   EPwm6Regs.HRCNFG.ALL           = 0x0;                 //复位 HRCNFG
   EPwm6Regs.HRCNFG.bit.EDGMODE   = HR_BEP;  //HR_REP;  //HR_FEP;              //下降沿  DAP 上的 MEP 控制
   EPwm6Regs.HRCNFG.bit.EDGMODEB  = HR_BEP;  //HR_FEP;  //HR_REP;              //上升沿  DAP 上的 MEP 控制
   EPwm6Regs.HRCNFG.bit.HRLOAD    = HR_CTR_ZERO;         //在载波底部加载(用于递增计数)
   EPwm6Regs.HRCNFG.bit.HRLOADB   = HR_CTR_ZERO;         //在载波底部加载(用于递增计数)
   EPwm6Regs.HRCNFG.bit.AUTOCONV  = 0x1;                 //启用基于 MEP_ScaleFactor 的 CMPAHR 自动缩放。 启用此选项后、CMPAHR 仅为[0x0000 0xFF00]。
   EDIS;

下面是结果、我尝试附加图形、但不太幸运。

延迟 NS 下降 延迟 NS 上升 5 CMPA 5 CMPB 6 CMPA 6 CMPB
0 0 0x04DB4000 0x04E7BF00 0x04DB4000 0x04E7BF00
0 0 0x04DB4000 0x04E7BF00 0x04DB6000 0x04E7BF00
0 0 0x04DB4000 0x04E7BF00 0x04DBC000 0x04E7BF00
0 0 0x04DB4000 0x04E7BF00 0x04DBE000 0x04E7BF00
0 0 0x04DB4000 0x04E7BF00 0x04DBFF00 0x04E7BF00
10. 0 0x04DB4000 0x04E7BF00 0x04DC0000 0x04E7BF00
10. 0 0x04DB4000 0x04E7BF00 0x04DC4000 0x04E7BF00
10. 0 0x04DB4001 0x04E7BF01 0x04DCFF00 0x04E7BF01
20. 0 0x04DB4000 0x04E7BF00 0x04DD0000 0x04E7BF00
延迟 NS 下降 延迟 NS 上升 5 CMPA 5 CMPB 6 CMPA 6 CMPB
0 0 0x04DB4000 0x04E7BF00 0x04DB4000 0x04E7BF00
1 1 0x04DB4000 0x04E7BF00 0x04DB4000 0x04E7DF00
1.5 2. 0x04DB4000 0x04E7BF00 0x04DB4000 0x04E7FF00
-2. 5. 0x04DB4000 0x04E7BF00 0x04DB4000 0x04E83F00
-1.5 6.5. 0x04DB4000 0x04E7BF00 0x04DB4000 0x04E85F00
-1 7.5. 0x04DB4000 0x04E7BF00 0x04DB4000 0x04E87F00
-0.5 9. 0x04DB4000 0x04E7BF00 0x04DB4000 0x04E89F00
0 10. 0x04DB4000 0x04E7BF00 0x04DB4000 0x04E8BF00
1 12.5. 0x04DB4000 0x04E7BF00 0x04DB4000 0x04E8FF00

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

    不应配置 CALPWRON 寄存器。 为什么要启用它? 您是否还没有使用 SFO 库?

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

    感谢 Nima 的回应、

    CALPWRON 不在代码中的任何位置使用(进行了控制 h 搜索)、并且是的、定期调用 SFO 例程。 (虽然 SPRUHM8I 指示它复位为0、所以必须在某个位置设置)当 我访问这些寄存器时、"EPWM1 CALPWRON 被设置为1且 HRMSTEP 为67"语句来自调试器。 表中的数据也来自调试器。 我试图获取尽可能多的独立于软件的数据。

        Dave

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

    我编写此示例是为了快速检查、当我使用 HR 模块时、我在所有 ePWM 模块上都获得相同的延迟。

    是这样吗?

    //为 A 和 B 比较寄存器设置比较
    EPwm6Regs.AQCTLA.bit.CAU = AQ_SET; //在比较 A 向上时打开上开关
    EPwm6Regs.AQCTLA.bit.CBU = AQ_CLEAR; //在比较 B 向上时关闭上开关
    EPwm6Regs.AQCTLB.bit.CAU = AQ_CLEAR; //在比较 A 向上时关闭下降开关
    EPwm6Regs.AQCTLB.bit.CBU = AQ_SET; //在比较 B 向上时打开下开关 

    因为如果你使用 HRPWM、你想要:

    如果使用向上计数、则使用 PRD/ZERO 执行操作、使用 CMPA 执行通道 A 的另一个操作

    或与 CMPB 相同的其他通道。

    您不想在同一信道上使用 CMPA 和 CMPB。

    2.如果使用向上/向下计数、则对通道 A 使用 CMPAU 和 CMPAD

    或者通道 B 的 CMPBU 和 CMPBD 也是如此

    NIMA

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

    谢谢 Nima、

    我有点困惑…

    您引用的示例是否实际起作用? 如果是这样、下一条关于同一通道上的 CMPA 和 CMPB 不工作的评论毫无意义。

    我们进行相移的方法需要同时使用 CMPA 和 CMPB、如果您找到了一种使其正常工作的方法、那就很好了。

     再次感谢

                 Dave

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

    还有一件事 Nima、

    我已经尝试找到一些有关如何实现 HRPWM 的文档。 在我发现的所有文档中、我会一直返回到专门针对该器件的 SPRUHM8I。 HRPWM 延迟似乎被添加到死区或 tripzone 逻辑的某个位置、但并不清楚。 如果有一个文档对此进行了更详细的解释、这将有助于我理解。

             再次感谢 Nima、

                     Dave

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

    你好、Nima、

    已经一周了、是否有任何更新?

      Dave

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

    我提供的示例使用 CMPA U/D 事件来控制通道 A

    用于控制通道 B 的 CMPB U/D 事件

    您应该能够更新 PWM 生成算法、以便对 HRWPM 执行同样的操作。  

    在本例中、CMPAHR 将添加到通道 A 上的 CMPA 中。 CMPBHR 与 CMPB 和通道 B 也是如此

    就添加 HR 部分的位置而言、它会添加到动作限定器模块之后、并在 ePWM 输出中考虑死区、斩波器和跳匣区域的影响。

    NIMA

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

    再次感谢 Nima 的回应、

    我真的不能错过任何东西。 作为修复程序显示的代码与我使用的代码完全相同

       //为 A 和 B 比较寄存器设置比较、作为 EPWM5的补充
       EPwm6Regs.AQCTLA.bit.CAU       =  AQ_SET;            //在比较 A 向上时打开上部开关
       EPwm6Regs.AQCTLA.bit.CBU       =  AQ_CLEAR;          //在比较 B 向上时关闭上部开关
       EPwm6Regs.AQCTLB.bit.CAU       =  AQ_CLEAR;          //在比较 A 向上时关闭下部开关
       EPwm6Regs.AQCTLB.bit.CBU       =  AQ_SET;            //在比较 B 向上时打开较低的开关

    那么、如果我将计数器寄存器设置为向上/向下计数、这是否起作用?  

           Dave

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

    David、

    这是您真正想要的:

      EPwm6Regs.AQCTLA.bit.CAU       =  AQ_SET;            //在比较 A 向上时打开上部开关
       EPwm6Regs.AQCTLA.bit.CAD     =  AQ_CLEAR;          //在比较 B 向上时关闭上部开关
       EPwm6Regs.AQCTLB.bit.CBU       =  AQ_CLEAR;          //在比较 A 向上时关闭下部开关
       EPwm6Regs.AQCTLB.bit.CBD     =  AQ_SET;            //在比较 B 向上时打开下部开关

    您需要将通道连接到 CHANNELx 与 CMPx 和 CMPxHR (x =A 或 B)

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

    再次感谢 Nima、

    有时候,我很难明白。 当我发现 CMPA 和 CMPB 与计数器进行比较、并且 CMPAHR 和 CMPBHR 分别是通道 A 和 B 的延迟时、我就能使其正常工作。 基本上必须将 CMPA 从 CMPAHR 中去耦、同样对于 CMPB/CMPBHR 也是如此。 由于我将 CHA 和 CHB 用于桥臂中的上/下开关、CMPAHR 和 CMPBHR 必须相同。

        BR

                 Dave

x 出现错误。请重试或与管理员联系。