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.

[参考译文] TMS320F28377S:XINT4边沿触发错误

Guru**** 2482225 points
Other Parts Discussed in Thread: C2000WARE

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/782799/tms320f28377s-xint4-edge-triggering-is-wrong

器件型号:TMS320F28377S
主题中讨论的其他器件:C2000WARE

我的目标是让比较器匹配在信号的上升沿触发 CLA 中断、具体实现如下:

1. CMP1SS 将在比较器匹配时产生上升沿信号。  
       Cmpss1Regs.COMPCTL.bit.COMPHSOURCE = 0;
       Cmpss1Regs.COMPCTL.bit.COMPHINV    = 0;
       Cmpss1Regs.COMPCTL.bit.CTRIPHSEL   = 0;
       Cmpss1Regs.COMPCTL.bit.CTRIPOUTHSEL = 0;
       Cmpss1Regs.COMPCTL.bit.ASYNCHEN    = 1;
       Cmpss1Regs.COMPCTL.bit.COMPDACE    = 1;
  
2、比较器输出通过输出 XBAR7映射到 GPIO16。  
       GpioCtrlRegs.GPAGMUX2.bit.GPIO16=0   ;
       GpioCtrlRegs.GPAMUX2.bit.GPIO16=3;     
       GpioCtrlRegs.GPADIR.bit.GPIO16=1     ;
       OutputXbarRegs.OUTPUT7MUX0TO15CFG.bit.MUX0     = 0;
       OutputXbarRegs.OUTPUTINV.bit.OUTPUT7           = 0;

GPIO16连接到 GPIO14、GPIO14通过输入 XBAR13映射到 XINT4。  
       GpioCtrlRegs.GPAGMUX1.bit.GPIO14   = 0;
       GpioCtrlRegs.GPAMUX1.bit.GPIO14=0    ;
       GpioCtrlRegs.GPAPUD.bit.GPIO14=1     ;
       GpioCtrlRegs.GPADIR.bit.GPIO14     = 0;
       GpioCtrlRegs.GPAQSEL1.bit.GPIO14   = 0x3;
       InputXbarRegs.INPUT13SELECT        = 14;
       XbarRegs.XBARCLR1.ALL             |= 0x00020002;

4. XINT4被设置为正(上升)边沿触发。  
       XintRegs.XINT4CR.bit.ENABLE  = 1;
       XintRegs.XINT4CR.bit.polarity = 1;

5、CLA 任务3被设置为在 XINT4上触发、因此预计它将在比较器(CMP1SS)输出的上升沿上触发。  
       DmaClaSrcSelRegs.CLA1TASSKSRCSEL1.bit.TASK3=32 ;

6、这也映射到 EPwmXbar 跳闸4、然后映射到 EPwm6数字比较器 DCAEVT1、以生成一个到 EPwm6的同步脉冲
       EPwmXbarRegs.TRIP4MUX0TO15CFG.bit.MUX0 = 0;
       EPwmXbarRegs.TRIP4MUXENABLE.bit.MUX0   = 1;
       EPwmXbarRegs.TRIPOUTINV.bit.TRIP4      = 0;
       EPwm6Regs.DCTRIPSEL.bit.DCAHCOMPSEL    = 3;
       EPwm6Regs.TZDCSEL.bit.DCAEVT1    = 2;
       EPwm6Regs.DCACTL.bit.EVT1SRCSEL     = 0;
       EPwm6Regs.DCACTL.bit.EVT1SYNCE      = 1;

此设置的结果如下所示。  

通道3是在 GPIO16上测得的 CMPSS1输出。  
通道4是 EPwm8B 输出、该输出由 DCAEVT1生成的 SYNC 脉冲(见上面的#6)以及 CLA 任务3通过强制同步命令(EPwm8Regs.TBCTL.bit.SWFSYNC = 1)触发。
在通道4上看到的上升沿应与通道3上 CMPSS1输出的上升沿保持一致、但它应与下降沿保持一致。  我是否错过了设置、或者这是预期的工作方式?  XINT4似乎未在上升沿触发、或者可能在 CMP1SS 输出变为低电平之前不触发。

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

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

    乍一看、您看到的延迟并不完全不合理。 比较器->outxbar->GPIO_TRIP 和比较器->epwmxbar->ePWM_TRIP 不是同时进行的操作。 ePWM 路径会增加一些额外的延迟、但此延迟远小于您看到的100ns、因此我想更好地了解您的设置以进行解释。

    从您发布的代码段中不清楚 EPWM8是如何跳闸的。 在 cmpss 跳闸发生和 epwm8触发之间、似乎有很多软件干预。 如果是这种情况、请记住、位字段寄存器写入"EPwm8Regs.TBCTL.bit.SWFSYNC"等内容不是单周期操作。 它们需要多个周期。 根据您拥有的数量、这将很容易增加到100ns。

    您能解释一下为何不执行完整的硬件跳闸? 您可以设置 cmpss、使 ePWM 在硬件中完全跳闸、而无需软件干预。 这将是最快的、但与 cmpss 跳闸发生的时间相比、它仍然会有一些延迟。 此外、我在上面的步骤2中注意到您没有启用 outputtxbar7 (OUTPUT7MUXENABLE)。 但是、由于您在 GPIO16上获得输出、因此您必须在代码中的某个位置启用它。 此外、为了进行调试、请勿在跳闸后断开 cmpss。 我想排除 XINT4可能出现的"反转"问题。

    电源 明天我将不在办公室、所以我将在星期一回复您的回复。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    感谢 Frank 的回答。  

    在上面的第2步中、我没有包括 OUTPUTXbarRegs.OUTPUT7MUXENABLE.bit.MUX0 = 1行、 这行启用了 OUTPUTXBAR7。  

    EPwm8b 设置为在零时变为高电平、在 CMPA 匹配时变为低电平(同样、这是一种调试工具)。  

      EPwm8Regs.CMPA.bit.CMPA = 10;

      EPwm8Regs.AQCTLB.bit.ZRO = AQ_SET;

      EPwm8Regs.AQCTLB.bit.CAU = AQ_CLEAR;

    第一个 EPwm8脉冲(其边沿与左侧的通道1触发点对齐)由 EPwm1同步脉冲触发。  CLA1Task3中的第二个脉冲由第一行触发:

    EPwm8Regs.TBCTL.bit.SWFSYNC = 1;

    目的是 CLA1Task3由 XINT4 /CMPSS1HI 上升沿触发、上面的行用于指示已进入 ISR、大致是在进入 ISR 之后。  

    下面显示了支持组件代码、(如果我正确解释了该代码)需要5个周期或25ns:

    000084c2: 78410000  MMOVIZ  MR1、#0x0          1个周期

    000084c4: 75804700  MMOVZ16  MR0、@0x4700 1个周期

    000084c6: 78810040  MMOVXI  MR1、#0x40        1个周期

    000084c8: 7C800004  MOR32   MR0、MR1、MR0 1周期

    000084ca: 75C04700  MMOV16  @0x4700、MR0 1周期

    000084cc: 7FA00000  MNOP

    000084ce: 7FA00000  MNOP

    000084d0: 7FA00000  MNOP

    000084d2: 7F600000  MDEBUGSTOP

    下面的两个示波器图显示了通道3的上升沿(CMPSS1)和通道4的上升沿(EPwm8b)之间存在一致的122ns 延迟。  这两个图之间的区别在于、我在第一  个(13:05:07)和第二个(13:05:41)图之间人工扩展了通道3下降沿。  延迟一致这一事实告诉我 XINT4已正确设置并在上升沿触发。  我不理解的是122ns 延迟。  上面的汇编代码会考虑25ns 左右的时间、当然会有一些传播延迟、但我希望远小于示波器图中显示的接近100ns 的时间。  有什么关于这是为什么的想法吗?

    我正在尝试对相移全桥转换器实施峰值电流模式控制。  我的目标是 EPwm6A 应在 CMPSS1 (通道3)的上升沿切换。  EPwm6.DCAEVT1在每个事件中生成一个将 EPwm6.TBCTR 置为零的同步脉冲;这在每个 PWM 周期发生两次、第一次 EPwm6A 变为高电平(如示波器图所示) 、第二次发生时为低电平。  我本来希望这种转换发生在 CMPSS1的上升沿、但实际上是在下降沿强制执行的。  这将是一个新问题、但为什么会发生这种情况?

    当您询问完整的硬件跳闸时、我假设您是通过 DCAEVT1.FORCE 来实现的?  这需要触发区交互正确吗?  我很确定我可以设置它、并将进行尝试。  

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

    好的、感谢您提供额外的详细信息。 由于 C28x CPU 是流水线架构、完成指令所需的总周期数取决于流水线的状态。 注释中的周期数仅为执行周期。 我认为测试周期数的更准确方法是在 CCS 中使用"Profile Clock"。 在 CCS 的调试视图中、您可以在"Run->Clock"中找到该选项。 因此、启用它、运行到"指令集"之前、重置配置文件时钟、运行到"指令集"之后并读取周期计数。

    我们必须回到您的新问题。 是的、当我提到硬件跳闸时、我指的是使用 DCAEVT.FORCE 和 TZ。 我们有一个 C2000Ware 示例"cmpss_asynch"来实现这一点。 您能否尝试一下、让我们知道您找到的内容?

    BTW、如果您的示波器能够标记通道、请启用它、以便更快地读取示波器快照。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    因此、我引用 了 cmpss_asynch 并发表了以下文章:

    有关 采用4类 EPWM#2126742的 PSFB 的 e2e.ti.com/.../2126742

    这解决了我的问题。  仍然不确定 EPwm6为什么跟踪到 CMPSS1的下降沿、但这并不重要、因为我现在已经在 PCMC 上工作了。

    谢谢、

    Andy

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

    很高兴听到您现在可以使用它! 与往常一样、如果您遇到更多问题、请务必告知我们。