ESP32S3自带电容触摸引脚的代码比较简单,配置代码放在这文章方便以后直接copy。这个电容引脚作用是测试一些功能时可以替代外置的物理按键电路,人手控制一些代码的开关。我用ESP-IDF环境编译。
一、结构原理和一些重要函数API
1.1 引脚和结构
可以设置为Touch的引脚为GPIO1~14。
电容触摸模块是物理硬件,乐鑫已经给我们做好,放在CPU外面。右边的图是硬件FSM(有限状态机),作为Touch模块的核心控制器,我们就是对这个东西进行配置控制即可,有限状态机详细原理不用了解。其他denoise unit、filter unit、scan_ctrl等硬件也可以灵活选择或不用管。
T0引脚不能对外使用,没有引脚焊盘。T0作用是作为空白对照组,理论上影响T0引脚的噪声因素如温度也会影响其他引脚,所以Touch模块的降噪算法就是减去T0感知到的噪声。
1.2 采样测量原理和测量值
FSM设备会释放标准的三角波给引脚电容,相当于给电容进行周期性的充放电。FSM控制开始充放电,同时FSM内部的脉冲计数器和时间计数器启动,测量完成N次充放电的任务需要多少us时间。充电时要让电压升到指定阈值才算测量成功,而人手触摸引脚会导致电容增大,充电时间变长。一次测量任务持续时间应小于1ms。
读数的返回结果就是时间值,即:耗时多长完成N次充放电。
因此,读出来的raw value越大反映了充电时间较长,人手接触面积越大,读数值越大。官方的其他API给我们配置的就是各种能影响采样时长的参数,比如电压上下限(电容充到多高的电压(DREFH)算是完成充电,放到多低的电压(DREFL)算是完成放电)、斜率控制(充电电流的大小(slope)也能影响采样时间)、采样次数(charge_discharge_times)。这些杂项我们可以不用配置,下文1.3会简单提及。
1.3 其他功能函数API的简单介绍
(1)滤波
滤波分为denoise和filter两种方式。
denoise就是依靠T0悬空引脚测量的干扰值来指示全局干扰的情况,相当于空白对照组来排除共模干扰,代码中任何情形都推荐使用此功能。由于这是硬件,需要配置set_config()、enable()的代码进行启动。后面还会重点讲这个,因为esp官方讲得很少。
filter是IIR滤波器,也是物理滤波,滤去高频噪声,用数学公式平滑数据。这个滤波会涉及后面读数API中的smooth()和benchmark()读数。smooth()读数是一系列经过IIR滤波的移动平均数值。benchmark()数值是从启动至今的平均值,移动平均的窗口比smooth数值更长,几乎不受单次的触摸测量值的影响。
本质上这两个读数跟raw_value没什么区别。
(2)FSM的启用模式
FSM想象成三角波发生器,有两种启用方式,timer定时启用,或者软件启用测量。