感谢您查看此内容...
我有工作中的硬件和软件、并希望在现有的 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