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.

[参考译文] TMS320F28335:使用 PWM-SYNC 时出现零星的 PWM 中断

Guru**** 2611705 points


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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1574160/tms320f28335-sporadic-pwm-interrupts-when-using-pwm-sync

器件型号:TMS320F28335


工具/软件:

大家好、我正在努力解决一些问题、因为有些日子、也许有人会给我一个提示。

我们使用 2 个通过光缆连接的 F28335 来同步 PWM 计时器。 该光线由一个光电二极管通过逆变器接收并连接到 GPIO6。

我们遇到的是一些奇怪的行为:

*光电二极管和逆变器为 GPIO6(同步输入)生成非常好的信号, 仍然有零星的 PWM 中断
* PWM 中断被配置为 CNT=零,但在这些零星的中断期间检查计数器时,它远高于零
*禁用全部同步输入时,中断仍然存在(在 PWM 外设以及 GPIO 配置中)
*他们仍然有一些连接到 Sync-in,因为根据使用的(光缆),他们看起来或多或少(或根本不与一些电缆)。

我不理解的是、即使明显不满足配置的条件((CTR =零)、如何触发 PWM 中断、如何找到原因?
另外、 当 GPIO6 没有显示任何位置外信号的迹象时、为什么中断的发生会根据同步输入电缆而变化?

我为 EPwm1 添加了 PWM-config、如果您需要有关我的配置的任何更多详细信息、请告诉我。

EPwm1Regs.TBCTL.bit.CTRMODE = TB_COUNT_UPDOWN; //2
EPwm1Regs.TBCTL.bit.PHSEN = TB_ENABLE; //1
EPwm1Regs.TBCTL.bit.HSPCLKDIV = TB_DIV1; //0
EPwm1Regs.TBCTL.bit.CLKDIV = TB_DIV1; //0
 EPwm1Regs.TBCTL.bit.PRDLD = TB_IMMEDIATE; //1
EPwm1Regs.TBCTL.bit.SYNCOSEL = TB_CTR_ZERO; //1
EPwm1Regs.TBCTL.bit.PHSDIR = TB_UP; //1
EPwm1Regs.TBCTL.bit.SWFSYNC = 0; 

EPwm1Regs.TBPHS.half.TBPHS = 0x0000; 
EPwm1Regs.TBPRD = 4600;
EPwm1Regs.TBCTR = 0x0000;

EPwm1Regs.CMPA.half.CMPA = 0;
EPwm1Regs.CMPB = 0;

EPwm1Regs.CMPCTL.bit.SHDWAMODE = CC_IMMEDIATE; //1
EPwm1Regs.CMPCTL.bit.LOADAMODE = CC_CTR_ZERO; //1
EPwm1Regs.CMPCTL.bit.SHDWBMODE = CC_IMMEDIATE; //1
EPwm1Regs.CMPCTL.bit.LOADBMODE = CC_CTR_ZERO; //1

EPwm1Regs.AQCTLA.bit.ZRO = 0;
EPwm1Regs.AQCTLA.bit.PRD = 0;
EPwm1Regs.AQCTLA.bit.CAU = 0;
EPwm1Regs.AQCTLA.bit.CAD = 0;
EPwm1Regs.AQCTLA.bit.CBU = 0;
EPwm1Regs.AQCTLA.bit.CBD = 0;

EPwm1Regs.AQCTLB.bit.ZRO = 0;
EPwm1Regs.AQCTLB.bit.PRD = 0;
EPwm1Regs.AQCTLB.bit.CAU = 0;
EPwm1Regs.AQCTLB.bit.CAD = 0;
EPwm1Regs.AQCTLB.bit.CBU = 0;
EPwm1Regs.AQCTLB.bit.CBD = 0;

EPwm1Regs.ETSEL.bit.INTSEL = ET_CTR_ZERO; //1
EPwm1Regs.ETSEL.bit.INTEN  = INT_ON; //1
Pwm1Regs.ETPS.bit.INTPRD  = 1;

EPwm1Regs.ETSEL.bit.SOCAEN = INT_ON; //1
EPwm1Regs.ETSEL.bit.SOCASEL = ET_CTR_ZERO; //1
EPwm1Regs.ETSEL.bit.SOCBEN = INT_OFF; //0
EPwm1Regs.ETSEL.bit.SOCBSEL = ET_CTR_ZERO; //1
EPwm1Regs.ETPS.bit.SOCACNT = 1;
EPwm1Regs.ETPS.bit.SOCAPRD = 1;
EPwm1Regs.ETPS.bit.SOCBPRD = 1;
EPwm1Regs.ETPS.bit.SOCBCNT = 1;

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

    您好:

    我将及时查看和答复。

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

    感谢您的答复、我们已经同时找到了一些内容。

    中断看起来几乎同时发生(稍后的中断会延迟)、这意味着 Sync-in 可能会根据电缆质量产生一些抖动、因此事件 CTR = ZERO 会在很短的时间内发生两次(一次实际计数到零,然后再次使用 Sync-in)。

    一般性建议如何处理此类问题、在这种情况下、当 Sync-in 也将 CTR 设置为零时、建议不要将中断置于 CTR =零上? 一种选择可能是在 CTR =时简单地触发中断 以确保同步输入以前发生过。

    BR
    Michael

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

    您好:

    您可以根据所选的事件来触发中断、 具体方法如下:www.ti.com/.../sprui07.pdf。 您可以参考器件 TRM 第 272 页

    您可以使用 CMPA 值触发它、并将其设置为较小的值、以避免 TBCTR = 0 上发生冲突。