imuncle / imuncle.github.io

大叔的个人小站
https://imuncle.github.io/
82 stars 17 forks source link

触控传感器MPR121的简单使用 #79

Open imuncle opened 5 years ago

imuncle commented 5 years ago

学校立项用到了导电银墨水,在网上浏览的时候看到一个很有意思的产品:Electric Paint Lamp Kit - paint, plug and play!

这个小实例里通过检测是否被触碰来控制灯的亮灭,以实现开关的效果。经过进一步查阅,原来这其中使用到了MPR121这款触控传感器。

原理

MPR121通过检测电容的变化来判断是否被触控,可以手动设置touch和release的电容阈值。

image

MPR121一共有12个通道可以检测触控。根据上图,每个通道有一个10位的ADC检测电压。

MPR121检测电容的方法是,对每一个通道进行充放电,根据充放电的时间、电流和峰值电压来计算电容值,其中充放电的时间和电流都可以通过寄存器配置。

image

假设充电电流为$I$,充电电压峰值为$V$,充电时间为$T$,那么电容为: $$C=\frac{Q}{V}=\frac{I×T}{V}$$

MPR121可以根据用户设置的电容阈值独立判断是否被触控,判断的逻辑如下:

image

它判断的是电容的变化量,这变化量是基于baseline计算的,同时,MPR121还支持三重过滤器Filter配置,使电容测量更准确稳定。

相关寄存器

image

我们可以直接从0x000x01两个寄存器获取每个通道的状态,0代表未触控,1代表触碰。

image

同时我们还可以从0x040x1B读取到每一个通道的数值。

image

初始化配置

这里可以参考开头提到的那个产品的开发者编写的arduino库,当中的初始化代码在下面这个链接: MPR121 Arduino初始化代码

上面代码中对应的寄存器地址见如下地址: MPR121寄存器地址

对应的寄存器赋值见如下地址: MPR121初始化寄存器赋值

数据手册

我把MPR121的datasheet上传到了百度云盘: 百度云盘链接