HDNS2000光学感测芯片在运动检测中的应用
向和震颤的敏感度;但编程简单,不失为一种好方法。
本文采用的是查询方式,这种方式不占用任何中断,且能够不损精度地同时检测X向与Y向运动。前面已经提过,每个状态的最小保持时间为133μs,所以,只要将查询的周期控制在60μs之下就可以抓住每个状态的变化。对于AT90S8515,若按晶振为8MHz计算,则只需将查询周期汇编指令数控制在450条以下就可以了。实际上,以下给出的C语言程序经过编译后只有不大于60条汇编指令,完全能够满足系统要求。
该方法的基本思想是将状态机的前一状态与现在的状态组合在同一字节内,如表1所列,寻找其中的规律,简化程序设计。表1中以PRE开头的表示前一状态的对应值。
表1组合前后两状态在同一字节
位bit3210值XAXBPRE_XAPRE_XB位bit7654值YAYBPRE_YAPRE_YB
以X向移动为例(仅看前半字节),正向移动时对应的值为0b1000、0b1110、0b0111、0b0001,负向移动时对应的值为0b0010、0b1011、0b1101、0b0100。假设状态不变的情况已经排除,且查询周期足够短,不会出现相对周期的组合值。所以只要能将以上两组值区分开来就可以了,这也正是程序中两条条件判断语句的目的。读者可以对照程序自行验证。接口程序如下:
while(1){
state=PINA&0xcc;
state_change=state^pre_state;
combo_state=sate|(pre_state>>2);
if(state_change&0x0c)
{
if((combo_state&0x06)==0x06)
{asm("INCR20");gotonext;}
if((combo_state|0x09)==0x09)
{asm("INCR20");gotonext;}
asm("DECR20");
}
next:
if(state_change&0xc0)
{
if((temp&0x60)==0x60)
{asm("INCR21");gotoend;}
if((temp|0x90)==0x90)
{asm("INCR21");gotoend;}
asm("DECR21");
}
end:pre_state=state;}
程序已经事先定义了寄存器R20与R21分别为X、Y向的计数器,用来表示X、Y向移动的距离。以上程序段利用内嵌汇编语句优化了程序结构。实际上,还可以对编译器生成的汇编代码进行优化,这里就不再详述了。
结语
以上软硬件接口设计虽然是以功能强大的AVR单片机作为例子,但通过仔细分析不难发现,在简单的应用场合,用普通的51单片机,甚至如AT89C2051在12MHz晶振频率下也可以实现其功能。所以整个系统会是相当廉价的。
安捷伦公司最近在继HDNS2000之后,又推出了升级芯片HDNS2051和适于无线应用的芯片HDNS2030,除了更强的处理能力外,主要改进还在于采用了单电源供电,提供了省电模式,去掉了不实用的PS/2接口,引入了同步串行口,允许用户对分辨率进行设置等。这些改进极大地方便了用户的使用,一方面扩大了其光学感测芯片市场占有率,另一方面无疑也为机电产品设计者提供了一种更强大、更方便、更廉价的运动检测方案。
《HDNS2000光学感测芯片在运动检测中的应用(第2页)》
本文链接地址:http://www.oyaya.net/fanwen/view/140256.html
本文采用的是查询方式,这种方式不占用任何中断,且能够不损精度地同时检测X向与Y向运动。前面已经提过,每个状态的最小保持时间为133μs,所以,只要将查询的周期控制在60μs之下就可以抓住每个状态的变化。对于AT90S8515,若按晶振为8MHz计算,则只需将查询周期汇编指令数控制在450条以下就可以了。实际上,以下给出的C语言程序经过编译后只有不大于60条汇编指令,完全能够满足系统要求。
该方法的基本思想是将状态机的前一状态与现在的状态组合在同一字节内,如表1所列,寻找其中的规律,简化程序设计。表1中以PRE开头的表示前一状态的对应值。
表1组合前后两状态在同一字节
位bit3210值XAXBPRE_XAPRE_XB位bit7654值YAYBPRE_YAPRE_YB
以X向移动为例(仅看前半字节),正向移动时对应的值为0b1000、0b1110、0b0111、0b0001,负向移动时对应的值为0b0010、0b1011、0b1101、0b0100。假设状态不变的情况已经排除,且查询周期足够短,不会出现相对周期的组合值。所以只要能将以上两组值区分开来就可以了,这也正是程序中两条条件判断语句的目的。读者可以对照程序自行验证。接口程序如下:
while(1){
state=PINA&0xcc;
state_change=state^pre_state;
combo_state=sate|(pre_state>>2);
if(state_change&0x0c)
{
if((combo_state&0x06)==0x06)
{asm("INCR20");gotonext;}
if((combo_state|0x09)==0x09)
{asm("INCR20");gotonext;}
asm("DECR20");
}
next:
if(state_change&0xc0)
{
if((temp&0x60)==0x60)
{asm("INCR21");gotoend;}
if((temp|0x90)==0x90)
{asm("INCR21");gotoend;}
asm("DECR21");
}
end:pre_state=state;}
程序已经事先定义了寄存器R20与R21分别为X、Y向的计数器,用来表示X、Y向移动的距离。以上程序段利用内嵌汇编语句优化了程序结构。实际上,还可以对编译器生成的汇编代码进行优化,这里就不再详述了。
结语
以上软硬件接口设计虽然是以功能强大的AVR单片机作为例子,但通过仔细分析不难发现,在简单的应用场合,用普通的51单片机,甚至如AT89C2051在12MHz晶振频率下也可以实现其功能。所以整个系统会是相当廉价的。
安捷伦公司最近在继HDNS2000之后,又推出了升级芯片HDNS2051和适于无线应用的芯片HDNS2030,除了更强的处理能力外,主要改进还在于采用了单电源供电,提供了省电模式,去掉了不实用的PS/2接口,引入了同步串行口,允许用户对分辨率进行设置等。这些改进极大地方便了用户的使用,一方面扩大了其光学感测芯片市场占有率,另一方面无疑也为机电产品设计者提供了一种更强大、更方便、更廉价的运动检测方案。
《HDNS2000光学感测芯片在运动检测中的应用(第2页)》