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.

[参考译文] TMS320F28379S:EnDat 库问题

Guru**** 2539500 points


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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/848658/tms320f28379s-endat-library-problem

器件型号:TMS320F28379S

你好

在使 BiSS 库正常工作后、我将面临 EnDat 问题。

由于 CRC 校验、在延迟补偿期间接收到的数据会损坏。

我会注释"ESTOP0"指令以继续。

然后我接收数据位置、但 CRC 也总是很糟糕。

然后、我读取 SPI 信号。

CH1黄色:GPIO 6 EnDat 传感器时钟

CH2:蓝色:GPIO 7 SPI 从时钟

CH3:GPIO 34 ENDAT_DIR

CH4:绿色:SPISIMO = ENDAT_DIN

我读取 SPI 配置寄存器、极性= 1、CLKPHASE = 0。 这意味着"无延迟下降沿"、因此当 EnDatSensor 在其时钟的上升沿更新数据时、输入数据在 SPI 时钟上升沿进行采样。

但根据示波器、SPI 的上升沿接近传感器的上升沿。 我认为 SPI 输入有一些时间错误采样、因为上升沿会快速变化?

接收上述范围的 SPI 数据为:0x0031、0x872C、0xA497。 有些字是可以的、但有些字是坏的、在 SPI 数据中、我的内容是:0x0031 A69C 1D24

计算出的补偿延迟(即使 CRC 不良也是如此)为13。

SPI 时钟始终设为200kHz (不更改为8MHz…… 但在8MHz 时也存在相同的问题)

是 HEIDENHAIN EQI1331

谢谢

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

    您好!

    很高兴听到您让 BiSS-C 接口正常工作。 感谢您提供详细的图表。

    我想知道为什么接收到的 CRC 始终是固定的数字-编码器响应是有效的响应还是错误响应?
    此外、

    [引用用户="A GIR"]I 读取 SPI 配置寄存器、极性= 1、CLKPHASE = 0。 然后、这意味着"无延迟下降沿"、因此当 EnDatSensor 在其时钟的上升沿更新数据时、输入数据在 SPI 时钟上升沿进行采样。[/QUINT]

    正如您所注意到的、SPI CLK 和编码器时钟将以不同的相位运行以正确捕获数据(用于延迟补偿)。
    由于某种原因、波形的相位对齐似乎不正确。  
    可以手动更改 极性和 CLKPHASE 值、看看是否正确捕获了数据值?
    您还可以尝试更改 delay_comp 值、但这似乎不是问题、因为您会看到低频时失败、即使没有延迟补偿也是如此。

    您是否在测试中使用了长电缆?


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

    您好!

    我使用的是2m câble。

    我尝试使用8.33MHZ 的时钟(ENDAT_RUNTIME_FREQ_DIVIDER = 6)、相位看起来更好。 这意味着在低频时、在计算相位延迟时会出现问题?

    但当 ENDAT_RUNTIME_FREQ_DIVIDER = 6时、最后一个时钟脉冲会更短!... 这很奇怪

    因此、我将 ENDAT_RUNTIME_FREQ_DIVIDER 设置为7。 (= 7.14MHz)

    时钟相位似乎正常。

    库的测量延迟为13 (= 130ns?)。 如果我理解、该延迟是在时钟的上升沿和位开始上升沿之间测量的。 在示波器中、我测得的值为124ns。 (屏幕截图)

    请注意、该延迟与我的频率(T = 140ns)近似对应。 这就是为什么可能会混淆范围的原因、因为我们必须牢记 Endat 时钟和接收到的数据之间的130ns 延迟。

    这就是为什么在屏幕截图中、我们可以看到 SPI 时钟的脉冲大约比时钟 Endat 的最后一个脉冲晚1个周期。

    我尝试将 DELAY_COMPENS 设置为0、而不是13 (在调用 PM_endat22_setFreq 之前)、因为 DELAY_COMPENS 似乎仅通过调用 PM_endat22_setFreq 函数来获取。 我是对的?) 但0、而不是13、提供的图形实际上是相同的... 为什么???。

    因此、如果我 Undestand、SPI 时钟在检测到 MOSI 后启动(Start 位)以接收位置数据。 起始位后面是 E1 EN E2位。

    有时这些位为0。 但很多时候、一个或两个都是1!... (但在软件中、从不设置变量 error1或 error2。)

    然后、当两者都为0时、获取下图。

    从 SPI 的角度来看、我得到以下序列位(48位= 3x 16位):

    0000 0000 0000 0000 0011 1110 0111 0010 0100 1010 0100 1111 0110

    这对应于 Hexa 代码03 E724 A4F6。 这是我接收到 SPI 缓冲器中的正确方法:RDATA =[0x0003、0xE724、0xA4F6]

    然后、该序列对应于以下格式:

    0000 0000 0000 0;00 - 000 1111 1001 1100 1001 0010 1001 0011 -1 1011-0 (Tx 路;E1 E2 -位置31位- CRC -最后一个(根据 TM 为高电平或低电平)

    类似位的顺序为反向(MSB/LSB)、恢复序列提供以下内容:

    0 - 1 1011 - 110 0100 1010 0100 1001 1100 1111 1000 - 00;0 0000 0000 (X - CRC - Pos 31位- E2 E1;TX 路)

    提供十六进制代码:0x1B - 0x64A4 9CF8

    但是、在调用 PM_endat22_receiveData 后:

    -position_lo 获取0x49 49 39 F0

    -数据= 0

    - DATA_CRC = 0x001D

    -调用 PM_endat22_getCrcPos 后、crc5_result = 0x000B

    如果我们读取上述序列并将其移动到1位的左侧、我们得到:

    01 - 10111 - 100 1001 0100 1001 0011 1001 1111 0000 - 00; 0000 0000 (XX - CRC - Pos 31位- E2 E1;TX 路)

    =>十六进制位置代码提供:0x49 49 39 F0 === equal position_lo

    总帧数:

    放大起始位和延迟(124ns)

    缩放最后一个端点时钟、其中的行应在传播延迟时间之后设置为1。  但是要过0!...

    那么、我不知道如何使工作正常。 我不知道如何解决问题?...我的问题在哪里?

    根据设定的频率、一些时钟看起来不同、相位/延迟、得到结果。 要更好地了解 EnDat 库的行为/代码、这并不容易...

    TI 如何为我提供帮助?:

    当 e1、e2位为0时、CRC 计算结果很差、很多时候、E1/e0中的一个被置位。??

    但是:我一直使用库获取的 Multiturn/monoturn hexa 代码来计算"电机位置":它始终是共存的。 当转子执行1圈时、位置改变1圈...

    注意:对于 exemple:spiRxFifoIsr:循环在 i = 0到 i<= FIFO_SIZE 之间完成

    我认为我们应该从 I = 0写入到 I< FIFO_SIZE

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

    你好

    我有一些消息。

    实际上、如果我调用函数 endat22_setupAddlData、然后在主循环中、我调用函数 endat22_readPositionWithAddlData、这是有效的。 但始终设置误差2。

    但是、如果我调用 endat21_readPosition 函数来仅获取不带额外数据的位置:CRC 失败...

    调用 PM_endat22_getCrcPos 时更改此函数、将参数 ENDAT21更改为 ENDAT22、但未成功。

    是否可以在 endat2.2中使用简单的 GetPosition 指令? 我认为是的!??

    其他尝试、进入 endat22_setupAddlData;调用 PM_endat22_setupCommand 和 PM_endat22_receiveData 时、我将最后参数设置为2 x 0 (添加数据)

    但 CRC 在半个小时内是糟糕的。 示波器非常奇怪、1次传输正常、然后时钟脉冲在15ms 内保持。 然后新的转换开始..

    如何使用 Endat2.1指令仅获取 EnDat2.2的位置。 必须将任何内容更改为 endat22_setupAddlData 以禁用其他数据?

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

    您好!

    [引用 user="a GIR]实际上、如果我调用函数 endat22_setupAddlData、然后在主循环中调用函数 endat22_readPositionWithAddlData、则可以这么做。 但始终设置错误2。

    这是编码器的属性吗? 我想知道不使用其他数据的 ENDAT21命令是否会导致不同的行为。
    据我了解、如果编码器支持 ENDAT22命令、ENDAT21命令应该是支持的命令的子集、并且应该按预期工作。 我不知道 EnDat21命令需要任何特殊处理。
    实际上、删除其他数据与 endat21_readPosition 相同。 我已经对 ENDAT22编码器 ROC25进行了测试、测试了这两条命令、无论是否有额外的数据、都可以正常工作。
    关于错误2 -请检查编码器协议规范中的预期值。 我认为、默认情况下、某些编码器会发送 error1=0、error2=1。
    如果 CRC 匹配、我希望接收到的值正确。

    从您之前的帖子中-
    我想知道线路上是否有任何干扰会破坏数据采集、甚至可能导致延迟补偿计算错误。
    但是、既然您说 endat22_setupAddlData 正在工作、那么所有接口命令的时序完全相同。 有些命令应该起作用、有些命令不起作用是没有理由的。
    如果从您的波形来看、您感觉 SPI 时钟比预期的要早-我建议出于测试目的、您单独为 SPI 时钟输入启用 GPIO 同步器。 这应该会增加几个周期的延迟以及数据输入。