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.

[参考译文] TMS320F28069:PWM 设置问题

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/600947/tms320f28069-pwm-setup-problem

器件型号:TMS320F28069

感谢您查看此内容...

我有工作中的硬件和软件、并希望在现有的 PWM 中添加4个新的 PWM。  ePWM1B 当前已配置并正常工作。  我尝试添加 ePWM2A 和其他器件。

使用80引脚部件、ePWM1配置为使用引脚68。  通过调用 main()中的以下函数来设置它:

空 InitEPwm1BGpio (空)

  EALLOW;

/*禁用所选输出引脚的内部上拉电阻
  以降低功耗*/
   GpioCtrlRegs.GPAPUD.bit.GPIO1=1;    

/*使用 GPIO 寄存器配置 ePWM-1引脚*/
   GpioCtrlRegs.GPAMUX1.bit.GPIO1=1;   

   EDIS;

因此,我复制了此函数(如下所示)以及来自 main()的相应调用:

空 InitEPwm2AGpio (空)

  EALLOW;

/*禁用所选输出引脚的内部上拉电阻
  以降低功耗*/
   GpioCtrlRegs.GPAPUD.bit.GPIO2 = 1;    

/*使用 GPIO 寄存器配置 EPWM-2引脚*/
   GpioCtrlRegs.GPAMUX1.bit.GPIO2 = 1;   

   EDIS;


我可以在内存浏览器中看到上述内容按预期工作。  这些设置会找到正确的存储器位置。

我遇到的问题是设置过程的下一步。

在上述函数完成其工作后,正在从 main()调用的以下函数中设置 ePWM1B:

空 InitEPwm (uint16周期)

  EPwm1Regs.TBCTL.bit.CLKDIV = TB_DIV1;          
  EPwm1Regs.TBCTL.bit.HSPCLKDIV = TB_HSP_DIV1;
  EPwm1Regs.TBCTL.bit.CTRMODE = TB_COUNT_UP;    
  EPwm1Regs.TBPHS.ALL = 0;                      
  EPwm1Regs.TBCTR = 0;                         
  EPwm1Regs.TBCTL.bit.PHSEN = TB_DISABLE;          
  EPwm1Regs.TBCTL.bit.PRDLD = TB_SHADOW;          
  EPwm1Regs.TBCTL.bit.SYNCOSEL = TB_SYNC_DISABLE;    

  /*
   * PWM 频率= TBCLK /(1 + TBPRD)
   *
  EPwm1Regs.TBPRD =周期;
  EPwm1Regs.CMPB =周期/2;
  EPwm1Regs.CMPCTL.bit.SHDWBMODE = CC_SHADOW;       
  EPwm1Regs.AQCTLB.bit.ZRO = AQ_SET;
  EPwm1Regs.AQCTLB.bit.CBU = AQ_CLEAR;

  EPwm2Regs.TBCTL.bit.CLKDIV = TB_DIV1;
  EPwm2Regs.TBCTL.bit.HSPCLKDIV = TB_HSP_DIV1;
  EPwm2Regs.TBCTL.bit.CTRMODE = TB_COUNT_UP;
  EPwm2Regs.TBPHS.ALL = 0;
  EPwm2Regs.TBCTR = 0;
  EPwm2Regs.TBCTL.bit.PHSEN = TB_DISABLE;
  EPwm2Regs.TBCTL.bit.PRDLD = TB_SHADOW;
  EPwm2Regs.TBCTL.bit.SYNCOSEL = TB_SYNC_DISABLE;

  /*
   * PWM 频率= TBCLK /(1 + TBPRD)
   *
  EPwm2Regs.TBPRD =周期;
  EPwm2Regs.CMPB =周期/2;
  EPwm2Regs.CMPCTL.bit.SHDWBMODE = CC_SHADOW;
  EPwm2Regs.AQCTLB.bit.ZRO = AQ_SET;
  EPwm2Regs.AQCTLB.bit.CBU = AQ_CLEAR;

通过单步执行这个函数、我确认了被插入 ePWM1B 结构中的值将使其在所需的位置。

这里是我迷路的地方;当我单步执行应该更新 ePWM2A 结构的行时、这些值保持不变。  它们似乎都以零开始使用、当一行代码断言从零变为"3"时、如"EPwm2Regs.TBCTL.bit.SYNCOSEL=TB_SYNC_DISABLE"所示、更改将被忽略。  "EPwm2Regs.TBCTL.bit.SYNCOSEL"的值保持为零。  (常数"TB_SYNC_DISABLE"定义为3。)

我尝试使用 ePWM7A、结果相同。  我认为这些寄存器可能位于受保护的存储器中、但我找不到任何文档来说明这一点。  我尝试将它们封附在 EALLOW 和 EDIS 中、但它没有帮助。

设置"A" PWM 与"B"的方法是否不同?  我尝试使用'A'、因为频率控制可能需要更高的分辨率。

我感觉自己犯了业余的错误、但我只是看不到它。

有人可以帮帮我吗?

谢谢、

Robin

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

    你好。

    您是否在"main"的开头调用了"InitSysCtrl()"? 我不确定 F28069、但在某些 MCU 中、您无法设置外设、除非您设置外设时钟。

    另一个问题:您是否尝试运行此代码而不是单步执行? 如果启用了优化(在编译器设置中)、则步进会产生怪异的作用。

    此外、您还可以在调试期间尝试更改"Expressions"或"Registers"窗口中的寄存器。 在本例中是否应用了这些更改?

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

    尊敬的 Disona:

    感谢您的回复。  您的建议帮助我解决了 ePWM 设置中的下一个问题。

    是的、我在"main()"中调用了"InitSysCtrl()"、但它没有包含用于在 EPWM2上启用时钟的代码。  我无法从"Expressions"窗口中更改值、但在添加相应的代码以在 EPWM2上启用时钟后、我可以看到所有参数都按预期设置、适用于新添加的 PWM。  我甚至可以看到计数器正在运行。

    但是、输出引脚不会切换。  我已确保将该引脚正确分配给 PWM 功能。  我还将输出重新配置为 GPIO、并在代码中对其进行切换、以证明输出在示波器上进行切换。  因此、我知道示波器位于右侧引脚上、并且我知道、当我将引脚重新配置 为连接到 ePWM2时、GPIO 切换代码不会影响该引脚上的输出。

    我通过在"SysCtrlRegs.PCLKCR1.bit.EPWM2ENCLK"中的"Expressions"窗口中查看来确认 ePWM2上的时钟已启用。

    我已经在 eWPM2A 和 ePWM3B 上完成了这个练习。  我将参数设置与一直在工作的 ePWM1B 进行比较、但我看不到任何明显的问题。  实际上、我从 ePWM1设置复制/粘贴。  无论如何、我可以在寄存器中看到、所有内容似乎都已正确设置。

    我一直在扫描文档、但在该部件上没有找到与 ePWM 设置特别相关的任何内容。

    还有其他想法吗?

    谢谢、

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

    我很高兴我的回答对您有所帮助。

    嗯、我有一个想法。 如果您执行的代码是第一个代码、请仔细查看 AQCTL 初始化代码:

    EPwm2Regs.TBPRD =周期;
    EPwm2Regs.CMPB =周期/2;
    EPwm2Regs.CMPCTL.bit.SHDMODE = CC_SHADDow;
    EPwm2Regs.AQCTLB.bit.ZRO = AQ_SET;EPwm2Regs.AQCTLB.bit.CBWBU
    =清除 

    您希望控制 EPwm2A 通道、但您需要初始化 AQCTLB。  我认为这就是问题所在。

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

    尊敬的 Disona:

    现在、它都能正常工作。

    首先、您让我犯了不为每个 PWM 启用时钟的错误、然后您了解了 A 和 B 输出的单独操作限定符寄存器。

    我们可以将这个标记为已回答。

    非常感谢您的宝贵帮助!

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

    我真的很高兴我能提供帮助=)