ISP1032构成的光栅编码器计算机接口卡
发布时间:2007/9/8 0:00:00 访问次数:690
摘要:ISP1032是Lattice公司生产的ISP系列在线可编程器件中的一种,本文介绍了使用一片ISP1032芯片来设计光栅编码器计算机数据采集卡的硬件电路和设计方法,并给出了接口驱动程序。
关键词:ISP1032 光栅编码数据采集 接口 驱动
1 引言
光栅编码器的信号一般应由接口电路完成方向识别和脉冲计数后再送入计算机,由于还要进行地址译码和读取控制,因而线路比较复杂。笔者采用Lattice公司的ISP1032芯片完成了两个光栅编码器的数据采集功能,该设计方法使整个接口卡只要一块ISP1032即可,并且结构简单,无需调试。
2 接口卡组成
用Lattice公司的在线可编程工具ispEXPERTsystem结合ABLE语言进行图1中各线路功能的设计。
2.1 地址译码器设计
I111单元为地址译码器,来自总线的地址a0-a9以及io信号经组合可得到y3、y2、y1、y01、y6、y7六个输出信号,y6、y7是计数器I136、I137的复位信号,y01用作数据总线开通信号,y1用作高、低字节的选通信号,y3、y2作为RS触发器I136的置位、复位信号,I135的输出Q0用于两个计数器I136和I137的选择信号。下面是用ABLE编写的语言代码:
MODULE addr
TITLE'addr decoder'
a9,a8,a7,a6,a5,a4,a3,a2,a1,a0,ior pin;
y3,y2,y1,y01,y6,y7 pin istype'com';
equations
y7=(a9&a8&!a7&!a6&! a5&! A4&!a3&a2&a1&a0&!ior);
y6=(a9&a8&!a7&!a6&!a5&!a4&!a3&!a2&a1&a0&!ior);
y3=(a9&a8&!a7&!a6&!a5&!a4&!a3&!a2&al&a0&!ior);
y2=!(a9&a8&!a7&!a6&!a5&!a4&!a3&!a2&a1&!a0&!ior);
y1=(a9&a8&!a7&!a6&!a5&!a4&!a3&!a2&!a1&!a0&!ior);
y01=(a9&a8&!a7&!a6&!a5&!a4&!a3&!a2&!a1&!ior);
END
2.2 方向识别和计数功能设计
光栅编码器在转动时输出两相脉冲A、B,其相位关系反映了编码器的旋转方向,如图2所示。如果编码器沿着+n方向转动,则输出的波形是A先于B在上升沿出现(用实箭头标出);相反如果编码器沿着-n方向转动,则输出的波形是B先于A在上升沿出现(用虚箭头标出),这两种情况的判断是很容易的,因为只要比较A、B相脉冲上升沿出现的先后就可以了。但是如果编码器的运动是或进或退的,以上方向就不足以输出一个脉冲,而这一位置又恰好使得A(或B)相输出出现在脉冲边沿附近,这样就出现一相上升沿来后而另一相不时出现上升沿下降沿的情况,这时如果沿用前面方法,就不能判断编码器的运动方向,也不能准确记录编码器运动过的角度。
解决这一问题的办法是引入总线时钟信号osc,在每个osc周期内都对A的当前状态和B的前两个状态进行比较,采用D触发器I106、I107、I109和I110作为两个B相脉冲的前状态寄存器实现增减计数的逻辑表达式为:当((bb$bf)&a&!bb)为1时计数器加1,当((bb$bf)&a&!bb)为0时计数器减1。
摘要:ISP1032是Lattice公司生产的ISP系列在线可编程器件中的一种,本文介绍了使用一片ISP1032芯片来设计光栅编码器计算机数据采集卡的硬件电路和设计方法,并给出了接口驱动程序。
关键词:ISP1032 光栅编码数据采集 接口 驱动
1 引言
光栅编码器的信号一般应由接口电路完成方向识别和脉冲计数后再送入计算机,由于还要进行地址译码和读取控制,因而线路比较复杂。笔者采用Lattice公司的ISP1032芯片完成了两个光栅编码器的数据采集功能,该设计方法使整个接口卡只要一块ISP1032即可,并且结构简单,无需调试。
2 接口卡组成
用Lattice公司的在线可编程工具ispEXPERTsystem结合ABLE语言进行图1中各线路功能的设计。
2.1 地址译码器设计
I111单元为地址译码器,来自总线的地址a0-a9以及io信号经组合可得到y3、y2、y1、y01、y6、y7六个输出信号,y6、y7是计数器I136、I137的复位信号,y01用作数据总线开通信号,y1用作高、低字节的选通信号,y3、y2作为RS触发器I136的置位、复位信号,I135的输出Q0用于两个计数器I136和I137的选择信号。下面是用ABLE编写的语言代码:
MODULE addr
TITLE'addr decoder'
a9,a8,a7,a6,a5,a4,a3,a2,a1,a0,ior pin;
y3,y2,y1,y01,y6,y7 pin istype'com';
equations
y7=(a9&a8&!a7&!a6&! a5&! A4&!a3&a2&a1&a0&!ior);
y6=(a9&a8&!a7&!a6&!a5&!a4&!a3&!a2&a1&a0&!ior);
y3=(a9&a8&!a7&!a6&!a5&!a4&!a3&!a2&al&a0&!ior);
y2=!(a9&a8&!a7&!a6&!a5&!a4&!a3&!a2&a1&!a0&!ior);
y1=(a9&a8&!a7&!a6&!a5&!a4&!a3&!a2&!a1&!a0&!ior);
y01=(a9&a8&!a7&!a6&!a5&!a4&!a3&!a2&!a1&!ior);
END
2.2 方向识别和计数功能设计
光栅编码器在转动时输出两相脉冲A、B,其相位关系反映了编码器的旋转方向,如图2所示。如果编码器沿着+n方向转动,则输出的波形是A先于B在上升沿出现(用实箭头标出);相反如果编码器沿着-n方向转动,则输出的波形是B先于A在上升沿出现(用虚箭头标出),这两种情况的判断是很容易的,因为只要比较A、B相脉冲上升沿出现的先后就可以了。但是如果编码器的运动是或进或退的,以上方向就不足以输出一个脉冲,而这一位置又恰好使得A(或B)相输出出现在脉冲边沿附近,这样就出现一相上升沿来后而另一相不时出现上升沿下降沿的情况,这时如果沿用前面方法,就不能判断编码器的运动方向,也不能准确记录编码器运动过的角度。
解决这一问题的办法是引入总线时钟信号osc,在每个osc周期内都对A的当前状态和B的前两个状态进行比较,采用D触发器I106、I107、I109和I110作为两个B相脉冲的前状态寄存器实现增减计数的逻辑表达式为:当((bb$bf)&a&!bb)为1时计数器加1,当((bb$bf)&a&!bb)为0时计数器减1。
上一篇:5V双RS232驱动器/接收器