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.
感谢您查看此内容...
我有工作中的硬件和软件、并希望在现有的 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 输出的单独操作限定符寄存器。
我们可以将这个标记为已回答。
非常感谢您的宝贵帮助!
我真的很高兴我能提供帮助=)