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:相移问题

Guru**** 2555630 points


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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/983888/tms320f28069-phase-shift-problem

器件型号:TMS320F28069

大家好、我的客户正在配置 PWM1和 PWM2、希望它们具有180°相移。

静态空 vSetEpwm1 (空)

  EPwm1Regs.TBPRD = PwmPeriod>>1;

  EPwm1Regs.CMPA.half.CMPA = PwmPeriod>2;

  EPwm1Regs.TBPHS.Half.TBPHS = 0;

  EPwm1Regs.TBCTR = 0;

  EPwm1Regs.TBCTL.bit.CTRMODE = TB_COUNT_UPDOWN;

  EPwm1Regs.TBCTL.bit.PHSEN = TB_DISABLE;

  EPwm1Regs.TBCTL.bit.PHSDIR = TB_UP;

  EPwm1Regs.TBCTL.bit.PRDLD = TB_SHADOW;

  EPwm1Regs.TBCTL.bit.SYNCOSEL = TB_CTR_ZERO;

  EPwm1Regs.TBCTL.bit.HSPCLKDIV = TB_DIV1;       //TBCLK=SYSCLKOUT

  EPwm1Regs.TBCTL.bit.CLKDIV = TB_DIV1;

 

  EPwm1Regs.CMPCTL.bit.SHDWAMODE = CC_SHADOW;

  EPwm1Regs.CMPCTL.bit.SHDWBMODE = CC_SHADOW;

  EPwm1Regs.CMPCTL.bit.LOADAMODE = CC_CTR_Zero_PRD;

  EPwm1Regs.CMPCTL.bit.LOADBMODE = CC_CTR_Zero_PRD;

 

  EPwm1Regs.AQCTLA.bit.CAU = AQ_SET;

  EPwm1Regs.AQCTLA.bit.CAD = AQ_CLEAR;

  EPwm1Regs.AQSFRC.bit.RLDSF = 0;           // AQCSRC 负载为零

 

  EPwm1Regs.DBCTL.bit.IN_MODE = DBA_ALL;

  EPwm1Regs.DBCTL.bit.POLSEL = DB_ACTV_LOC;

  EPwm1Regs.DBCTL.bit.OUT_MODE = DB_FUL_ENABLE;

 

  EPwm1Regs.DBRED =死区;

  EPwm1Regs.DBFED =死区;

 

  EPwm1Regs.ETSEL.bit.SOCAEN = 1;           //在组上启用 SOC

  EPwm1Regs.ETSEL.bit.SOCASEL = ET_CTR_PRD;      //在 TBPRD 上选择 SOC

  EPwm1Regs.ETPS.bit.SOCAPRD = ET_1ST;         //在发生第一个事件时生成脉冲

 

静态空 vSetEpwm2 (空)

  EPwm2Regs.TBPRD = PwmPeriod>>1;

  EPwm2Regs.CMPA.half.CMPA = PwmPeriod>2;

  EPwm2Regs.TBPHS.Half.TBPHS = EPwm2Regs.TBPRD - 1;

  EPwm2Regs.TBCTR = 0;

  EPwm2Regs.TBCTL.bit.CTRMODE = TB_COUNT_UPDOWN;

  EPwm2Regs.TBCTL.bit.PHSEN = TB_ENABLE;

  EPwm2Regs.TBCTL.bit.PHSDIR = TB_UP;

  EPwm2Regs.TBCTL.bit.PRDLD = TB_SHADOW;

  EPwm2Regs.TBCTL.bit.SYNCOSEL = TB_SYNC_IN;

  EPwm2Regs.TBCTL.bit.HSPCLKDIV = TB_DIV1;       //TBCLK=SYSCLKOUT

  EPwm2Regs.TBCTL.bit.CLKDIV = TB_DIV1;

 

  EPwm2Regs.CMPCTL.bit.SHDWAMODE = CC_SHADOW;

  EPwm2Regs.CMPCTL.bit.SHDWBMODE = CC_SHADOW;

  EPwm2Regs.CMPCTL.bit.LOADAMODE = CC_CTR_Zero_PRD;

  EPwm2Regs.CMPCTL.bit.LOADBMODE = CC_CTR_Zero_PRD;

 

  EPwm2Regs.AQCTLA.bit.CAU = AQ_SET;

  EPwm2Regs.AQCTLA.bit.CAD = AQ_CLEAR;

  EPwm2Regs.AQSFRC.bit.RLDSF = 0;          // AQCSRC 负载为零

 

  EPwm2Regs.DBCTL.bit.IN_MODE = DBA_ALL;

  EPwm2Regs.DBCTL.bit.POLSEL = DB_ACTV_LOC;

  EPwm2Regs.DBCTL.bit.OUT_MODE = DB_FUL_ENABLE;

 

  EPwm2Regs.DBRED =死区;

  EPwm2Regs.DBFED =死区;

 

  EPwm2Regs.ETSEL.bit.SOCAEN = 1;           //在组上启用 SOC

  EPwm2Regs.ETSEL.bit.SOCASEL = ET_CTR_PRD;      //从计数器=零选择 SOC

  EPwm2Regs.ETPS.bit.SOCAPRD = ET_1ST;         //在发生第一个事件时生成脉冲

在大多数情况下、它们具有180相移。 TBPRD=700。 PWM2的 TBPHS (TBPRD-1)使相移为180°。

但是、有时间 PWM2 (从 PWM)的 TBCTR 将从700计数到1400。 我们捕获的数据如下:

蓝色线- PWM2 TBCTR、紫色线- PWM1 TBCTR。

我们不理解它的行为为何如此。

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

    Howard、

    当使用向上/向下计数模式时、您只能使用 TBPHS 上移180度。 如果您移动到这个数值以上、那么在发生一个同步事件后、您需要使用 TBCTL.PHSDIR 来改变计数器的方向并重新调整 TBPHS 的值。  

    我怀疑这可能是您的问题。 请注意、PWM 的计数器非常简单、它在一个方向上计数、直到达到 TBPRD 或0、然后将改变方向并以相反的方式计数。 在上述情况下、如果 TBPRD 不是1400、那么软件中的某些内容已配置为反转计数器的方向、我将验证何时发生同步脉冲、以及同步事件发生时编程的 TBPHS 和 PHSDIR 是什么。

    此致、
    Cody  

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

    Cody、

    TBPRD 不是1400、而是700。

    我的理解是:即使软件改变了方向、当我们达到700时、计数器也会开始递减计数、而不是递增计数。 因此对于 TBCTR、它不应超过700。

    如何在发生同步事件时检查编程的 TBPHS 和 PHSDIR?

    我们测量了另一个错误的 TBCTR 波形、如下所示:

    它从700-2100更改为始终向上计数(尽管配置与之前相同)。

    Line1-蓝- TBCTR、line2-红- TBPRD (700)、line3-绿- CMPA、Line4-紫- TBPHS (699)。

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

    Howard、

    您应该能够在同步事件的同时配置中断并存储值... 这将在活动之后稍稍稍稍稍稍稍稍稍稍稍稍稍稍稍稍稍稍稍稍稍稍稍稍稍稍稍稍稍稍稍稍稍稍稍稍

    您共享的这个图就是您将一个值过高输入 TBPHS 并将其设置为递增计数的情况。 TBPHS 中任何大于 TBPRD 的值都可能导致问题。 如果 PHSDIR 设置为递增计数、则 TBCTR 将递增计数、直到计数器溢出或出现另一个同步脉冲。 在您的情况下、您在1400次计数后收到同步脉冲、因此它从700增加到2100并重置为700。

    请注意:如果 PHSDIR 按递减计数方向设置、则在加载大于 TBPRD 的 TBPHS 值时仍会出现问题。 这是因为计数器不连续性可能导致 CMPx 事件丢失。 这种不连续性将在每个同步脉冲之后发生、因此如果您每周期同步一次、它将始终发生、如果您仅在代码开始时进行同步、则仅在第一个周期内发生。  

    为了避免这种情况、当在向上向下计数模式下相移超过180度时、您必须在软件中更改计数器方向并将 TBPHS 寄存器调整为小于 TBPRD。 例如、如果 TBPHS 为125且 TBPRD 为100、则反向计数器方向并将 TBPHS 降低至75 [TBPRD-(TBPHS-TBPRD)]。

    此致、
    Cody

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

    Cody、

    抱歉、在我们的配置中、TBPHS=699、TBPRD=700。 <TBPRD so it should not be a problem. 由于我们需要180相移、所以我们必须在向上/向下计数模式中将 TBPHS 设置为尽可能接近 TBPRD、因为同步脉冲发生在 PWM1计数到0时、它将触发 PWM2 TBCTR 来加载 TBPHS 值。

    1.如果有问题,请你建议问题是什么,TBPHS 有什么限制?

    使用相同的配置时、TBCTR 波形实际上大部分时间都是正确的、但会有2种不正确的波形、 这是我在第一次对话中发布的图片(从700到1400再到700)和我在回复中发布的图片(从700到2100、然后重置为700)。 我找不到这种现象的解释。

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

    Howard、

    最简单的解决方法是使用向上计数模式或向下计数模式、而不是向上向下计数模式。 这些模式在换180度或以上时更易于使用。  

    不过、这在向上-向下计数模式下是可以实现的。 当相移180度或以上时、如果 TBPHS >= TBCTR、则必须在软件中更改计数器方向。 这是您看到 TBCTR 从700计数到2100重置为700的第二种情况。

    对于第一种情况(TBCTR 计数介于700和1400之间)、我必须假定 TBPRD 或 TBPHS 必须设置为1400。

    说明:

     只有两种情况会导致 CTRDIR 从递减计数变为递增计数。 第一个是 TBCTR =0。 这不会发生。  第二个是同步事件。 知道这一点后、我相信当 ePWM1的计数器= 0时会发生同步事件、这会导致 ePWM2的 TBCTR 值被加载700并向上计数。

    也只有两个因素会导致 CTRDIR 从递增计数变为递减计数。 第一个是 TBCTR= TBPRD、第二个是 PHSDIR =0时的同步事件。

    如果是 TBCTR = TBPRD 导致计数器的方向改变、您将清楚地看到 TBPRD 设置为1400。

    如果这是导致变化的同步事件、那么您将看到在 TBPHS 中加载了1400并且 PHSDIR = 0。

    请记住、根据我上面的陈述、我们知道同步甚至会导致从递减计数变为递增计数、因此同步脉冲不太可能成为将计数器从递增计数切换到递减计数的事件。 虽然仍然可以、但 这需要每个周期加载两次 TBPHS 和 PHSDIR、我认为代码很容易看到。 因此、首先检查代码中 TBPRD 是否始终设置为1400。

    请暂停代码执行并评估 TBPHS、TBPRD 和 PHSDIR。 这些将告诉您改变计数器方向的是什么。

    此致、
    Cody  

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

    Cody、

    对于下面 PWM2的 TBCTR 在700-1400-700之间计数的图片、TBPRD 是红线、它始终是700、而不是1400、如您所见。  

    我们通过使用另一个 PWM (如 PWM8)生成 ISR 并读取寄存器值来获得该波形、我们绘制了所获得的数据、我们将得到这样的波形图。

    另一个问题是:在向上向下计数模式下、如果我们设置 TBPHS=TBPRD 并设置 PHSDIR=1进行向上计数、但 TBCTR=TBPHS=TBPRD 将使其向下计数、则这是冲突的、那么哪个将优先?

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

    Howard、

     您能否确认 PWM 在700和1400之间计数何时接收到同步脉冲? 另请确认 PHSDIR 值未更改。 同步事件是唯一可以更改 CTRDIR 的其他事件。

    [引用 userid="2766666" URL"~/support/microcontrollers/c2000/f/c2000-microcontrollers-forum/983888/tms320f28069-phase-shift-problem/3638521 #3638521"]另一个问题是:在向上向下计数模式下、如果我们设置 TBPHS=TBPRD 并设置 PHSDIR=1进行向上计数、但 TBCTR=TBPHS=TBPRD 将使其向下计数、则会发生冲突、那么哪一个将优先?[/QUote

    Howard、我实际上不知道哪个事件优先、但我认为这种行为是确定性的。 我想、如果您同步到 TBCTR=TBPHS=TBPRD、PHSDIR 位将优先、但我尚未确认。 如果您想获得答案、我需要让设计团队进行仿真。 请告诉我。

    此致、
    Cody  

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

    Cody、

    我正在尝试配置观察点、当 TBCTR 计数超过700时、该观察点将停止 CPU。

    但我无法这样做、因为它不是写入 TBCTR 值的代码、而是器件本身在计数。

    是否要在 TBCTR 计数到带有观察点的特定值时停止 CPU (或以任何其他方式)?

    如何操作? 最好能给我一张配置的屏幕截图、谢谢。

    以下配置无法实现我的目标。

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

    Howard、

    我*相信*观察点只观察 CPU 对位置的访问,所以正如您已经指出的那样,其他机制对 TBCTR 的更改将不会被捕获。

    如果我尝试对此进行调试、我会定期使用 C28x 内核使 TBCTR 极点。 这可以在任何方便的地方完成、并且如果你需要一个固定周期、CPU 定时器、eCAP、或者 PWM 可被用作轮询代码的触发源。

    此致、
    Cody