欢迎来到天天文库
浏览记录
ID:40517030
大小:373.25 KB
页数:9页
时间:2019-08-04
《2013.7 多摩川编码器总结》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、2013.7多摩川编码器总结一、摘要基于CPLD和DSP实现CPLD与多摩川编码器的通讯,通过对编码器发送请求,得到编码器发回的数据并进行解码,得到绝对位置值。二、学习步骤:1、熟悉工作环境,掌握Modelsim以及Quartus的使用。2、阅读多摩川编码器的通讯协议。3、根据协议编写testbench,并在Modelsim上进行仿真调试。4、仿真通过后,通过Quartus编译后下载到CPLD上并与编码器通讯,实际情况下运行。5、完成各项要求的功能。6、对代码进行优化,尽可能减少资源占用。7、验收。三、总体结构结构分三部分:多摩川编码器,CPLD,DSP。1、编码器跟CPLD之间通过M
2、AX485电平转换进行连接。2、CPLD与DSP则通过总线进行连接(这一部分结构编写学长已经完成并且提供了端口连接)3、主要工作是CPLD的解码部分。四、通讯协议1、TS5668的技术指标:(物理层)精度:单圈精度:17位(131072)多圈精度:16位(65536)最高转速/(r·min-1):6000】输出:差分NRZ编码二进制传输速度/Mbps:2.5发送、接收电路:差分形式通信方式:主从模式接口:3FG,4sig+,5sig-,7VCC,8DGND。4和5为差分信号接口。2、通信步骤如下图:(逻辑链路层)1)CPLD向编码器发送一个控制字CF2)3us后编码器返回数据包。3)C
3、PLD对数据包进行解码,并将得到的数据放在总线上,等待DSP获取。具体流程如下图:3、字的结构:下图分别为CF、DF、CRC字的结构。1)CF字的开始位为0,再是010的同步位,以及4位的控制位,1位奇偶校验位(对控制位进行奇偶校验),结束位为1,共十位。通过不同的DataIDcode可以实现不同的功能,具体功能如下表:2)SF该字包含错误信息,如编码错误和通讯警报。通过检测相应位置上的值,就可以确定编码器的工作状态是否正常。3)CRC进行CRC校验时,要对所有数据进行校验。计算时除掉每字的起始位和分隔符。4)数据传输正如CF介绍中提到,不同的CF控制命令会对应不同的数据结构传输。主要
4、有三类,而我们用的是DataID0,绝对数据传输。后面的空格表明没有数据传输。数据传输中,低位在前,高位在后,每一字都是以0开始以1结束。由于是17位精度编码器,DF2数据位的高7位都是0。五、需求分析1、启动DSP每隔60us向CPLD发送一个启动脉冲,CPLD捕捉到上升沿后开始向编码器发送CF请求命令。如果CPLD已经处于发送或接受状态,再接收到启动脉冲,不予响应。2、485使能由于CPLD与编码器的通讯需要MAX485进行电平转换,而MAX485是一个半双工器件,因此,需要提供一个端口控制485的使能端,决定485的读写控制。3、频率要求板子上提供10M频率的时钟,而多摩川编码器
5、的通讯协议需要2.5M频率时钟,因此需要分频。4、异常情况分析考虑到传输过程中的异常情况(比如把“0”传输成“1”,或者反之),以及其他可能会出现的错误情况。1)编码器接受到错误的CF,给出了相应的回应。2)编码器接受到错误的CF,没有回应。3)编码器自身出现错误(在SF中会给出错误类型)。5、与DSP的通讯得到绝对位置值之后,需要将读取的结果发送给DSP,而这一过程需要提供一个端口使CPLD与DSP连接。六、整体设计1、流程图基于多摩川编码器的通讯协议以及需求分析,可以做出以下流程图。闲置有启动脉冲无响应或无正确响应发送CF正确完成一周期或错误结束一周期等待响应有正确响应接收数据处理
6、数据2、分配状态根据流程图,可以通过“状态机”来完成各个状态之间的切换,因此,分配状态为:Idle(闲置),Request(请求),Wait(等待),Receive(接收)四个状态。状态机的编写有一段式、两段式和三段式,这里状态比较简单,可以采用结构简单的一段式。(对于复杂的状态机,不推荐使用一段式)具体写法如下:reg[1:0]stateparameterIdle=2'b00,Request=2'b01,Wait=2'b10,Receive=2'b11;…case(state)Idle:…Request:…Wait:…Receive:…3、闲置状态CPLD处于闲置状态,等待DSP发送
7、命令。当DSP发送启动脉冲后,CPLD检测到上升沿,即由闲置状态进入请求状态,同时,为请求状态做好初始化准备。而在其它状态检测到上升沿时,则不予响应。具体代码如下:1)检测启动脉冲always@(posedgestartorposedgestart_fg1)beginif(start==1)start_fg<=1'b1;if(start_fg1==1)start_fg<=1'b0;end2)状态更改并为请求状态做好初始化准备Idle:begin
此文档下载收益归作者所有