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.

[参考译文] TMS320F28069:虽然持续高电平输出强制被启用、ePWM 信号在一段时间内变得低电平的问题

Guru**** 2589245 points


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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/939567/tms320f28069-issue-with-epwm-signal-getting-low-for-some-period-although-continuous-high-output-forcing-is-enabled

器件型号:TMS320F28069

您好!

在初始化期间、我希望 EPWM 信号持续为高电平、然后当发生中断时、我希望禁用强制并根据 CMPA 寄存器中更新的值生成 PWM。 为了持续强制输出高电平、我将 AQCSFRC 寄存器0x2的 CSFB 位置为有效位、因为 ePWM6的 B 通道需要输出。 然后、一旦产生中断、我就通过使 CSFB 位为0x0并更新 CMPA 寄存器来禁用强制。 我面临的问题是、初始化期间持续高电平信号与根据 CMPA 寄存器值生成的 PWM 之间存在36ms 的低电平周期 、这是不可取的。 我 无法弄清为什么这么长的这段短时间的这段时间是介于两者之间的。 我使用的 PWM 频率为12kHz。 下面是 PWM 波形的代码和快照。 在图中、蓝色信号在 ePWM 引脚上输出。

int main()
{
InitSysCtrl();
DINT;
InitPieCtrl();
IER = 0x0000;
IFR = 0x0000;
InitPieVectTable();
memcpy (&RamfuncsRunStart、&RamfuncsLoadStart、(uint32)&RamfuncsLoadSize);
InitFlash();
EALLOW;
SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC=0;
EDIS;

EPwm6Regs.TBPHS.Halt.TBPHS = 0; //将相位寄存器设置为零
EPwm6Regs.TBCTL.bit.CTRMODE = TB_COUNT_UPDOWN;//对称模式
EPwm6Regs.TBCTL.bit.PHSEN = TB_disable; //主机模块
EPwm6Regs.TBCTL.bit.PRDLD = TB_SHADOW; //加载影子
EPwm6Regs.TBCTL.bit.SYNCOSEL = TB_SYNC_IN; //同步下流模块
EPwm6Regs.AQSFRC.bit.RLDSF = 3;
EPwm6Regs.CMPCTL.bit.SHDWAMODE = CC_SHADOW;
EPwm6Regs.CMPCTL.bit.SHDWBMODE = CC_SHADOW;
EPwm6Regs.CMPCTL.bit.LOADAMODE = CC_CTR_ZERO; // CTR 上的负载=零
EPwm6Regs.CMPCTL.bit.LOADBMODE = CC_CTR_ZERO; // CTR 上的负载=零
EPwm6Regs.AQCTLB.bit.CAU = AQ_SET; //设置 EPWM6B 的操作
EPwm6Regs.AQCTLB.bit.CAD = AQ_CLEAR;
EPwm6Regs.DBCTL.ALL = DB_DISABLE;
EPwm6Regs.ETSEL.bit.INTEN = 1; //中断使能
EPwm6Regs.ETSEL.bit.INTSEL = 1;当定时器基址计数器等于零时、// Tnterrupt 触发
EPwm6Regs.ETPS.bit.INTPRD = 1;
EPwm6Regs.TBCTR = 0;
EPwm6Regs.AQCSFRC.bit.CSFB = 2; //在输出 B 上强制 A 持续为高电平
EPwm6Regs.TBPRD =周期值;
EPwm6Regs.CMPA.half-CMPA = periodValHalf;
EPwm6Regs.TBCTL.bit.CLKDIV = clkDiv;
EALLOW;
PieCtrlRegs.PIEACX.ALL = PIEACK_Group3;
SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC=1;
EDIS;

EINT;//启用全局中断 INTM
ERTM;//启用全局实时中断 DBGM
}

void epwm6_isr ()
{
EPwm6Regs.ETCLR.bit.INT = 1;

EPwm6Regs.AQCSFRC.bit.CSFB = 0;

EPwm6Regs.CMPA.half.CMPA = 934;

}

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

    每次清除持续的软件强制时、尝试切换 GPIO。 这将显示您的代码是否尝试清除我们认为可能导致问题的事件。

    您是否曾在36mS 窗口中看到 GPIO 切换?


    此致、
    Cody  

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

    您好!

    我已在初始化期间将 GPIO11配置为 ePWM (ePWM6B)。 您是否希望我在清除软件强制后将其配置为 GPIO、以便执行 GPIO 切换?

    谢谢、

    Mayuri  

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

    请尝试在清除 TBCTR 前加载周期、以防影子寄存器中存在伪值。 当 CTR 为0时、我不确定影子是否为直通。

    EPwm6Regs.TBPRD                = periodVal;
    EPwm6Regs.TBCTR                = 0;
    EPwm6Regs.AQCSFRC.bit.CSFB     = 2;                 // Forces a continuous high on output B
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Mayuri、

    否、请使用单独未使用的 GPIO。 然后、我们需要在应清除软件强制的中断的开始和结束时切换 GPIO。 如果我们看到 GPIO 切换并且强制事件不会消失、我们就会知道您的 ISR 代码错误。 如果在32ms 窗口期间没有看到任何切换、则我们知道您的 ISR 代码错误或阻止您执行 ISR 的情况。  

    此致、
    Cody  

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

    Joe、

    只要您已写入影子寄存器、它就会保留正确的值、直到它被覆盖或发生"影子到活动加载"事件。 除非您认为您的代码覆盖了错误的值、否则不需要在一个时间段内多次写入、如果为 true、则我建议您更改代码、这样就不会发生这种情况。

    此致、
    Cody  

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

    Cody、

    什么是"影子到活动"加载事件? CTR = 0? 我的问题是、传输发生在事件或状态上?

    如果它是边沿/写入触发事件、则确保在事件之前加载影子! 与多次写入“影子”无关;-)

    谢谢、

    Joe

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

    你好 Joe、

    我确保在 CTR = 0之前将值加载到影子寄存器中。 但我不认为这会导致这里的问题、因为我仍然无法消除输出中的这个低电平周期。

    谢谢、

    Mayuri

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

    Joe、

    影子到活动加载事件是可配置的。 在上面的代码中、它被设定为载入一个 TBCTR = 0。 如果您在事件发生后对寄存器进行写入、那么它将只是等待下一个 TBCTR = 0的周期。 在上面的代码中、它应该远小于32us。

    虽然代码可能刚刚停止写入新的比较值、但您确实提出了一个好的问题。 甚至是它开始写入错误的比较值。

    此致、
    Cody  

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

    马约里

    您是否有机会实现 GPIO 切换代码、我之前谈到过几篇文章?

    此致、
    Cody  

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

    Cody、

    是的、我在 ISR 中实现了 GPIO 切换、在这里我禁用了连续强制。 我能够看到 GPIO 切换。 此外 、强制在切换事件后禁用、并根据 CMPA 寄存器中的值生成 PWM。  

    我之前遇到的问题是由于某些硬件问题。 当我们能够解决该硬件问题时、就会生成所需的 PWM。 感谢你的帮助。

    此致、

    Mayuri