求教如何接收EnDat接口数据 点击:2443 | 回复:8



小强

    
  • 精华:0帖
  • 求助:0帖
  • 帖子:2帖 | 31回
  • 年度积分:0
  • 历史总积分:111
  • 注册:2009年8月15日
发表于:2009-09-21 22:08:01
楼主

小生学习伺服,请各位大虾多多支持啊

海德汉的绝对式编码器EnDat接口,我们使用DSP是怎样接收数据的呢?

据说海德汉有专门的配套芯片用来接收数据的,但价格比较贵。查阅网上资料都是FPGA或者CPLD来配合DSP接收。

 

请大虾们给小弟指几条“明路”,我们现在需要电机转子的角度值,大体上有些什么方法实现呢?

有没有可能不使用CPLD和FPGA,EnDat出来到差分接收器,DSP直接通过串行接口来接收数据呢?

先谢过 (:




波恩

  • 精华:3帖
  • 求助:0帖
  • 帖子:10帖 | 2797回
  • 年度积分:0
  • 历史总积分:3
  • 注册:2008年12月10日
发表于:2009-09-22 19:49:12
1楼
基本上没有可能,EnDat用一套特有的同步串行传输协议,帧格式迥异于异步串口,也许可以用SPI口把数据弄出来,但没听说过有谁这样试(成)过。

小强

  • 精华:0帖
  • 求助:0帖
  • 帖子:2帖 | 31回
  • 年度积分:0
  • 历史总积分:111
  • 注册:2009年8月15日
发表于:2009-09-30 20:01:08
2楼

看海德汉的说明书,给了下面几张图,貌似说的挺清楚了

是不是这里面还有很多玄机啊............

中断模式时序

连续模式时序
与后续设备连接图

波恩

  • 精华:3帖
  • 求助:0帖
  • 帖子:10帖 | 2797回
  • 年度积分:0
  • 历史总积分:3
  • 注册:2008年12月10日
发表于:2009-10-08 18:02:55
3楼

如果楼主手里有EnDat的编码器就不妨直接咨询海德汉的人,因为楼主已然是其客户了。

ldllh

  • 精华:0帖
  • 求助:0帖
  • 帖子:0帖 | 1回
  • 年度积分:0
  • 历史总积分:11
  • 注册:2011年4月06日
发表于:2011-06-02 13:52:26
4楼
各位大侠,请教用FPGA来配合DSP(TMS320F2812)接收数据的接口电路!

波恩

  • 精华:10帖
  • 求助:0帖
  • 帖子:203帖 | 11028回
  • 年度积分:0
  • 历史总积分:36300
  • 注册:2003年6月12日
发表于:2011-06-02 19:55:05
5楼

听说有人用DSP的SPI口仿EnDat时序读出EnDat编码器的反馈信息。

xinying5213

  • 精华:0帖
  • 求助:0帖
  • 帖子:7帖 | 2回
  • 年度积分:0
  • 历史总积分:18
  • 注册:2007年9月15日
发表于:2011-08-16 16:18:54
6楼

#define SIMO GpioDataRegs.GPBDAT.bit.GPIO54
#define SOMI GpioDataRegs.GPBDAT.bit.GPIO55
#define Clock GpioDataRegs.GPBDAT.bit.GPIO56
#define SPI_CS GpioDataRegs.GPBDAT.bit.GPIO57

Uint16 cycle;
Uint16 MRS,Addr,CRC;

Uint16 main()
{
delay(10);
InitSysCtrl();
InitXintf16Gpio();
// Disable CPU interrupts
DINT;

InitPieCtrl();

// Disable CPU interrupts and clear all CPU interrupt flags:
IER = 0x0000;
IFR = 0x0000;

InitPieVectTable();

InitSpiaGpio();



MRS=0;
Addr=0;
CRC =0;


while(1)
{
Reset_Encoder();

delay(50);
cycle = cycle%16;
LED=cycle;
cycle++;
}
}



void Reset_Encoder(void) // DSP发送数据
{ Uint16 i;

MasterStartSend();

SPI_CS=1; //主发送状态

send_bits(6,0x2a);
send_bits(8,0x81);
send_bits(16,0x8001);

SPI_CS=0; //主接收状态

MasterStartReceive();
receive_bits(8,MRS);
receive_bits(16,Addr);
receive_bits(5,CRC);

Clock=1;
delay_us(5);



delay_us(30);


}

void MasterStartSend(void)
{ Clock=0;
delay_us(5);
Clock=1;
delay_us(5);


Clock=0;
delay_us(5);
Clock=1;
delay_us(5);
}
void send_bits(Uint16 length,Uint16 bits) //下降沿发送数据 先高后低
{ Uint16 i;

Clock=0;
for(i=0;i<length;i++) // -------

{ // |
SIMO=bits >> (length-i-1);
delay_us(5);
Clock=1;
delay_us(5);
Clock=0;
}

// |
// |
}
void MasterStartReceive(void)
{
Clock=0;
delay_us(5);
Clock=1;
delay_us(5);


Clock=0;
delay_us(5);
Clock=1;
delay_us(5);

Clock=0;
delay_us(5);
Clock=1;
delay_us(1);


while(SOMI !=1)
{

delay_us(4);
Clock=0;
delay_us(5);
Clock=1;
delay_us(1);



}

delay_us(4);
Clock=0;
delay_us(5);


}

void receive_bits(Uint16 length,Uint16 bits) //上升沿接收数据 先低后高 length<16
{ Uint16 i;
 bits=0;
 Clock=1;
 delay_us(1);
 for(i=0;i<length-1;i++)            //  -------
 {                                 //       |
  bits+=SOMI>>i;                //        |
     delay_us(4);                  //       |                           
  Clock=0;                     //        --------
  delay_us(5); 
  Clock=1;
  delay_us(1);

xinying5213

  • 精华:0帖
  • 求助:0帖
  • 帖子:7帖 | 2回
  • 年度积分:0
  • 历史总积分:18
  • 注册:2007年9月15日
发表于:2011-08-16 16:31:06
7楼

上述是我用IO模拟endat的程序,但是收到ECN1313的回复只有高阻态。主设备发送给编码器的刚开始的2T是主设备发送使能还是接收使能?主设备发送给编码器的模式指令之后的2T是主设备发送使能还是接收使能?具体的主设备的发送使能和接收使能变换点在哪?上面的程序是我编码器上电后Encoder to Receive Reset的指令,在示波器上观察发现在主设备变为接收状态时主设备接收到的数据都是高阻态,不知怎么回事?还请高手指点。

维修伺服电机

  • 精华:0帖
  • 求助:0帖
  • 帖子:0帖 | 9回
  • 年度积分:0
  • 历史总积分:33
  • 注册:2012年2月28日
发表于:2012-03-18 15:30:10
8楼

那位朋友有EnDat 2.2的详细说明的技术文档啊,不是《EnDat 2.2-位置编码器的双向数字接口》,它没有说明很多细节。本人也在用并行IO端口模拟EnDat 2.2,


热门招聘