应用笔记 5030

在手持式触摸屏系统中增添接近检测传感器

By: Ilya Veygman

摘要 : 本应用笔记讨论了Maxim MAX44000接近检测传感器在手持式触摸屏应用中的优势,介绍了设计中的注意事项。包括如何降低系统中的串扰、改善噪声抑制、减轻应用处理器的负荷。附录给出了有关门限滞回设置的C程序代码。

为什么使用接近检测传感器?

触摸屏已普遍用于各种手持式电子设备,不仅仅局限于智能手机。触摸屏在大大改善设备功能性的同时,也带来了诸多新的挑战,包括知道如何以及何时响应触摸屏操作。例如,当手机靠近用户脸颊时,屏幕必须了解如何对其做出反应;否则,触摸屏无意接触到人耳或脸颊时,可能会被错误地解析成用户输入。
为了避免这一问题,最常见的方法是在手机上集成一个接近检测传感器(同时也增加了设备功能)。当接近检测传感器的读数达到一定的门限要求,而且用户正在通电话时,传感器可以关闭触摸屏。
相对于分立式解决方案,提供数字输出的红外接近检测传感器芯片(例如MAX44000)大大简化了这一功能的实施。

Maxim接近检测传感器的关键优势

Maxim的接近检测传感器具有众多优势。举例来说,红外发射器配置为吸电流,而非源出电流。便于用户合理选择LED的供电电压,优化LED性能和功耗(图1)。
图1. MAX44000典型电路,包括LED。
图1. MAX44000典型电路,包括LED。
由于MAX44000系列产品提供I²C接口,可以方便地通过这一灵活的总线将传感器集成到多数嵌入式系统。此外,器件支持硬件中断。这两项功能可确保传感器无缝集成到大多数手持设备,同时也将传感器信息处理所占用的处理器资源降至最少。
不仅如此,Maxim的接近检测传感器还内置了更多功能。例如,MAX44000在6引脚单芯片内集成了环境光检测传感器和接近检测传感器。诸如此类的解决方案避免了在实现全部光传感器功能是使用多个传感器。

设计考虑

MAX44000采用小尺寸、2mm x 2mm x 0.6mm、UDFN-Opto封装,有助于用户节省尺寸敏感应用的空间。此外,传感器提供LED驱动电路,但需要用户提供发射二极管的供电电源。吸电流配置下,该电路可驱动0mA至110mA电流流过发射二极管,无需外部电路既可完成这一任务。
图2. MAX44000典型电路,带有发射器旁路。
图2. MAX44000典型电路,带有发射器旁路。
使用该功能时需要谨慎设计,特别是当驱动电流较大时。短时间的大电流驱动脉冲使得电源上出现尖峰电流,可能在MAX44000周围产生噪声。有两种方式解决这一问题:对发射二极管进行去耦,或将MAX44000的电源与发射二极管电源隔离开。去耦电容的优点是价格便宜,但缺点是必须非常靠近MAX44000和发射二极管安装。由于这一方式多数情况下足以解决上述问题,终端用户应首先尝试这一方案,然后再考虑采用替代方案。图2所示电路同时采用了两种方案,当然,实际应用中并不需要这样。
设计者必须仔细考虑玻璃对接近检测传感器的影响。绝大多数智能手机屏幕上都带有一个玻璃罩,而且有些手机使用的是黑色玻璃。玻璃对光传感器的影响主要表现在两个方面:首先,应该考虑入射到IC环境光传感器的光强有所衰减;其次,LED的发射光经过玻璃反射后重新回到传感器,由此可能引入一定串扰(图3)。
图3. 串扰示意图—无挡光板。
图3. 串扰示意图—无挡光板。
图4. 简单挡光板的例子。
图4. 简单挡光板的例子。
缓解这一问题的方法有许多种,一种方式是在发射器和接收器之间安装挡光板(图4),可大幅降低反射后注入传感器的光强;另一种方式是使发射器和接收器尽量靠近玻璃,确保电路板没有反射。

开/关门限的设置

将接近检测传感器集成到系统后,一个经常遇到的问题是如何正确选择接近检测的门限,以便在用户通话期间打开或关闭屏幕。门限设置须确保出现错误判断的几率非常低,而且能够支持绝大多数使用者的情况。例如,对于浅色头发的用户,当手机的接近检测传感器面向头发的方向靠近时,所反射的信号强度要远远高于深色头发。
MAX44000的接近检测传感器对于标准的850nm IR发射器具有出色的灵敏度(2.7nW/cm²/LSB)。这意味着MAX44000不仅可以在黑色玻璃的下方有效检测信号,对于深色头发的用户同样可以保持有效的信号检测。此外,MAX44000的接近检测传感器能够抑制高达100,000 lux的直射太阳光强,确保室外环境下的工作性能。
最后一项需要考虑的因素是对传感器增加一个滞回,采取这一措施的原因与在比较器电路增加滞回的原因相同。当输入信号恰好位于门限附近时,任何噪声都会造成输出信号的随机切换,这是我们不希望发生的现象。接近检测传感器也是如此。
一种简单(但功耗较大)的软件实施方案是定期轮询传感器,如果超出门限的计数值达到一定限值,而且屏幕是打开的,则关闭屏幕;否则,如果屏幕已关闭,则将其打开。初看起来这种方式是可行的,但用户握持设备的方式可能造成计数值在门限附近波动,导致屏幕错误地打开或关闭。
解决问题的一种方法是在软件中设置滞回。例如,如果计数值达到150次(假设接近检测传感器工作于8位模式)或以上时,控制触摸屏从“开”至“关”;那么,只有当计数值下降到135次或以下时,才控制触摸屏从“关”至“开”。此外,在一段时间保持这种电平的相关性非常有用,其作用相当于一个低通滤波器,可以降低噪声引起的误操作。
MAX44000的内部寄存器支持这种方法:
REGISTER B7 B6 B5 B4 B3 B2 B1 B0 REGISTER
ADDRESS
POWER-
ON
RESET STATE
R/W
Threshold Persist Timer   PRXPST[1:0] ALSPST[1:0] 0x0A 0x00 R/W
PROX Threshold—High Byte   ABOVE PRXTHR[13:8] 0x0B 0x00 R/W
PROX Threshold—Low Byte PRXTHR[7:0] 0x0C 0x00 R/W
如果已经使能中断(对于接近检测和ALS,寄存器0x01,1:0位),这些寄存器可以设置芯片使其无需通过I²C不断轮询传感器。如上所述,可利用寄存器0x0A的第2位和第3位设置中断之前的延迟。延迟可以是通过门限后的1、4、8或16个连续采样。寄存器0x0B和0x0C设置门限,以及触发中断的计数值为高于门限的数值还是低于门限的数值。
附录提供了增加滞回以及中断的例程。通过I²C总线进行读、写操作时,应注意器件在多次读/写操作时不会自动递增寄存器地址,而是由软件手动实现,尽管这种方式比较繁琐。读取I²C兼容器件的多个寄存器数据时,需要谨慎操作,以免发生错误。详细信息请参阅应用笔记5033:“严谨至上(通过I²C接口读取ADC数据)”。

附录A:门限滞回例程

#define MAX44000_ADDR	0x94
#define INT_STATUS_REG	0x00
#define OFF_THRESHOLD	4600
#define OFF_DELAY		1
#define ON_THRESHOLD	4000
#define ON_DELAY		3

uint8 screenStatus;	// 0 means off, 1 means on

/*
  i2cWriteBytes()
  
  Arguments:
	uint8 address - device address
	uint8 start_reg - register where the first byte is written
	uint8 *data - data to write
	uint8 nbytes - number of bytes to write

  Consecutively writes several bytes to some i2c device starting at some 
  specified address -- implemented elsewhere
*/
void i2cWriteBytes(uint8 address,uint8 start_reg,uint8 *data,uint8 nbytes);

/*
  MAX44000InterruptHandler()
以下代码用于实现MAX44000 INT引脚的中断处理,假设MAX44000的接近检测传感器设置为14位模式,并已使能中断。此外,假设屏幕状态初始化为1或0,详细信息请参阅数据资料的寄存器说明部分。
*/
void MAX44000InterruptHandler() {

	uint8 i2cData[3];
	
	i2cRead1Byte(MAX44000_ADDR,INT_STATUS_REG,&i2cData);
	if (i2cData&0x01 != 0)
		return;	// check to make sure interrupt really fired
				// this simultaneously clears the interrupt flag
	
	if (screenStatus) {
		i2cData[0] = ON_DELAY;	
		i2cData[1] = ON_THRESHOLD >> 8 & 0xBF; // set ABOVE = 0
		i2cData[2] = ON_THRESHOLD & 0xFF;
	} else {
		i2cData[0] = OFF_DELAY;	 
		i2cData[1] = OFF_THRESHOLD >> 8 | 0x40; // set ABOVE = 1
		i2cData[2] = OFF_THRESHOLD & 0xFF;
	} // set the new threshold depending on what the screen status was
	
	// set the delay and threshold after each interrupt
	i2cWriteBytes(MAX44000_ADDR,0x0A,i2cData,3);
	
	return;
} // MAX44000InterruptHandler