文章目录:
写在前面:MPR121的自动参数搜索功能不能帮你搜索到所有的参数,它只能帮你搜索到对电极的最优充电时间和充电电流。不过不要难过!在MPR系列上一个版本,用户必须手动指定这些参数,过程非常麻烦!这个功能已经帮我们省去了非常大一部分的工作了!而且我们也不希望自动搜索与滤波相关的参数,因为那些参数直接关系到系统对于触摸的响应时间。
如果你还没有阅读过这个文章系列的第一部分,我强烈建议你阅读后再来阅读这个部分。
本部分的参考资料: “AN3889 MPR121 Capacitance Sensing Settings”
概要
我们之前说道,MPR121检测电容的方式,是对一个电极使用一定的电流经过一段时间的充电之后,去测量这个电极的电压。那么我们怎么知道应该用多大的电流和多长的时间去充电呢?
简单来说的话,MPR121通过一个算法1,自动搜索充电的电流和时间,使得经过这么长时间后的电极测量电压等于$\frac{V_{D D}-0.7}{V_{D D}} * 0.9$,这样当用户触摸的时候,电压的下降空间还很大,这个时候系统的灵敏度也是最大的2。这个值是TL(目标电平),另外两个值是LSL(下限,$\frac{V_{D D}-0.7}{V_{D D}} * 0.65$)和USL(上限,$\frac{V_{D D}-0.7}{V_{D D}}$),分别指定搜索的上限和下限。我的个人理解是这个算法会搜索出来一个尽量接近TL的值,但是如果实在找不到的话,某一个介于LSL和USL之间的值也是可以接受的。至于为什么是$\frac{V_{D D}-0.7}{V_{D D}}$而不是直接是$V_{D D}$,那是因为手册中指明用于测量电压的ADC(模拟数字转换器)在$0.7$伏和$V_{D D}-0.7$之间测量的数值才是有意义的3。
实际的TL,LSL和USL都是0-255之间的一个8bit整数,计算方式如下:
$$TL = \frac{V_{D D}-0.7}{V_{D D}} * 255 * 0.9$$
$$USL = \frac{V_{D D}-0.7}{V_{D D}} * 255$$
$$LSL = \frac{V_{D D}-0.7}{V_{D D}} * 255 * 0.65$$
需要注意的是,ADC测量出来的数值是一个10bit的值(0-1023),这个值与电极实际电压成正比。假设电极实际电压为$V_r$,那么ADC测量出的值是$\frac{V_r}{V_{D D}}*1024$。这个值就是之后送入两级过滤器,并作为触摸判断依据的值。
参数
在介绍参数之前,我们先建立一些这个文章系列通用的知识。我们使用的库是Adafruit官方提供的MPR121库。我们在介绍参数的时候会使用这个库中的寄存器命名方式,如果你想要自己开发库的话,请参考这个库的源代码以获取寄存器地址。
为了开启自动搜索功能,你需要调整下面这些参数为指定的值4:
MPR121_AUTOCONFIG0 0b00001011
MPR121_AUTOCONFIG1 0b00000000
MPR121_UPLIMIT 202
MPR121_LOWLIMIT 131
MPR121_TARGETLIMIT 182
MPR121_AUTOCONFIG0 (0x7B5)
这是控制自动搜索功能的第一个寄存器,其结构如下6:
FFI 是第一级滤波器的平均样本数,MPR121中有两处需要设置这个值,这两处的值需要相等。这个值具体的作用我们会在下一个部分讲解。
RETRY 是自动搜索功能失败后的重试次数,MPR121的手册指出在实际使用时这个值是没有必要的7,所以我们设置为0。
BVA 这个值控制基线初始化的值,MPR121中有两处需要设置这个值,这两处的值需要相等。这个值具体的作用我们会在第四部分讲解。我们推荐的值是0b10
ACE 控制自动搜索功能的开关,1是开。
ARE 控制自动搜索失败后是否重试,虽然我们设置不重试,但是姑且还是设置成1。
MPR121_AUTOCONFIG1 (0x7C)
这是控制自动搜索功能的第二个寄存器,其结构如下:
SCTS 控制是否跳过单独搜索每一个电极的充电时间和充电电流。由于每个电极的形状、大小有可能不一样,我们不跳过8,设置为0。
D6-D3 未使用,所以我们都设置为0就行。
OORIE, ARFIE, ACFIE 控制是否在自动搜索失败的情况下发送中断信号。由于我们假设不会失败,所以都设置为0。
MPR121_UPLIMIT (0x7D), MPR121_LOWLIMIT (0x7E), MPR121_TARGETLIMIT (0x7F)
这三个寄存器是自动搜索时使用的参数,如果读者使用3.3V的电压系统,那么设置上面说的那些值就可以了。如果使用的其他电压系统的话,也可以使用上一个小节给出的计算公式计算得到。
这些参数已经是最优的参数,用户在优化的时候不应该调整这一组参数。
脚注
- 算法的具体内容手册里面没有详细解释,上面解释的是我的个人理解。如果有错误请欢迎指正。 ↩︎
- 参考 AN3889 第7页 – “the sensitivity of the sensor is maximized by having the baseline be as high as possible for a specific baseline capacitance” ↩︎
- 参考 AN3889 第3页 – “The valid operating range of the electrode charging source is 0.7 V to (VDD – 0.7 V)” ↩︎
- 0bxxx这种表示方法表示一个二进制数,比如0b101对应的十进制值是5。本文章系列会用这种形式表示二进制数。 ↩︎
- 这是寄存器的地址,也就是这个常数的值。如果你直接使用adafruit的库的话,这个地址的值可以不用了解。 ↩︎
- 如果读者不清楚该示意图是什么意思的话,我在这里解释一下。就拿这个MPR121_AUTOCONFIG0寄存器作为例子。这个寄存器是一个8bit的寄存器。这个表格中的D7和D6指的是这个寄存器的最高两位,这两位控制了FFI的值,也就是0b00001011中下标的这两位。D5和D4这两位控制RETRY的值,也就是0b00001011中下标的这两位。 ↩︎
- 参考 AN3889 第9页 – “The RETRY is disabled because in production systems, this will not be required.” 我的个人理解是,RETRY是在调试的时候,测试其他的auto-config参数使用的,如果其他参数已经调整正确,那么搜索不太可能失败,我们也不需要重试。 ↩︎
- 参考 MPR121 Datasheet 第15页 – “If the electrode pattern, size, or even overlay and base material type changes from one channel to another, then using individual CDCx (and CDTx) will have a better result …” ↩︎
最后一段标题,MPR121_TARGETLIMIT 和MPR121_LOWLIMIT 的地址写反了
https://www.nxp.com/docs/en/data-sheet/MPR121.pdf,P18
确实,已修改。