工具与软件:
我将 ePWM 频率设置为16kHz、然后将其切换至8kHz。
我在影子模式下设置 PRD 负载、 在影子模式下设置 CMPA 负载、并且 EPwmRegs.CMPCTL.bit.LOADAMODE = 0x02、在 CNT = ZERO 和 PRD 中加载 CMPA。
当 CNT=CMPAU 时、我将 ePWM 输出设定为高电平、当 CNT=CMPAD 时、输出为低电平。
我在16kHz 的中断内运行程序、然后在中断服务例程中更新 PRD 值和 CMPA 值。 我的 CMPA 值始终获取 PRD 值的一半。 代码的运行时序列大致如下图。所示
如果图像不清楚,让我解释一下: 顶行表示固定的中断触发时间(16kHz)。 下面的两个垂直箭头表示代码的近似执行位置:首先更改 PRD 值(从12500更改为6250)、然后计算新的 CMPA 值(从6250更改为3125)。 在两个箭头之前、PWM 波形为16kHz、占空比为50%。 在两个箭头后面、PWM 切换到占空比为50%的8kHz 波形。 第二行是计数器(CNT)值。 第三行是预期的 EPWM 波形。 第四行是示波器捕获的实际波形。
在代码执行开关的周期(箭头所在的周期)中、我设置了 PRD=12500、设置了 CMPA=0.5*PRD。 由于影子寄存器的作用、它们将在下一个周期中生效。 因此、在箭头所在的周期内、当 CNT=3125时、PWM 输出从低电平切换到高电平、当 CNT=6250时、我预计输出会 保持高电平、直到 CNT 回落到3125。 不过、我测得 ePWM 高电平时间是预期持续时间的一半、仅为25%、当 CNT = 6250时、看起来 PWM 输出为低电平。 为什么会发生这种情况?