3 软件实现
本章描述了触摸感应RC原理的实现。
3.1 充电时间测量原理
为了保证健壮的电容触摸感应的应用,充电时间的测量需要足够的精确。
采用一个简单的定时器(无需IC功能)和一系列简单的软件操作,即定时地检查感应I/O端口上的电压是否达到阀值。这样的话,时间测量的精确度就取决于执行一次完整软件查询需要的CPU周期数。这种测量方**由于多次测量带来一些抖动,但是由于没有硬件限制,这种方法适用于需要很多电极的场合。
基本测量
使用普通定时器进行充电时间的测量。对电容充电开始之前,定时器的计数器数值被记录下来。当采样I/O端口上的电压达到某个阀值( )时,再次记录定时器计数器的值。二者之差就是 充电或者放电的时间。
图5 定时器计数器值
过采样
过采样的目的是以CPU时钟的精度,对输入电压达到高电平和低电平( 和 )的时间测量。 为了跨越所有的取值范围,每次测量都比上一次测量延迟一个CPU时钟周期的时间。 为了跨越所有的取值范围,测量的次数是和MCU核相关的。图6说明了这个概念的应用情况。
图6 输入电压测量
输入电压测量的原理
为了提高在电压和温度变动情况下的稳定性,对电极会进行连续两次的测量:第一次测量对电容的充电时间,直到输入电压升至 。第二次测量电容的放电时间,直到输入电压降至 。下图以及以下的表格详细说明了对感应电极(感应I/O)和负载I/O引脚上的操作流程。
图7 电容充放电时间测量
表2 电容充放电测量步骤
步骤 描述
1 1. 负载I/O引脚设置成输出模式,输出VDD
2. 感应I/O引脚设置成输出模式,输出VDD
3. 保存定时器计数器的初始值(vih_start)
2 感应I/O设置成输入高阻模式
于是电极电容 开始充电
3 当感应I/O引脚上的电压达到 :
1. 保存定时器计数器的值(vih_stop),并由此计算达到高电平 的时间(vih_stop – vih_start),并保存
2. 感应I/O引脚设置成输出模式,输出VDD
3. 负载I/O引脚设置成输出模式,输出到地
4. 保存定时器计数器的初值(vil_start)
4 感应I/O引脚设置成输入高阻模式 于是电极电容 开始放电
5 当感应I/O引脚上的电压降至 :
1. 保存定时器计数器的值(vil_stop),并由此计算降到低电平 的时间(vil_stop – vil_start),并保存
2. 将两次测量值“vih_meas”和“vil_meas”相加并保存
3. 重复步骤1的操作
触摸的效果
电极的电容值( )取决于以下几个主要因素:电极的形状、大小,触摸感应控制器到电极之间的 布线(尤其是地耦合),以及介电面板的材料和厚度。因此,RC充放电时间直接和 有关。图8说明了这种“触摸的效果”。 时间<t1’>(即达到了 电平的时刻)比<t1>长;同样对于降至 电平的时间<t2’>也比<t2>长。
图8 触摸效果实例
多次测量以及高频噪声的去除
为了提高测量的精确度,并去除高频噪声,有必要对 和 进行多次的测量,然后再决定是否有按键被有效“触摸”。
图9 测量的种类
注意: 下图说明了去除噪声的实例。如果测量次数(N)设置为4,那么对一个电极的完整测量将包括4次正确的“连续组测量”(BGs)。
这些实例展示了不同噪声影响下的测量。绿色线条表示正确的 / 测量;而红色线条表示不正确的 / 测量。
图10 显示了没有噪声的影响,所有测量都有效的情况。 这个例子中,每个连续组测量中的测量都有效,使得一个完整的测量很快就可以完成。
图10 实例1
图11 显示了有一些噪声使得某些测量无效的情况(即r1和r2)。 在这个例子中,连续组测量BG3重复了好几次,直到其中的所有测量都有效,该次组测量才算通过。这样就需要较多的时间来完成一次完整的测量。
图11 实例2
图12 显示了有很多噪声,使得无效的组测量次数达到了最大限制 (比如20)。这样的话,整个电极测量都无效。 这个例子中,达到了无效的组测量次数的最大限制,因此停止对该电极的测量。
图12 实例3
|