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.8377万D:TMS320F2.8377万D ECAP同步

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

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/639074/tms320f28377d-tms320f28377d-ecap-synchronization

部件号:TMS320F2.8377万D
主题中讨论的其他部件: C2000WARE

我想同步TMS320F2.8377万D处理器上的ECAP1 - ECAP6时钟。 我正在测量ECAP1和其他ECAP之间的相位差异,我认为我看到ECAP之间的相位差异似乎与物理相位差异不对应。 我尚未证实情况确实如此。

不管怎样,我想同步所有ECAP TSCTR计数器时钟,我正在尝试找出实现这一目的的最佳方法。

1)我想监控ECAP TSCTR时钟之间的相位差异,以确认ECAP之间的相位是否发生变化。

这是否通过读取以下寄存器来测量:

/*读取和存储每个TSCTR寄存器*/
eCAP1_Counter = ECap1Regs.TSCTR;
Escap2_Counter = ECap2Regs.TSCTR;
Escap3_Counter = ECap3Regs.TSCTR;
Escap4_Counter = ECap4Regs.TSCTR;EscTR;
Escap5_Counter = ECap5Regs.TSCTR;
Escap6_Counter = ECap6Regs.TSCTR;

/* Calculate TSCTR Deltas */
ECap12_Delta = eCAP1_Counter - Escap2_Counter;
ECap13_Delta = eCAP1_Counter - Escap3_Counter;
ECap14_Delta = eCAP1_Counter - Escap4_Counter;
ECap15_Counter
= eCAP5 Counter = ECAP5 Counter; 

我的理解是,如果所有ECAP都同步,则这些"Delta"计算至少应保持不变。 由于读取这些计数器需要时钟周期,因此这些读数中应存在稳定状态偏移。 这是否是量化所有ECAP同步的正确方法?

2)我想通过软件同步ECAP。

初始化时,我需要设置以下寄存器;

/*为SWSYNC输入*/
EALLOW设置ECAP 1 - 6;
ECap1Regs.ECCTL2.SYNCO_SEL.BIT = 0U;
ECap2Regs.ECCTL2.SYNCO_SEL.BIT = 0U;
ECap3Regs.ECCTL2.SYNCO_SEL.BIT = 0U;ECap4Reg.ECU_SEL.DEL.BIT

ECap5Regs.ECCTL2.SYNCO_SEL.bit = 0U;
ECap6Regs.ECCTL2.SYNCO_SEL.bit = 0U;

/*在ECAP 1上启用同步输入*/
ECap1Regs.ECCTL2.SYNCI_EN.bit = 1U;
EDIS; 

当我需要同步时,我需要触发SWSYNC事件。

/*同步所有ECAP */
EALLOW;
ECap1Regs.ECCTL2.SWSYNC = 1U;
EDIS; 

因此,我的问题是:
-此操作是否可以使所有ECAP之间的TSCTR时钟同步? 是否有其它需要设置的寄存器。
-此操作是否会使TSCTR计数器与零延迟同步? 即计数器之间的相位差为零。 如果没有,是否有一个值可以插入到CTRPHS登记簿中以说明延迟?

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

    所有问题的答案都是“是”,您的配置看起来是正确的,您应该能够通过SWSYNC进行同步。 您的所有配置看起来都是正确的,您是否可以在您看到的计数器之间共享您的结果或增量? 另外,您是否处于调试模式? 另一个建议是使用CTRPHS寄存器为每个eCAP配置不同的值,以便您在阅读时可以看到类似的增量,这应确认同步。

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

    所以我让SWSYNC工作,但是,它不是我上面的代码。

    基本上,我想在启动时同步所有计数器,因为当我比较ECAP之间的TSCTR时,我看到了不可预测的变化。

    因此,在启动时(除了所有其他ECAP初始化),我会执行以下操作:

    ECap1Regs.ECCTL2.bit.SYNCI_EN =1;/*启用SYNC in*/
    ECap1Regs.ECCTL2.bit.SYNCO_SEL =0;/*直通*/
    
    ECap2Regs.ECTL2.ECC2.bit.ECCCC_ECL2= 1EC21.ECCO_EC21.32.ECCO_EC21.=
    SYNEC21.ECCO/EC21.EC21.ECCO/EC21.EC21.ECCO/EC21.NC1.BIT
    
    
    
    
    = SYNEC21.ECCO/EC21.ECCO_EC21.EC21.ECCO/EC21.EC21.ECCO/ECAP= SYNCI.EC21.ECCO/EC21.EC21.ECCO/EC21.EC21.ECCO/EC21.ECCO/ECPE.BIT = SYNECCO/ECAP= SYNCI.ECCO.ECCO.ECCO.ECCO/ECAPECCO.ECAP= SYNCI*启用SYNEC21.ECCO/ECCO.ECCO.ECCO.ECCO.ECCO/ECCO.EC
    /*直通*/
    
    ECap5Regs.ECCTL2.bit.SYNCI_EN =1;/*启用SYNC in*/
    ECap5Regs.ECCTL2.bit.SYNCO_SEL =0;/*直通*/
    
    ECap6Regs.ECCTL2.bit.SYNCI_EN =1;/*启用SYNC in*/
    ECap6Regs.ECCTL2.bit.SYNCO_SEL = 0;/*直通*/
    
    //设置ECAP1和ECAPAPAPAPAPAPAP4用于外部同步
    EALLOW;INPUXbarRegs.INTT5SELCO_SE1EC1ECPID= 0
    
    
    
    
    
    
    ;SYECC1.EC1EC1EC1EC0 = SYEC1EC0,SYECCEC1EC1EC0,SYCEC1EC0,SYEC1EC0 = 0,SYCEC1ECEC1EC0,SYEC1EC0 = 0,SYCEC1EC0 = 0,SYEC1ECCEC1ECCEC0 = 0 = 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
    
    0,0,0,0,0,0,0,0,0,0,0,0,0 

    这基本上遵循F2.8377万D技术参考手册的16.5 章节6。 下面详细介绍了我所做的一些更改。 基本上,我选择GPIO102作为我的未使用GPIO,而不是将0x101编程到ECAP1SYNCIN和ECAP4SYNCIN寄存器,而是将5U编程到它(这是三位寄存器)。

    要将SWYNC与ECAP1和ECAP4配合使用,可以采用以下变通方法:

    •在InputXbarRegs.INPUT5SELECT中选择未使用的GPIO。

    •在输出模式下配置此GPIO,并将'0'写入GPIO DAT寄存器。 默认情况下,此设置被编程为GPIO0,因此此引脚上的任何活动都将导致SWSYNC出现问题

    •Program SYNCSEL[ECAPxSYNCIN]= 5U0x101这将使ECAPx.EXTSYNCIN处于非活动状态。

    我在这方面看到的结果是通过了解每个ECAP TSCTR之间的差异而得出的。

    • ECAP1和ECAP2之间:4个时钟计数
    • ECAP1和ECAP3之间:10个时钟计数
    • ECAP1和ECAP4之间:10个时钟计数
    • ECAP1和ECAP5之间:14个时钟计数
    • ECAP1和ECAP6之间:19个时钟计数

    我实际上不知道读取ECap1Regs.TSCTR与ECap2Regs.TSCTR等的延迟有多少delta,以及SWSYNC同步方法中有多少错误,但我正在将它们变得非常接近,每次运行此代码都是一致的。 如果我从代码中删除其他语句,我会遇到一些奇怪的事情,例如:

    • eCAP1-3和ECAP4-6在其组中同步,但两个组不会相互同步
    • ECAP4-6有时会同步,而其他时间则不会同步。

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

    如果您尝试将所有ECAP (即ECAP1)同步到ECAP6,则两个配置看起来不正确。

    SyncSocRegs.SYNCSELECT.bit.ECAP4SYNCIN = 4U;//这将在来自ECAP1的同步信号上同步

    从代码中删除以下行:
    ECap4Regs.ECCTL2.bit.SWSYNC =1;--不需要,因为ECAP1的任何同步源都将通过ECAP4


    另外,还要注意的是,由于您是按顺序读取TSCTR寄存器,因此每次读取之间会有延迟,这将因编译器的不同而有所不同,同样ECAP中也没有延迟,它们都在同一周期中同步。 但由于您一次只读一个,计数器仍在运行,因此您将看到增量。

    现在,如果您要验证每个ECAP之间是否存在任何同步延迟,则最好的捕获方法是使用CAPx寄存器。 为此,您必须通过INPUTXBAR通过GPIO触发事件,这对于所有eWAP都是相同的,还需要配置极性,将其置于单触发模式,启用捕获模式,然后读取CAPx寄存器,它们都应具有相同的计数值。 您可以在C2000Ware中找到示例代码。

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

    因此,我调整为您建议的代码,并看到以下内容:

    • ECAP1和ECAP2之间:4个时钟计数
    • ECAP1和ECAP3之间:10个时钟计数
    • ECAP1和ECAP4之间:16个时钟计数
    • ECAP1和ECAP5之间:21个时钟计数
    • ECAP1和ECAP6之间:26个时钟计数

    我知道我的软件确定增量的方法有固有的延迟(而且您的硬件验证方法更好)。 我不担心是否存在延迟(只要它是同步的,可重复的并且接近零,即 <30个时钟周期)。 它绝对有效,谢谢!