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.

[参考译文] TIDM-Delfino-EtherCAT:在 EtherCAT 网络中使用分布式时钟。

Guru**** 2548290 points
Other Parts Discussed in Thread: LAUNCHXL-F28379D, TIDM-DELFINO-ETHERCAT, CONTROLSUITE, TMDSICE3359

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/671307/tidm-delfino-ethercat-using-distributed-clock-in-ethercat-network

器件型号:TIDM-Delfino-EtherCAT
主题中讨论的其他器件:LAUNCHXL-F28379DcontrolSUITETMDSECATCNCD379DTMDSICE3359

您好!

我成功运行了连接到 LaunchXL-F28379D 的 TIDM-Delfino-EtherCAT。 我可以访问 ETG、以便准备堆栈文件、分配供应商 ID 并连接到 TwinCAT 3。 它在自由运行周期中运行。 这是我的问题-自由运行周期可在4ms 周期内工作。 我必须将这个时间减少到大约100us。 我认为这里有必要使用分布式时钟(DC)、但我不知道如何正确设置它。 TwinCAT 中与直流模式相关的每一次更改都会中断传输。

我的问题-如何打开分布式时钟? 在我的 SSC 文件中、DC_SUPPORTED 和 AL_EVENT_ENABLED 设置为1、因此可以使用直流模式 I PEVENT。

BR、

Dawid。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Dawid、
    现在、您已经准备好了 LaunchXL 的 HAL。 您是否检查了 controlSUITE 中为 TMDSECATCNCD379D 套件提供的 C28x SSC 端口/补丁文件?

    您可以使用修补程序生成 SSC 文件并将 HAL 替换为您的代码。 补丁将启用 DCX、并将您的 HAL 与 TI 为 TMDSECATCNCD379D 套件提供的 HAL 进行比较、以确定您的 HAL 中是否有 SYNC0/1所需的 GPIO 和 ISR 初始化。

    然后、您必须从主器件启用 DCX 并重新加载从器件、您应该会看到正在发生同步 ISR。 打开 DCX 时、您在主器件上看到了什么错误?

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

    Santosh、

    我做了你写的事情。 我使用 controlSUITE 中为TMDSECATCNCD379D 套件提供的补丁生成了 SSC。 我对定义进行了一些更改、以应用于 launchxl-f28379d 引脚。 它正在运行,我们在另一个线程中与之作斗争,我们成功地完成了:)

    但是、当我在 TwinCAT 中设置直流模式、然后尝试发送开关 LED 等命令时、我无法在 CCS 调试器中看到任何更改。 我是否必须做更多的事情才能打开直流模式?

    BR、
    Dawid。

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

    Santosh、

    我成功运行了 DC 模式-谢谢您:)您写道我应该重新加载设备。 我以前没做过...

    现在、我能够将周期时间设置为500us。 自由运行周期设置为1ms、但在高级设置中、我将同步0周期时间定义为500us。

    我的目标是大约100us、但当我将时间设置为低于500us 时、例如400us、我可以在错误列表中看到"同步错误"。 我应该对班次时间或 Sync1做些什么?

    感谢 Santosh 的帮助。

    BR、
    Dawid。

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

    Dawid、

    您不必这样做、SYNC0和 SYNC1都可以根据需要进行独立配置、唯一需要确保的是如何在软件中处理 ISR、 当 CPU 处理一个 ISR 时、第二个触发的 ISR 必须等待、直到默认情况下为第一个 ISR 提供服务。 尝试禁用 SYNC1并查看它是否有助于您的实验。

    我不确定您所讨论的同步错误。 您使用的是 ASYNC16或 SPI 的哪种 PDI? 同步时间越短、可能会有一定的限制、使用 ASHNC16时、时间应远优于 SPI。

    希望这对您有所帮助。

    此致

    Santosh Athuru

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

    Santosh、

    很抱歉、我们迟到了回复、但今天我可以在实验室中查看。
    我使用的是 ASYNC16。 正如您所说的、我禁用了 SYNC1、并且仅使用了 SYNC0。 并且仍然是相同的。 当 SYNC0设置为500us 周期时、它仍在工作、但当我将其降低到400us 时、我可以看到该错误:

    出现该错误后、TIDM-Delfino-EtherCAT 上的运行指示灯闪烁。

    我也认为 ASYNC16应该具有比 SPI 更好的时序限制。

    你怎么看?  我应该使用移位时间做些什么、还是有其他设置?

    BR、
    Dawid。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Dawid、
    您能否检查整个同步0 ISR 的时钟周期? 在 ISR 的进入和退出处放置一个断点、并计算断点之间的时钟周期。 请在以下链接中查看启用计数事件的步骤、当您具有时钟周期后、您就知道在 CPU 以200MHz 运行时 ISR 需要多长时间。 这应该让我们对下一步可以做什么有一些了解。

    processors.wiki.ti.com/.../Hardware_Breakpoints_and_Watchpoints_for_C28x_in_CCS

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

    Santosh、

    我做的正是你写的。 我测量了 ISR 内及其之间的周期。 以下是我的屏幕截图:

    下面是我的 SysPll 配置:

    InitSysPll (XTAL_OSC、IMULT_40、FULT_0、PLLCLK_By_2); 

    我将其从

    InitSysPll (/*INT_OSC2*/XTAL_OSC、IMULT_20、FULT_0、PLLCLK_By_1); 

    ISR 似乎相当快。 你怎么看?

    BR、
    Dawid。

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

    Santosh、

    我想向您提供更多信息。 在编写如何检查调试中的周期之前、我使用计时器检查了一些时间范围。 然后我检查了 void APPL_Application (void);函数被启用的频率。
    所以:

    1) 1)在 TwinCAT 中、我设置直流模式、周期时间为600us。
    2) 2)在 main 函数中、我像这样设置定时器1:CpuTimer1Regs.TPR.bit.TDDR = 199;因此、200MHz 时钟1节拍持续1us。
    3) 3)在 APPL_Application 函数中、我在开头添加了该代码:

    时间= 0xFFFFFFFF - CpuTimer1Regs.TIM.all;
    CpuTimer1Regs.TCR.bit.TSS = 1; // 1 =停止计时器,0 =启动/重新启动计时器
    CpuTimer1Regs.tcr.bit.TRB = 1; // 1 =重新加载定时器
    CpuTimer1Regs.tcr.bit.tss = 0; // 1 =停止计时器,0 =启动/重新启动计时器 

    4) 4)在观察表达式中、我添加了变量"time"
    5) 5)在 TwinCAT 中加载应用程序并重新加载器件。

    正如我说过的、周期时间设置为600us、而运行"time"变量的应用程序大约为600。 一切看起来都正确。 下面是观察表达式的屏幕:

    接下来、我检查了周期、就像我在 ISR Sync0中检查了周期一样。 我在 APPL_Application 函数的开头和与处放置断点。 因此、从开始到结束 APPL_Application 函数持续大约77个周期:

    我检查了从 APPL_Application 返回到下次执行此函数的时间、这大约是2720个周期:

    但同时、用于节省计时器测量时间的"time"变量的值从600降至17! 我不知道为什么。

    我觉得应该还有600多个。 您对此行为有何看法?

    BR、
    Dawid。

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

    Santosh、

    让我们暂时忘记我之前的问题。 我想向您提出另一个非常重要的问题。

    我将 Launchpad 连接到另一个基于 AM335 Sitara 的 EtherCAT 主站、这是 TI 的 TMDSICE3359电路板。 在这个主器件中、我在每个周期中递增处理值、它是 DataFromMaster 寄存器。 在 void APPL_Application (void)中 Launchpad 上的从应用中、我想将数据保存在寄存器中、我的意思是这样:

    void APPL_Application (void)
    {
    寄存器[i]= DatafromMaster0x7010.DatafromMaster;
    i++;
    //... 另一程序
    } 

    在监视表达式中、我可以看到 DatafromMaster 寄存器正在递增精细、但在寄存器数组中、我可以看到所有寄存器[i]值都等于当前 Datafrommaster! 我的意思是、APPL_Application 函数的触发速度比 EtherCAT 帧周期快得多。 我认为 APPL_Application 在每个周期时间触发、例如1ms 或500us、通常取决于主器件。

    我描述的情况如下所示:

    DatafromMaster = 0x01;

    寄存器[0]= 0x01、寄存器[1]= 0x01、寄存器[2]= 0x01、... ,寄存器[n-1]= 0x01;

    --发送帧,周期时间过去----

    DatafromMaster = 0x02;

    寄存器[0]= 0x02、寄存器[1]= 0x02、寄存器[2]= 0x02、... 、寄存器[n-1]= 0x02;

    我认为它应该是:

    DatafromMaster = 0xFF;

    寄存器[0]= 0、寄存器[1]= 0x01、... 、寄存器[0xFE]= 0xFF。

     

    你怎么看?

    BR、
    Dawid。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Dawid、
    我没有时间从上面的一个帖子中查看 DC 使用问题,但根据您的建议,我们将在调试您上面有关 APPL_Application()触发的最新问题后再回答这些问题。

    输出从 PDI_ISR 或 SYNC0_ISR 或 MainLoop 调用的 PDO_OutputMapping()函数中的(ESC 存储器到本地 RAM)更新。 每当主器件更改输出变量时、都会向 ESC 发送一个帧、以便在 SM 缓冲区中更新输出。 现在、如果启用了相应的 SM 事件以生成 PDI IRQ 中断、则 PDI ISR 触发器和输出会更新。 这将导致 DatafromMaster 使用 SM 缓冲区中的值进行更新(=master 发送了一个帧以在 SM 缓冲区中更新此值)。

    现在、根据上述逻辑并根据我在 ET9300 SSC 文档中看到的内容、APPL_Application 的运行频率不可能比发生 SM2事件的频率高。 现在,如果从站堆栈代码正在退出 OP 模式并返回 OP 模式,则可能会看到此错误,并在 MainLoop ()中看到,在尚未启用中断且直流同步尚未激活时,可以调用 ECAT_Application()。

    对于 AM335x 主器件、您是否可以看到从节点是否正在脱离 OP 模式、我知道 TwinCAT 可以显示错误。 或者,您可以在从站堆栈中的 OP->SAFEOP 模式转换函数中放置一个断点,然后查看是否发生了这种情况,或者在来自 MainLoop ()的 ECAT_Application()调用中放置一个断点或计数器变量,然后查看是否发生了这种情况。

    好的问题:-)

    希望这对您有所帮助。

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

    我认为我已经接近解决我的问题了。 当我打开 SSC 工具并加载具有堆栈选项的 C28x 项目时、我发现参数 min_pd_cycle_time 在0x7A120上设置、即... 500us! 这是我可以使通信正确的最低 synct0时间! 我认为下一步应该是在 SSC 中更改该参数并导出 ESI 文件。
    但这里还有一件事我必须要问。 在 TwinCAT 中的 SmartView 中、当我使用 TI 提供的 ESI 文件上传 EEPROM 时、我可以在同步配置中看到该最小值。 同步周期时间设置为400us、我找不到何时更改此参数。 我认为这在我的问题上也很重要。 您知道何时可以更改它吗?

    BR、
    Dawid。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Dawid、
    在从器件上从主器件启用 DCX 之前、可以更改同步周期时间。 EEPROM/ESI 文件设置是默认设置、但主器件将能够为每个从节点配置它们。

    希望这对您有所帮助。

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

    Santosh、

    感谢你的帮助。 我能够做到你所写的,但首先我必须把脉冲长度从400 us 降至0.1 us。 为此、我对 TI 随用于 EtherCAT 的 controlCARD 套件提供的 XML 文件进行了一些更改。 现在、将具有 sync0周期时间的 DC 设置为50us 不会出现问题。

    感谢您的耐心和非常善良的帮助:)

    我的问题已解决。

    BR、
    Dawid。