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.
我已将 EPWM3配置为向上计数并通过 CMPB 上的 SOCA 触发 ADC。
CMPB 配置为立即加载模式(EPwm3Regs.CMPCTL.bit.SHDWBMODE = CC_IMMEDIATE;)
最初、我禁用了 SOCA、因此不应该进行任何转换。 此时 CMPB 为"0"。
在 ePWM 周期开始(TBCNT=0)时、在 ISR 中:
I 设置 CMPB = somevue、例如、500
I 启用 SOCA
由于 CMPB 加载模式是立即的、我的期望是 SOCA/ADC 触发将在 EPWM 周期的晚些时候在 CMPB (TBCNT=500)发生
相反、我看到的是、SOCA/ADC 触发会立即发生、
为什么 SOCA/ADC 触发立即发生?
谢谢!
尊敬的 Mark:
您需要回答的一些初始问题:
此致、
艾里森
尊敬的 Allison:
要首先回答第三个问题、我要在每次调用 ePWM ISR 时更新 CMPB。 ISR 在 TBCTR=TBPRD 下被调用。
I 从 SOCAPRD=1ST 开始、CMPB=0且 SOCAEN=0。
在第一个 ISR 上、我设置 CMPB 为500 (例如)、SOCAEN=1。 TBCTR 仍在递增。
只要我将 CMPB 设置为500 (作为示例)且 SOCAEN=1、就会触发 SOCA。 TBCTR 尚未达到500。
如果在第二个 ISR 上我将 CMPB 设置为500、则在 TBCTR = 500时按预期触发 SOCA。
我还没有尝试过不同的 SOCAPRD 值。 我明天可以这样做。
谢谢。
标记
仅供参考。。。我尝试过其他一些事情、但行为没有变化:
启动时:
EPWM SHDWBMODE = CC_IMMEDIATE
SOCAPRD =第1次
CMPB = 0
开始时 ADC TRIGSEL=0 (新)
ETSEL。 SOCAEN= 0
在第一个 PWM ISR 上:
CMPB = 500
有关。 TRIGSEL = 9 (EPWM3A SOCA)
ETCLR。 SOCA = 1 (新)
ETSEL。 SOCAEN = 1
尊敬的 Mark:
感谢您提供信息和更新。 您能否分享您的 EPWM 配置以便我来看一下?
如何进行测量以确定 SOC 的时序? (您是否能够分享一些示波器屏幕截图来显示 SOC 相对于其他信号的计时?)
此致、
艾里森
在每个 EPWM3脉冲的上升沿、都是一个 ISR (在 INTSEL = ET_CTR_PRD 处)。 为了进行调试、我在 EPWM3 ISR 中设置 GPIO2。 我在 ADC ISR 中清除 GPIO2。 对于测试、我只是将 CMPB 设置为 DUTY/2、因此 ISR 应处于高电平时间脉冲的中间。
以下是逻辑捕获:
您可以看到 GPIO2在第一个脉冲上几乎立即变为低电平、但在其他脉冲的中间变为低电平。
在第一个 EPWM3 ISR 处、CMPB 在进入时为0、而 ISR 将其设置为 DUTY/2。
如果项目有所帮助、我可以通过 PM 将其发送给您。
谢谢!
尊敬的 Mark:
感谢您提供有用的图像! 您是否能够将 CMPB 初始化为另一个值(例如500)而不是0以查看这是否与加载相关? 是的、如果您可以通过能够正常工作的 PM 发送配置!
此致、
艾里森
您好 Allison、 我将 CMPB 设定为一个非零值(应为~1500)、并且我看到相同的结果、ADC ISR 立即触发。 我还修改了项目以禁用 ADC 触发、清除 EPWM SOCA 标志、ADC INT 标志、而不进行任何更改。 我将尽量把这个项目精简为一个小示例供大家分享。
谢谢。
尊敬的 Allison:
进一步测试:
我让 CMPA 生成 EPWM 中断、而 CMPB 触发 ADC 转换、进而产生中断。
我已将 CMPA 和 CMPB 均设置为立即加载模式。
ePWM SOCA 触发器最初被禁用 ETSEL。 SOCAEN= 0
在 CMPA ISR 中、我清除任何 SOCA 标志 ETCLR。 SOCA= 1、然后启用 SOCA 触发器 ETSEL。 SOCAEN= 1
启动时、如果 CMPA = 1500且 CMPB = 3000、则会在 t=1500处看到 EPWM3/CMPA 中断、然后在 t=3000处看到 ADC ISR 中断(CMPB)。 这符合预期。
而在启动时、如果 CMPA = 3000且 CMPB = 1500、则在*第一个 PWM 周期*我会在 t=3000处看到 EPWM3/CMPA 中断、然后在 t=3000处看到 ADC ISR 中断(CMPB)。 这是意料之外的。 我期望 ADC ISR 中断会在下一个 PWM 周期的 t=1500时发生。 在第一个 PWM 周期之后、ADC ISR 会在每个新 PWM 周期的 t=1500处发生。
尊敬的 Mark:
非常感谢您的最新调查结果。 由于 CMPB < CMPA 时似乎会发生该问题 、我想可能计数器命中 CMPB 事件的标志未正确清除、因此一旦您启用 SOCA、它就会触发 ADC ISR。 很遗憾、我今天未能对此进行测试、但明天我会详细介绍并进行更新。
此致、
艾里森
仅供参考...启动时、我首先要做的是将 PWM3计数器模式设置为 TB_FREEZE。 在启动脉冲时、 我将模式设置为 TB_COUNT_UP。 在将 MODE 设置为 TB_COUNT_UP 之前设置断点后、ADC 不会显示触发标志(ADCSOCFLG1为零)或溢出标志(ADCSOCOVF1为零)、并且 EPWM3 ETFLG 为零。 因此、ADC 转换似乎没有触发等待。
尊敬的 Mark:
仍然在查看代码、但 认为我也想问您是否已经在 C2000Ware 中引用 ADCSOC 示例-如果您要查看 {C2000Ware}\device_support\f2802x\examples\structs\adc_soc 或在 DINT 处实现一些初始化、可能更容易使用此示例隔离问题; PIE 初始化在那里进行是彻底的。
另一个想法是、您可以尝试在稍后的代码(ePWM ISR)中将 ADC 中断使能更改为其他内容吗?
此致、
艾里森