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.

[参考译文] TMS320F2.8069万M:使用TBPHS寄存器时,PWM输出错误的波形

Guru**** 2550020 points


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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/619867/tms320f28069m-pwm-outputs-a-wrong-waveform-when-using-tbphs-register

部件号:TMS320F2.8069万M

你(们)好

我们的客户使用我们的自动生成项目,发现PWM将产生错误的输出
设置PWM.TBPHS时。 为了找到错误的PWM周期,我们编写了一个项目以保存附近的数据
PWM周期错误。 该项目的设计如下:

1. CPU:F2.8069万M (我们测试了LaunchPad F2.8069万M项目)
2. PWM1在切换频率240KHz下工作。
3. PWM2具有与PWM1相同的设置,加上相移20度至160度。
4.系统控制频率为20kHz,因此我们使用PWM8作为计时器,以引起20kHz中断。
5. GPIO3(PFM2.B)链接到GPIO12,系统使用GPIO12作为外部中断源
它在上升边缘触发中断。
6. PWM1和PWM2的占空比为0.5。
7.系统使用外部中断例程来计算上升沿的宽度。 常规
宽度约为4.17us,系统将在错误的PWM周期(数组aryErr)中保留15个数据。
8. nGblTime是错误的PWM周期数(我的测试结果为3)。
9.将PWM2.TBPHS从93更改为95将导致所有错误的期间。

接近错误PWM周期的PWM2.B波形如下所示:

该项目可通过以下方式完成:

请告诉我如何避免此问题。

F2.8335万也出现了相同的错误。 F2803x和F2802x可能存在相同的问题。

谢谢!

贾凯

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

    嘉开

    此现象是否仅在更新至TBPHS后的1段时间内发生?

    如果您将TBPHS提高到95以上,会发生什么情况? 是否继续导致此问题?

    在代码中什么可以触发同步信号?...您是否曾经启动过SWSYNC?


    此致,
    科迪

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

    是的,它仅发生1个周期。它将在大约1000个PWM周期后再次发生。

    此程序不设置ePWM2.TBCTL.SWFSYNC,它只使用EPWMxSYNCI信号。
    TBCTL的相移初始化代码如下所示:

    ePwm2.TBCTL.bit.PHSEN = TB_ENABLE;
    ePwm2.TBCTL.bit.SYNCOSEL = TB_SYNC_IN;

    在中断例程Task()中,PWM寄存器更新如下:
    ePwm1.CMPA.ALL = ePwm1.TBPRD.ALL >> 1;
    ePwm2.CMPA.ALL = ePwm2.TBPRD.ALL >> 1;
    ePwm2.TBPHS.ALL = ePwm2.TBPRD.ALL * phaseShift;// phaseShift的范围为20/180 - 160/180
    ePwm2.TBCTL.bit.PHSDIR = 1;

    换档从20/180增加到160/180,然后从160/180减少到20/180。然后再增加。

    要检查范围错误的期间,请在函数tasks1()中注释以下两行,
    // CopyTo();
    // __ASM (" ESTOP0");

    要保存数据以供分析,请删除以上2行中的注释标记
    CopyTo();
    _ASM (" ESTOP0");

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

    嘉开

    SYNCI信号的频率是多少?

     

    我怀疑在增加TBPHS时,您导致TBCTR跳过比较值,导致PWM长时间不会降低。

    发生的情况:TB计数器计数几乎达到比较值,然后PWM接收同步信号,将TB计数器的值增加到大于比较值的值,导致PWM错过比较值,并且在整个周期内不会变低。

    您认为这是您的情况吗?

    此致,
    科迪  

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

    尊敬的Cody:

    我认为这是问题的根源。 您有什么方法可以避免这种情况吗?

    谢谢!

    贾凯

    PS:很抱歉我休假了,所以我没有及时回复。  

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

    您能否确认在TBPHS更改时长脉冲"始终"发生?
    您可以尝试将AQCTLA的CBU设置为清除,我的应用程序是PSFB。
    ePWMx->AQCTLA.bit.CBU = 1;

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

    您好,Bard,

    在我的项目中,我使用CMPA设置占空比,因此ARCTLA和ARCTLB设置如下:

    EPWM2.AQCTLA.bit.CAU = AQ_SET;
    EPWM2.AQCTLA.bit.CAD = AQ_CLEAR;
    EPWM2.AQCTLB.bit.CAU = AQ_CLEAR;
    EPWM2.AQCTLB.bit.CAD = AQ_SET;

    对于CMBB,我通常使用它来指定中断位置或触发ADC位置。

    因此,如果我使用CMBB执行PWM输出操作,您认为我可以避免此错误(请参阅下文):

    EPWM2.AQCTLA.bit.CBU = AQ_SET;
    EPWM2.AQCTLA.bit.CBD = AQ_CLEAR;
    EPWM2.AQCTLB.bit.CBU = AQ_CLEAR;
    EPWM2.AQCTLB.bit.CBD = AQ_SET;

    谢谢

    贾凯

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

    嘉开

    我知道的一个解决方法是将CMPA更新为TBPHS+1以强制其立即跳闸,然后将其设置为正确的值。 此 帖子中讨论了变通办法

    此致,
    科迪  

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

    它是有效的。

    我们还考虑了两种其他方法:一种方法与您的方法相似,将TBPHS设置为CMPA - 1,它也起作用。
    另一种方法是更改中断位置,例如,现在PWM中断位置设置为PWM周期的起始位置,
    如果我们将其更改为PWM周期的中间位置,则TBPHS将在第一个CMPA匹配后更改。 但令我惊讶的是,
    这确实奏效。

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

    嘉开

    很棒! 我很高兴这里的一切都能正常工作。 听起来您的第二个解决方案应该起作用,如果我有机会对其进行测试,我会记住这一点。

    此致,
    科迪

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

    非常感谢!