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 库。 命令集2.1/2.2

Guru**** 2539500 points


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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/914680/tms320f28379s-endat-library-command-set-2-1-2-2

器件型号:TMS320F28379S

您好!

我已经在传播延迟上发布了一些关于 Endat 库的问题。

但我遇到了一个奇怪的问题。 如果我发送命令2.2:Encoder_send_position_values_with _addition_data,它是可以的,但如果我发送命令2.1:Encoder_send_position_Values,则接收位置是可以的,但计算得出的 CRC 与接收的 CRC 不一样!

下面是初始阶段和运行阶段 I Apply、从以下示例中提取:

初始化阶段

具有复位功能的相位等...

(void) PM_endat22_setupCommand (selection_of_memory_area、0xA1、0x5555、0);/* data1=MRS; Data2=any */
PM_endat22_startOperation ();
Wait endat22Data.dataReady = 1
(void) PM_endat22_receiveData (selection_of_memory_area、0);
CRC5_Result = PM_endat22_getCrcNorm (endat22Data.address、endat22Data.data、endat_EnDCRat_Table);
-> CRC 正常


(void) PM_endat22_setupCommand (ENCODER_SEND_PARAMETER、0xD、0xAAAA、0);/* data1=address; Data2=any */
PM_endat22_startOperation ();
Wait endat22Data.dataReady = 1
(void) PM_endat22_receiveData (Encoder_send_parameter、0);
CRC5_Result = PM_endat22_getCrcNorm (endat22Data.address、endat22Data.data、dV_EnDCRat);
-> CRC 正常
-> endat22Data.Position_Clocks = endat22Data.data 和0x0FF;


(void) PM_endat22_setupCommand (Encoder_send_position_values_with _additional_data、0、0);
PM_endat22_startOperation ();
Wait endat22Data.dataReady = 1
(void) PM_endat22_receiveData (Encoder_send_position_values_with _additional_data、0);
CRC5_Result = PM_endat22_getCrcPos (endat22Data.position_Clocks、ENDAT22、endat22_lo 和 endat22Data.Position
endat22Data.position_hi、endat22Data.error1、endat22Data.error2、DV_EnDat_CRCTable);
-> CRC 为"正常
" Delay1 = PM_endat22_getDelayCompVal

(void) PM_endat22_setupCommand (encoder_se_position_values_with _additional_data、
start0);PM Operation 0、endat0 (start0)
等待 endat22Data.dataReady = 1
(空) PM_endat22_receiveData (编码器_send_position_values_with _additional_data、0);
CRC5_Result = PM_endat22_getCrcPos (endat22Data.POSIT_Clocks、ENDAT22、endat22Data.POSITION _lo、
endat22Data.position_hi、endat22Data.error1、endat22Data.error2、DV_EnDat_CRCTable);
-> CRC 为正常
Delay2 = PM_endat22_getDelayCompVal

DV_EnDat_Data.delay_comp =(Delay1 + Delay2)>> 1; 

那么这个初始化阶段对我来说是可以的。

之后是两个解决方案。 起作用的第一个因素是:

(void) PM_endat22_setupCommand (ENCODER_SEND_POSITION 值带有_additional_data、0、0、0);
PM_endat22_startOperation ();
等待 endat22Data.dataReady = 1
(空) PM_endat22_receiveData (编码器_send_position_values_with _additional_data、0);
CRC5_Result = PM_endat22_getCrcPos (endat22Data.POSIT_Clocks、ENDAT22、endat22Data.POSITION _lo、
endat22Data.position_hi、endat22Data.error1、endat22Data.error2、DV_EnDat_CRCTable);
-> CRC 正常 

然后我得到位置正常。

导致 CRC 比较不良的第二个因素:

(void) PM_endat22_setupCommand (ENCODER_SEND_POSITION、0、0、0);
PM_endat22_startOperation ();
等待 endat22Data.dataReady == 1
void) PM_endat22_receiveData (编码器_send_position_Values、0);
CRC5_Result = PM_endat22_getCrcPos (endat22Data.POSITION 时钟、ENDAT21*、endat22Data.Position_lo、
endat22Data.position_hi、endat22Data.error1、endat22Data.error2、DV_EnDat_CRCTable);

-> CRC 不正常、但读取位置正常、随着电机移动而移动... 

*使用 ENDAT22进行色带,结果相同。

在初始化阶段还是在使用 endat 2.1命令读取位置的序列中、我遇到了问题吗?

此命令的目的是减少 SPI 总线的使用、因为传输的字节更少、这种速度更快。 !!

谢谢

 

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

    您好!

    但是、您可以尝试以下操作吗?

    如果您使用的是下面的 ENDAT21
    CRC5_RESULT = PM_endat22_getCrcPos (endat22Data.Position_Clocks、ENDAT21*

    您应该在 endat.h 中设置#define Encoder_type 21 不确定是否已设置此项。
    此外、如果您这么做、结果是什么、

    CRC5_RESULT = PM_endat22_getCrcPos (endat22Data.Position_Clocks、 ENDAT22

    您可以在 endat.h 和 PM_endat22_getCrcPos 函数调用中保留相同的类型定义。
    请注意 、ENCODER_SEND_POSITION 值也是 ENDAT22中的有效命令。 它向后兼容。

    我不能完全确定为什么您以任何方式看到 CRC 不匹配。
    编码器是否对 EnDat21模式使用不同的 CRC 多项式? 也请检查编码器规格。

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

    define ENCODER_TYPE 仅用于发送某些命令扩散的示例。

    但在本示例中、以下是注释:

    //启用附加数据1 -读取否  以移出位置值
    // MRS 代码0x45   -确认内存内容 LSB

       retval1 = PM_endat22_setupCommand (ENCODER_SEND_POSITION 值_AND_SELECTION _of_the _memory_area、0x45、0、0);
    (笑声)

    //启用附加数据2—读取运行状态和错误源
     // MRS 代码0x59   -附加数据上的操作状态2.
     //此命令之后,在该命令之前启用的附加数据为1。2.
       retval1 = PM_endat22_setupCommand (ENCODER_SEND_POSITION 值_AND_SELECTION _of_the _memory_area、0x59、0、1);
    (笑声)

    //读取位置值,之前启用2个附加数据
    //此时启用的附加数据为2
       retval1 = PM_endat22_setupCommand (ENCODER_SEND_POSITION 值_ITH_additional_data、0、0、2);
    (笑声)

    此配置是否位于 EnDat 编码器的非易失性存储器中? 这可能说明我的编码器具有一些强制性的附加参数... 如果是、我不知道在何处发送 DE 代码值("MRS"代码)以返回到"无附加"数据...

    我认为我的编码器符合 HEIDENAIN 规格:

    https://www.heidenhain.fr/fileadmin/pdb/media/img/383942-28_EnDat_2-2_en.pdf

    我没有看到任何有关 CRC 多项式的注释、那么我不知道它、我不知道它是否与2.1和2.2相同?...

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

    您好!

    a GIR 说:
    define ENCODER_TYPE 仅用于发送某些命令扩散的示例。[/quot]

    没错。 但我还要说的是、您对命令使用相同的编码器类型

    CRC5_RESULT = PM_endat22_getCrcPos (endat22Data.Position_Clocks、 ENDAT22

    数据位的位置在接收数据的 endat22和 endat21格式中可能不同。
    您是否尝试过此操作?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    是的、我使用 ENDAT22和 ENDAT21都尝试过、但没有成功。

    可能是、我将使用示波器进行测试并读取真实帧、以查看它是否与库中接收到的数据一致。

    此外、有人知道什么是 CRC 多项式?

    我的想法是、编码器棒发送位置和附加数据、但正如我们向驱动程序询问的那样、我们只读取位置的位数、我们获取"附加"数据、如 CRC。然后我们不读取帧的末尾... 可能是因为这没有意义、因为我们发送指令只读取位置。

    如果我知道 CRC 多项式、我可以使用示波器读取真实帧、并确定编码器是否发送了良好的 CRC。。

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

    您好!

    [引用 user="a GIR"]此外,是否有人知道什么是 CRC 多项式?

    通常、ENDAT 的 CRC 多项为0xB。  
     这也在 PM_endat22_Include.h 文件中定义为 ENDAT_CRC_POLEYNONYAL